オブジェクト指向のWin32SDKプログラミング
■ このスレッドは過去ログ倉庫に格納されています
0001かい
NGNGそれぞれのウィンドウにメッセージを分配する方法ですが、
ウィンドウを作成したときに(CreateWindowの戻り値に対して)
そのクラスのインスタンスへのポインタをGWL_USERDATAでSetWindowLongしておき、
そのあと共通の(グローバルの)ハンドラでメッセージ処理する時、
GetWindowLongでウィンドウクラスのオブジェクトへのポインタを取得し、
そのポインタに対してハンドラを呼び出す。
というやり方を2つほど(sakura editor, Tick Tack Libraryのソースコード)
見たことがあるのですが、全メッセージに対していちいちGetWindowLongは
速度的に効率が悪そうに見えるのですがどうなんでしょうか?
また、この方法だとWM_CREATEをクラス内で処理できず、グローバルのハンドラの中に
子ウィンドウの作成処理が入って気持ち悪いというのもあります。
それとも、C++&SDKのプログラミングでは定石なんでしょうか?
0002>1
NGNG0003かい
NGNG0004しらかわよふね
NGNG0005かい
NGNG恥の上塗り…
0006しらかわよふね
NGNG同じ内容のスレをいくつも立てりゃ、そりゃ怒られるわな(^^;
0007>1
NGNG0008デフォルトの名無しさん
NGNG1.ウインドウメッセージを流したいクラスポインタを保存する
2.CreateWindowを発行する
3.ウインドウプロシージャ(ハンドラ)でWM_NCCREATEを関知したら
保存していたクラスポインタとウインドウハンドルをセット
にして配列へ保存する。
4.クラスポインタよりクラスのメッセージ処理用メソッドに
WM_NCCREATEメッセージを処理させる。
□ウインドウメッセージの処理
1.ウインドウハンドルより配列の中のクラスポインタを取得する。
2.クラスポインタよりクラスのメッセージ処理用メソッドにメッセージを処理させる。
□ウインドウメッセージの破棄
1.ウインドウハンドルより配列の中のクラスポインタを取得する。
2.クラスポインタよりクラスのメッセージ処理用メソッドにメッセージを処理させる。
3.メッセージがWM_NCDESTROYであれば配列より削除する。
解るとは思うけど、CreateWindow()関数前後と配列捜査時に
排他制御しなきゃだめだよ。
あと、ウインドウが増えると死ぬほど遅いよ(藁
0009>8
NGNGスレッドのことちっとも考えてない様に見えるんだが・・
00108
NGNGだから配列操作時に排他制御しなきゃだめって書いたんだけど・・・
説明の流れから排他制御を割愛したのは簡潔で解りやすくするため。
0012かい(1)
NGNG0013デフォルトの名無しさん
NGNGに吸収されました
--------------------- 終了 ------------------
■ このスレッドは過去ログ倉庫に格納されています