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

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

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

それとも、C++&SDKのプログラミングでは定石なんでしょうか?



2 名前: デフォルトの名無しさん 投稿日: 2001/03/31(土) 21:23
他に方法があれば、それを使えば?
----------- exit(-1); -----------


3 名前: デフォルトの名無しさん 投稿日: 2001/03/31(土) 21:37
DelphiVCLのソース見ると、ちと異なる方法&asmで高速化してるっぽい。
さすがに、コピペはまずいかな・・・。


4 名前: デフォルトの名無しさん 投稿日: 2001/03/31(土) 21:55
グローバルリソースを作りたくないなら、
SetWindowLongかSetPropしかないだろ。



5 名前: デフォルトの名無しさん 投稿日: 2001/03/31(土) 21:56
なんでGetWindowLong使うと遅いんだ?
そのオーバーヘッドがボトルネックになるほどメッセージが頻繁に飛んでくるのか?


6 名前: SAGE 投稿日: 2001/03/31(土) 22:13
他に手があるなら知りたいぞ。
1窓 - 1クラスにしてstaticなメンバに唯一のオブジェクトを保持しとくとか?(w

というわけでVCLのやり方解説きぼ〜ん。>>3


7 名前: デフォルトの名無しさん 投稿日: 2001/03/31(土) 22:19
そこは戦場でした。


8 名前: デフォルトの名無しさん 投稿日: 2001/03/31(土) 23:43
MFCのHANDLEマップ。


9 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 00:16
MFCではスレッド毎にハッシュテーブルを持って
管理しているみたいだよ。
他の人に使ってもらうクラスライブラリを作る
ならSetWindowLongは使えないからね。

MFCのソースが見れるなら、CWnd::Attach
あたりから見ていくと参考になるかも。

MFCは糞って人だったら失礼


10 名前: >1 投稿日: 2001/04/01(日) 00:29
SetWindowLongのUSERDATA残しておきたきゃ専用のウィンドウクラスを登録しろ。
既存のウィンドウに対してはクラスを持ってきて自分用のクラスにコピーすればスーパークラス化(だっけ?)できる。
酔っ払ってるのでいってることつたわんなかったらごめんよ


11 名前: かい 投稿日: 2001/04/01(日) 00:46
>>5
マウスポインタがウィンドウ上にあって動いたりすると超たくさん送られるよ<メッセージ
VC++についてるSpy++で見るとわかる



12 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 01:06
>かい
きっと、間違えてもう一つスレたてたんだよね!? ボクはそう信じてるよ。。。

>>11のかい
送られてくるよ。でもスピード面ではSetWindowLongで大丈夫だよ!
MFCは知らんが、BCはSetWindowLong使っていたハズだよ。
少なくともSetPropよりは高速だよ。

あとは9,10の問題もあるから自分で判断したら〜〜〜

あと補足。もしSetWindowLong使うなら、GWL_USERDATAは使っちゃ
いけないハズだよ、確か。
で、その代わりにユーザー情報をWindowに対応づけるには

SetWindowLong( hwnd, 0, pUserData );

じゃなかったかな。ただし,この時はクラスを登録する時の構造体
WNDCALSSEXのユーザー情報サイズに(ポインタだから4)と指定して
ね。

どっちにしろ、もう一度ドキュメントみてみてみてみて。


13 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 01:16
>>12
便乗質問

>あと補足。もしSetWindowLong使うなら、GWL_USERDATAは使っちゃいけないハズだよ、確か。

ぉ?なにゆえなんでしょう?


14 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 02:24
いや「GWL_USERDATA定数は将来のために予約」って、MSDNライブ
ラリに書いてあった記憶が。。。
というのも、つい最近同じくWindow毎にデータを保持したい事が
あって、SetWindowsLongを調べたのれす。あれ、記憶違い!?
そっちのドキュメントにはそんな事書いてない!?


15 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 04:03
私の場合ですが、例えばCOMMANDパターン使うなら、メッセージ
イベントは適当なオブジェクトで直接扱いたくないですか?

そういう意味で、この板で教わったmap使う方法は凄い役に
立ってます。状態も把握しといてメッセージ振り分けんの。

テンプレート使えばそんなに登録も面倒じゃないし、
ソース見るだけでメッセージの帰属が一目瞭然なとこもお気に入り

(うーん、私も酔いが抜けない)


16 名前: 15 投稿日: 2001/04/01(日) 04:10
いけね、「各ウィンドウごとに」か。
すまねぇ、さっきのは忘れてくれいヽ( ´ー`)ノ

GetWindowLongがいやならGetWindowWordでも使うのだ(w


17 名前: >15 投稿日: 2001/04/01(日) 04:10
STLのmapは二分木なので速度を考慮するなら内部実装をhashのにしときなさい。(普通のSTLには無いけど)
イベント大量に登録する様な場合は速度の差はあんまりないと思うけどね。


18 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 04:16
>>14
GWL_USERDATA

GWL_USERDATA ウィンドウに関連付けられている 32 ビット値を書き換えます。各ウィンドウは、それに対応する 32 ビット値を持っています。この値は、ウィンドウを作成したアプリケーションが自由に使用できるもので、0 で初期化されています。


19 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 05:00
機械語でもいいならサンクが一番じゃないかな。
どっかにサンクつかったソースがあったと思うんだけどだいぶ昔の話だから覚えてない。
ATLがサンクつかってるから参考にしてみては。

(VC持ってない人は↓へ、atlwin.h atlwin.cppにあるCWndProcThunkクラスがサンク)
http://msdn.microsoft.com/visualc/downloads/atl/default.asp


20 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 05:05
>>17
ありがたや、ありがたや、いい板だなここ


21 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 05:48
>>19
>どっかにサンクつかったソースが
http://mentai.2ch.net/prog/kako/957/957341074.html
ここの79番かな


22 名前: 3 投稿日: 2001/04/01(日) 07:28
VCLで使ってる方法の解説発見ヽ( ´ー`)ノ
http://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-1.htm#3-1-4


23 名前: 3 投稿日: 2001/04/01(日) 07:30
ああ。21のリンク先にサンク方式って書いてあるじゃん(;´д`)


24 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 10:34
>>21
俺はハッシュテーブルで組んだなぁ。
というか、作った頃そんなにWindows精通してなかったから、
確実に動く方法として選んだんだけどね。
でも、サンク方式の方が効率良さそうだよね。
うーん、昔作ったの書き直そうかな。。。



25 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 10:37
>>15
>>17
それ、多分、オレが書いた奴だが。
あの時hashmap使えって書かなかったか?

それから、mapって内部B木だと思ったんだが。
通常のアプリではメッセージ数千とか登録しないだろうから普通のmap
でもボトルネックになることはほぼありえない。


26 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 11:16
あのさー、なんで32bitのウインドウハンドルごときで
ハッシュが必要なの?


27 名前: デフォルトの名無しさん 投稿日: 2001/04/01(日) 16:43
>>26
あのさー、何で32bitのウインドウハンドルで
ハッシュを使っちゃいけないの?

わざわざ自分で組むなら考え物だけど、
出来合いのものを使うんだから問題ねーだろ?


28 名前: 15 投稿日: 2001/04/02(月) 02:40
>>25
あー、大丈夫です。もちろん覚えてます。むしろあの時のこと思い出してました。
あの時も後からhash使えよって指摘して貰ったんですよね。今回も後から
ちゃんとフォローが入ったので、…で、いい板だなと。

やねうらをが嫌いなこともよく覚えてます(笑。しかし広いようで狭いな>2ch


29 名前: 14 投稿日: 2001/04/02(月) 13:20
>あと補足。もしSetWindowLong使うなら、GWL_USERDATAは使っちゃいけない
>ハズだよ、確か。

すみません。ドキュメント見直したらそんな事書いていませんでした。
お詫びいたします。本筋とは離れているのでsageます。



30 名前: デフォルトの名無しさん 投稿日: 2001/04/05(木) 23:02
>>15 (>>27)
>そういう意味で、この板で教わったmap使う方法は

それってどういうやり方ですか?
教えてください。
過去ログでも残ってたらそれでもありがたいです。
(2chってでかすぎて過去ログ探しても見つからないよ〜)


31 名前: 15 投稿日: 2001/04/06(金) 01:41
>>30 はいよー
http://piza.2ch.net/test/read.cgi?bbs=tech&key=981630730&st=134

詳しいことは私より、教えて下さった方々に訊いた方がいいと思います


32 名前: デフォルトの名無しさん 投稿日: 2001/05/09(水) 05:16
話題は終わってるけど役に立ったんでage!