トップページtech
32コメント12KB

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

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

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

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

それとも、C++&SDKのプログラミングでは定石なんでしょうか?
0002デフォルトの名無しさんNGNG
他に方法があれば、それを使えば?
----------- exit(-1); -----------
0003デフォルトの名無しさんNGNG
DelphiVCLのソース見ると、ちと異なる方法&asmで高速化してるっぽい。
さすがに、コピペはまずいかな・・・。
0004デフォルトの名無しさんNGNG
グローバルリソースを作りたくないなら、
SetWindowLongかSetPropしかないだろ。
0005デフォルトの名無しさんNGNG
なんでGetWindowLong使うと遅いんだ?
そのオーバーヘッドがボトルネックになるほどメッセージが頻繁に飛んでくるのか?
0006SAGENGNG
他に手があるなら知りたいぞ。
1窓 - 1クラスにしてstaticなメンバに唯一のオブジェクトを保持しとくとか?(w

というわけでVCLのやり方解説きぼ〜ん。>>3
0007デフォルトの名無しさんNGNG
そこは戦場でした。
0008デフォルトの名無しさんNGNG
MFCのHANDLEマップ。
0009デフォルトの名無しさんNGNG
MFCではスレッド毎にハッシュテーブルを持って
管理しているみたいだよ。
他の人に使ってもらうクラスライブラリを作る
ならSetWindowLongは使えないからね。

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

MFCは糞って人だったら失礼
0010>1NGNG
SetWindowLongのUSERDATA残しておきたきゃ専用のウィンドウクラスを登録しろ。
既存のウィンドウに対してはクラスを持ってきて自分用のクラスにコピーすればスーパークラス化(だっけ?)できる。
酔っ払ってるのでいってることつたわんなかったらごめんよ
0011かいNGNG
>>5
マウスポインタがウィンドウ上にあって動いたりすると超たくさん送られるよ<メッセージ
VC++についてるSpy++で見るとわかる
0012デフォルトの名無しさんNGNG
>かい
きっと、間違えてもう一つスレたてたんだよね!? ボクはそう信じてるよ。。。

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

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

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

SetWindowLong( hwnd, 0, pUserData );

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

どっちにしろ、もう一度ドキュメントみてみてみてみて。
0013デフォルトの名無しさんNGNG
>>12
便乗質問

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

ぉ?なにゆえなんでしょう?
0014デフォルトの名無しさんNGNG
いや「GWL_USERDATA定数は将来のために予約」って、MSDNライブ
ラリに書いてあった記憶が。。。
というのも、つい最近同じくWindow毎にデータを保持したい事が
あって、SetWindowsLongを調べたのれす。あれ、記憶違い!?
そっちのドキュメントにはそんな事書いてない!?
0015デフォルトの名無しさんNGNG
私の場合ですが、例えばCOMMANDパターン使うなら、メッセージ
イベントは適当なオブジェクトで直接扱いたくないですか?

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

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

(うーん、私も酔いが抜けない)
001615NGNG
いけね、「各ウィンドウごとに」か。
すまねぇ、さっきのは忘れてくれいヽ( ´ー`)ノ

GetWindowLongがいやならGetWindowWordでも使うのだ(w
0017>15NGNG
STLのmapは二分木なので速度を考慮するなら内部実装をhashのにしときなさい。(普通のSTLには無いけど)
イベント大量に登録する様な場合は速度の差はあんまりないと思うけどね。
0018デフォルトの名無しさんNGNG
>>14
GWL_USERDATA

GWL_USERDATA ウィンドウに関連付けられている 32 ビット値を書き換えます。各ウィンドウは、それに対応する 32 ビット値を持っています。この値は、ウィンドウを作成したアプリケーションが自由に使用できるもので、0 で初期化されています。
0019デフォルトの名無しさんNGNG
機械語でもいいならサンクが一番じゃないかな。
どっかにサンクつかったソースがあったと思うんだけどだいぶ昔の話だから覚えてない。
ATLがサンクつかってるから参考にしてみては。

(VC持ってない人は↓へ、atlwin.h atlwin.cppにあるCWndProcThunkクラスがサンク)
http://msdn.microsoft.com/visualc/downloads/atl/default.asp
0020デフォルトの名無しさんNGNG
>>17
ありがたや、ありがたや、いい板だなここ
0021デフォルトの名無しさんNGNG
>>19
>どっかにサンクつかったソースが
http://mentai.2ch.net/prog/kako/957/957341074.html
ここの79番かな
00223NGNG
VCLで使ってる方法の解説発見ヽ( ´ー`)ノ
http://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-1.htm#3-1-4
00233NGNG
ああ。21のリンク先にサンク方式って書いてあるじゃん(;´д`)
0024デフォルトの名無しさんNGNG
>>21
俺はハッシュテーブルで組んだなぁ。
というか、作った頃そんなにWindows精通してなかったから、
確実に動く方法として選んだんだけどね。
でも、サンク方式の方が効率良さそうだよね。
うーん、昔作ったの書き直そうかな。。。
0025デフォルトの名無しさんNGNG
>>15
>>17
それ、多分、オレが書いた奴だが。
あの時hashmap使えって書かなかったか?

それから、mapって内部B木だと思ったんだが。
通常のアプリではメッセージ数千とか登録しないだろうから普通のmap
でもボトルネックになることはほぼありえない。
0026デフォルトの名無しさんNGNG
あのさー、なんで32bitのウインドウハンドルごときで
ハッシュが必要なの?
0027デフォルトの名無しさんNGNG
>>26
あのさー、何で32bitのウインドウハンドルで
ハッシュを使っちゃいけないの?

わざわざ自分で組むなら考え物だけど、
出来合いのものを使うんだから問題ねーだろ?
002815NGNG
>>25
あー、大丈夫です。もちろん覚えてます。むしろあの時のこと思い出してました。
あの時も後からhash使えよって指摘して貰ったんですよね。今回も後から
ちゃんとフォローが入ったので、…で、いい板だなと。

やねうらをが嫌いなこともよく覚えてます(笑。しかし広いようで狭いな>2ch
002914NGNG
>あと補足。もしSetWindowLong使うなら、GWL_USERDATAは使っちゃいけない
>ハズだよ、確か。

すみません。ドキュメント見直したらそんな事書いていませんでした。
お詫びいたします。本筋とは離れているのでsageます。
0030デフォルトの名無しさんNGNG
>>15 (>>27)
>そういう意味で、この板で教わったmap使う方法は

それってどういうやり方ですか?
教えてください。
過去ログでも残ってたらそれでもありがたいです。
(2chってでかすぎて過去ログ探しても見つからないよ〜)
003115NGNG
>>30 はいよー
http://piza.2ch.net/test/read.cgi?bbs=tech&key=981630730&st=134

詳しいことは私より、教えて下さった方々に訊いた方がいいと思います
0032デフォルトの名無しさんNGNG
話題は終わってるけど役に立ったんでage!
■ このスレッドは過去ログ倉庫に格納されています