Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Q:VC++5.0] ダイアログアイテムには、 WM_CREATEが発生しない?

0 views
Skip to first unread message

Tetsuya Miyawaki

unread,
Oct 29, 1998, 3:00:00 AM10/29/98
to
宮脇@リムネット千葉です。

# 質問ばかりで申し訳ないです。

クラスウィザード - 変数の追加で、ダイアログアイテムに
コントロール(CListCtrl等の派生クラス)を割り当てたとします。

この派生したクラスで、OnCreate (WM_CREATE) を定義しても
この関数はコールされませんでした。

私としては、コントロール(ウィンドウ)が作成されたときに、
いろいろと初期化処理を行い、破棄されたときに
終了処理をしたいのですが、そのタイミングがわかりません。
(破棄されるときは、WM_DESTROYが発生するのでOK!)

で、今は別に初期化用のメンバ関数を用意して、親ダイアログの
OnInitDialog()で、その初期化関数を呼んでいます。
でも、これは美しくないような気がします。

もっとエレガントな実装方法をご存知でしたら、どうかご教授ください。
よろしくお願いします。

以上です。

Yoshio Kiya

unread,
Oct 30, 1998, 3:00:00 AM10/30/98
to
 こんにちは、木屋と申します。

 コントロールの派生クラスに、PreSubclassWindow() をインプリ
メントすれば良いと思います。

Tetsuya Miyawaki wrote in message <719vsv$kah$5...@news.cc.rim.or.jp>...


>クラスウィザード - 変数の追加で、ダイアログアイテムに
>コントロール(CListCtrl等の派生クラス)を割り当てたとします。
>
>この派生したクラスで、OnCreate (WM_CREATE) を定義しても
>この関数はコールされませんでした。

 コントロールの派生クラスは、コントロールをサブクラス化して
メッセージが自分に送られてくるようにしているのだと思います。

 で、構築の順序からいくと、ダイアログが作成され、コントロー
ルが作成され、コントロールをサブクラス化してコントロールの派
生クラスに割り当てるので、WM_CREATE がこないのだと思います。

>で、今は別に初期化用のメンバ関数を用意して、親ダイアログの
>OnInitDialog()で、その初期化関数を呼んでいます。
>でも、これは美しくないような気がします。

 OnInitialDialog() は、ダイアログボックスが表示される直前に
呼び出されるので、DoModal() を連続で呼び出した場合等、その都
度呼ばれるようです。なので、コントロールの初期化などをする場
合には注意が必要だと思います。

 答えになっていないかもしれません。また、間違っているかもし
れません。間違いがありましたらどなたかフォローよろしくお願い
します。

=== 7M3MCZ 木屋 善夫 6mSSB 430SSB ki...@asahi.email.ne.jp ===


Tetsuya Miyawaki

unread,
Nov 1, 1998, 3:00:00 AM11/1/98
to
宮脇@リムネット千葉です。

Yoshio Kiya wrote in message <71b4r5$117$2...@father.asahi-net.or.jp>...

> コントロールの派生クラスに、PreSubclassWindow() をインプリ
>メントすれば良いと思います。


ありがとうございました。
サブクラス化されるタイミングでも仕様的に問題ないので、
PreSubclassWindow() と OnDestroy() でウィンドウの初期化及び後処理
を実装することにしました。


> コントロールの派生クラスは、コントロールをサブクラス化して
>メッセージが自分に送られてくるようにしているのだと思います。
> (途中省略)
>生クラスに割り当てるので、WM_CREATE がこないのだと思います。


確かにそうですね。ウィンドウが作成されていなければ、サブクラスうんぬん
以前の問題ですからね・・・お恥ずかしい・・・


> OnInitialDialog() は、ダイアログボックスが表示される直前に
>呼び出されるので、DoModal() を連続で呼び出した場合等、その都
>度呼ばれるようです。なので、コントロールの初期化などをする場
>合には注意が必要だと思います。


この点については、ダイアログが作られる度に初期化ルーチンが
走ってもらわないと困るのでOKです。
(当然クラス全般の初期化はコンストラクタで実装しています。)

# あっ、初期化って言葉がまずかったのかな・・・
# 本当は、ウィンドウのリサイズ処理とかです。(^^;;;

以上 本当にありがとうございました。

0 new messages