オブジェクト指向のSDKプログラミング
■ このスレッドは過去ログ倉庫に格納されています
0001かい
NGNGそれぞれのウィンドウにメッセージを分配する方法ですが、
ウィンドウを作成したときにそのクラスのインスタンスへのポインタを
GWL_USERDATAでSetWindowLongしておき、
そのあと共通の(グローバルの)ハンドラでメッセージ処理する時、
GetWindowLongでウィンドウクラスのオブジェクトへのポインタを取得し、
そのポインタに対してハンドラを呼び出す。
というやり方を2つほど(sakura editor, Tick Tack Libraryのソースコード)
見たことがあるのですが、全メッセージに対していちいちGetWindowLongは
速度的に効率が悪そうに見えるのですがどうなんでしょうか?
それとも、C++&SDKのプログラミングでは定石なんでしょうか?
0002デフォルトの名無しさん
NGNG----------- exit(-1); -----------
0003デフォルトの名無しさん
NGNGさすがに、コピペはまずいかな・・・。
0004デフォルトの名無しさん
NGNGSetWindowLongかSetPropしかないだろ。
0005デフォルトの名無しさん
NGNGそのオーバーヘッドがボトルネックになるほどメッセージが頻繁に飛んでくるのか?
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG管理しているみたいだよ。
他の人に使ってもらうクラスライブラリを作る
ならSetWindowLongは使えないからね。
MFCのソースが見れるなら、CWnd::Attach
あたりから見ていくと参考になるかも。
MFCは糞って人だったら失礼
0010>1
NGNG既存のウィンドウに対してはクラスを持ってきて自分用のクラスにコピーすればスーパークラス化(だっけ?)できる。
酔っ払ってるのでいってることつたわんなかったらごめんよ
0012デフォルトの名無しさん
NGNGきっと、間違えてもう一つスレたてたんだよね!? ボクはそう信じてるよ。。。
>>11のかい
送られてくるよ。でもスピード面ではSetWindowLongで大丈夫だよ!
MFCは知らんが、BCはSetWindowLong使っていたハズだよ。
少なくともSetPropよりは高速だよ。
あとは9,10の問題もあるから自分で判断したら〜〜〜
あと補足。もしSetWindowLong使うなら、GWL_USERDATAは使っちゃ
いけないハズだよ、確か。
で、その代わりにユーザー情報をWindowに対応づけるには
SetWindowLong( hwnd, 0, pUserData );
じゃなかったかな。ただし,この時はクラスを登録する時の構造体
WNDCALSSEXのユーザー情報サイズに(ポインタだから4)と指定して
ね。
どっちにしろ、もう一度ドキュメントみてみてみてみて。
0013デフォルトの名無しさん
NGNG便乗質問
>あと補足。もしSetWindowLong使うなら、GWL_USERDATAは使っちゃいけないハズだよ、確か。
ぉ?なにゆえなんでしょう?
0014デフォルトの名無しさん
NGNGラリに書いてあった記憶が。。。
というのも、つい最近同じくWindow毎にデータを保持したい事が
あって、SetWindowsLongを調べたのれす。あれ、記憶違い!?
そっちのドキュメントにはそんな事書いてない!?
0015デフォルトの名無しさん
NGNGイベントは適当なオブジェクトで直接扱いたくないですか?
そういう意味で、この板で教わったmap使う方法は凄い役に
立ってます。状態も把握しといてメッセージ振り分けんの。
テンプレート使えばそんなに登録も面倒じゃないし、
ソース見るだけでメッセージの帰属が一目瞭然なとこもお気に入り
(うーん、私も酔いが抜けない)
001615
NGNGすまねぇ、さっきのは忘れてくれいヽ( ´ー`)ノ
GetWindowLongがいやならGetWindowWordでも使うのだ(w
0017>15
NGNGイベント大量に登録する様な場合は速度の差はあんまりないと思うけどね。
0018デフォルトの名無しさん
NGNGGWL_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ありがたや、ありがたや、いい板だなここ
0021デフォルトの名無しさん
NGNG>どっかにサンクつかったソースが
http://mentai.2ch.net/prog/kako/957/957341074.html
ここの79番かな
00223
NGNGhttp://www.asahi-net.or.jp/~HA3T-NKMR/vcl3-1.htm#3-1-4
00233
NGNG0024デフォルトの名無しさん
NGNG俺はハッシュテーブルで組んだなぁ。
というか、作った頃そんなにWindows精通してなかったから、
確実に動く方法として選んだんだけどね。
でも、サンク方式の方が効率良さそうだよね。
うーん、昔作ったの書き直そうかな。。。
0025デフォルトの名無しさん
NGNG>>17
それ、多分、オレが書いた奴だが。
あの時hashmap使えって書かなかったか?
それから、mapって内部B木だと思ったんだが。
通常のアプリではメッセージ数千とか登録しないだろうから普通のmap
でもボトルネックになることはほぼありえない。
0026デフォルトの名無しさん
NGNGハッシュが必要なの?
0027デフォルトの名無しさん
NGNGあのさー、何で32bitのウインドウハンドルで
ハッシュを使っちゃいけないの?
わざわざ自分で組むなら考え物だけど、
出来合いのものを使うんだから問題ねーだろ?
002815
NGNGあー、大丈夫です。もちろん覚えてます。むしろあの時のこと思い出してました。
あの時も後からhash使えよって指摘して貰ったんですよね。今回も後から
ちゃんとフォローが入ったので、…で、いい板だなと。
やねうらをが嫌いなこともよく覚えてます(笑。しかし広いようで狭いな>2ch
002914
NGNG>ハズだよ、確か。
すみません。ドキュメント見直したらそんな事書いていませんでした。
お詫びいたします。本筋とは離れているのでsageます。
0030デフォルトの名無しさん
NGNG>そういう意味で、この板で教わったmap使う方法は
それってどういうやり方ですか?
教えてください。
過去ログでも残ってたらそれでもありがたいです。
(2chってでかすぎて過去ログ探しても見つからないよ〜)
003115
NGNGhttp://piza.2ch.net/test/read.cgi?bbs=tech&key=981630730&st=134
詳しいことは私より、教えて下さった方々に訊いた方がいいと思います
0032デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています