トップページtech
13コメント4KB

オブジェクト指向のWin32SDKプログラミング

■ このスレッドは過去ログ倉庫に格納されています
0001かいNGNG
C++で、各ウィンドウをクラスのオブジェクトとして扱うときに(MFCは使ってません)
それぞれのウィンドウにメッセージを分配する方法ですが、

ウィンドウを作成したときに(CreateWindowの戻り値に対して)
そのクラスのインスタンスへのポインタをGWL_USERDATAでSetWindowLongしておき、
そのあと共通の(グローバルの)ハンドラでメッセージ処理する時、
GetWindowLongでウィンドウクラスのオブジェクトへのポインタを取得し、
そのポインタに対してハンドラを呼び出す。

というやり方を2つほど(sakura editor, Tick Tack Libraryのソースコード)
見たことがあるのですが、全メッセージに対していちいちGetWindowLongは
速度的に効率が悪そうに見えるのですがどうなんでしょうか?

また、この方法だとWM_CREATEをクラス内で処理できず、グローバルのハンドラの中に
子ウィンドウの作成処理が入って気持ち悪いというのもあります。
それとも、C++&SDKのプログラミングでは定石なんでしょうか?
0002>1NGNG
死んでくれ
0003かいNGNG
ごめんなさい!
0004しらかわよふねNGNG
話の延長きぼん
0005かいNGNG
こうしないといけないのか…
恥の上塗り…
0006しらかわよふねNGNG
ありゃ?なんか同内容スレがあるじゃん。
同じ内容のスレをいくつも立てりゃ、そりゃ怒られるわな(^^;
0007>1NGNG
この酔っ払いが!
0008デフォルトの名無しさんNGNG
□ウインドウの作成時
1.ウインドウメッセージを流したいクラスポインタを保存する
2.CreateWindowを発行する
3.ウインドウプロシージャ(ハンドラ)でWM_NCCREATEを関知したら
  保存していたクラスポインタとウインドウハンドルをセット
  にして配列へ保存する。
4.クラスポインタよりクラスのメッセージ処理用メソッドに
  WM_NCCREATEメッセージを処理させる。
□ウインドウメッセージの処理
1.ウインドウハンドルより配列の中のクラスポインタを取得する。
2.クラスポインタよりクラスのメッセージ処理用メソッドにメッセージを処理させる。
□ウインドウメッセージの破棄
1.ウインドウハンドルより配列の中のクラスポインタを取得する。
2.クラスポインタよりクラスのメッセージ処理用メソッドにメッセージを処理させる。
3.メッセージがWM_NCDESTROYであれば配列より削除する。

解るとは思うけど、CreateWindow()関数前後と配列捜査時に
排他制御しなきゃだめだよ。
あと、ウインドウが増えると死ぬほど遅いよ(藁
0009>8NGNG
1.と3.の保存ってどこにするの?
スレッドのことちっとも考えてない様に見えるんだが・・
00108NGNG
>>9
だから配列操作時に排他制御しなきゃだめって書いたんだけど・・・
説明の流れから排他制御を割愛したのは簡潔で解りやすくするため。
00111って最悪NGNG
http://teri.2ch.net/test/read.cgi?bbs=saku&key=986053224
0012かい(1)NGNG
まじでごめんなさい。
0013デフォルトの名無しさんNGNG
http://piza.2ch.net/test/read.cgi?bbs=tech&key=986040804

に吸収されました

--------------------- 終了 ------------------
■ このスレッドは過去ログ倉庫に格納されています