■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
オブジェクト指向のWin32SDKプログラミング
1 名前: かい 投稿日: 2001/04/01(日) 00:29
C++で、各ウィンドウをクラスのオブジェクトとして扱うときに(MFCは使ってません)
それぞれのウィンドウにメッセージを分配する方法ですが、

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

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

また、この方法だとWM_CREATEをクラス内で処理できず、グローバルのハンドラの中に
子ウィンドウの作成処理が入って気持ち悪いというのもあります。
それとも、C++&SDKのプログラミングでは定石なんでしょうか?



2 名前: >1 投稿日: 2001/04/01(日) 00:31
死んでくれ


3 名前: かい 投稿日: 2001/04/01(日) 00:41
ごめんなさい!



4 名前: しらかわよふね 投稿日: 2001/04/01(日) 00:41
話の延長きぼん


5 名前: かい 投稿日: 2001/04/01(日) 00:41
こうしないといけないのか…
恥の上塗り…


6 名前: しらかわよふね 投稿日: 2001/04/01(日) 00:46
ありゃ?なんか同内容スレがあるじゃん。
同じ内容のスレをいくつも立てりゃ、そりゃ怒られるわな(^^;


7 名前: >1 投稿日: 2001/04/01(日) 00:51
この酔っ払いが!


8 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 00:54
□ウインドウの作成時
1.ウインドウメッセージを流したいクラスポインタを保存する
2.CreateWindowを発行する
3.ウインドウプロシージャ(ハンドラ)でWM_NCCREATEを関知したら
  保存していたクラスポインタとウインドウハンドルをセット
  にして配列へ保存する。
4.クラスポインタよりクラスのメッセージ処理用メソッドに
  WM_NCCREATEメッセージを処理させる。
□ウインドウメッセージの処理
1.ウインドウハンドルより配列の中のクラスポインタを取得する。
2.クラスポインタよりクラスのメッセージ処理用メソッドにメッセージを処理させる。
□ウインドウメッセージの破棄
1.ウインドウハンドルより配列の中のクラスポインタを取得する。
2.クラスポインタよりクラスのメッセージ処理用メソッドにメッセージを処理させる。
3.メッセージがWM_NCDESTROYであれば配列より削除する。

解るとは思うけど、CreateWindow()関数前後と配列捜査時に
排他制御しなきゃだめだよ。
あと、ウインドウが増えると死ぬほど遅いよ(藁


9 名前: >8 投稿日: 2001/04/01(日) 00:57
1.と3.の保存ってどこにするの?
スレッドのことちっとも考えてない様に見えるんだが・・


10 名前: 8 投稿日: 2001/04/01(日) 01:01
>>9
だから配列操作時に排他制御しなきゃだめって書いたんだけど・・・
説明の流れから排他制御を割愛したのは簡潔で解りやすくするため。


11 名前: 1って最悪 投稿日: 2001/04/01(日) 02:33
http://teri.2ch.net/test/read.cgi?bbs=saku&key=986053224


12 名前: かい(1) 投稿日: 2001/04/01(日) 02:48
まじでごめんなさい。



13 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 04:18
http://piza.2ch.net/test/read.cgi?bbs=tech&key=986040804

に吸収されました

--------------------- 終了 ------------------