- ベストアンサー
if(wp & MK_ LBUTTON)
case WM_MOUSEMOVE: if(wp & MK_ LBUTTON) { x = LOWORD(lp); y = HIWORD(lp); } if(wp & MK_ LBUTTON) の wp & MK_ LBUTTON ですが何をやってるんでしょうか? WPARAMと、MK_ LBUTTONの、 ビット演算、AND演算してると思うのですが 具体的どんな」ビット計算が行われているんでしょうか? 教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
00000000 wpの値 (2進数表記) 00000001 MK_LBUTTON (2進数表記) ------------------------------------ 00000000 ANDの結果 (2進数表記) AND演算なので、お互いの各ビットが1でなければ、そのビットは0になります。 マウスの左ボタンが押されたなら、wpに値が入るので、 00000001 wpの値 (2進数表記) 00000001 MK_LBUTTON (2進数表記) ------------------------------------ 00000001 ANDの結果 (2進数表記) となります。 マウスの右ボタンが押されたなら、 00000010 wpの値 (2進数表記) 00000010 MK_RBUTTON (2進数表記) ------------------------------------ 00000010 ANDの結果 (2進数表記) となります。 なぜAND演算するかと言うと、 マウスの左ボタンと右ボタンが両方押されているような場合は、 wpの値が0x03(二進数表記で0011)に なりますよね(wp = MK_LBUTTON | K_RBUTTON;)。 そういう状況で“右ボタンが押されているかだけ調べたい”場合に、 00000011 wpの値 (2進数表記) 00000010 MK_RBUTTON (2進数表記) ------------------------------------ 00000010 ANDの結果 (2進数表記) とすると、右ボタンのビットだけを判定出来る(=右ボタンが押されたか分かる)のです。 この手法は『ビットマスク』といって、プログラマの常識的テクニックなので、『ビットマスク』で色々検索してマスターしてくださいね。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★startover さんは『Win32 API入門』のサイトを知っているのかな? ・もしも、知っているとすると『40.マウスの移動を処理』の『case WM_MOUSEMOVE:』部分の 質問ですよね。→多分。 ・そうなると『39.マウスメッセージ』のページで『WM_MOUSEMOVE』メッセージの『WPARAM』 引数について解説されていますよ。 つまり『MK_LBUTTON』定数でマウスの左ボタンの押されている状態を AND 処理でビットの チェックをしているのです。→ビットマスクについては回答者 No.1 さんが詳しく解説して くれているので参照して下さい。 ・それで『WM_MOUSEMOVE』メッセージの『WPARAM』引数については http://wisdom.sakura.ne.jp/system/winapi/windata1.html→『メッセージ一覧』の下の方に ある『キーフラグ』か、 http://wisdom.sakura.ne.jp/system/winapi/win32/win39.html→『39.マウスメッセージ』の 定数部分を参照して下さい。 最後に: ・この質問の回答としましては、ウインドウのクライアント領域にマウスを移動したときに 『左ボタン』が押されていたらば、LPARAM 引数(lp)から横軸を『LOWORD』マクロで取得、 縦軸を『HIWORD』マクロで取得しています。 ・つまり、マウスのドラッグ移動中の座標を『x』、『y』変数に代入していることになります。 その後、『WM_PAINT』メッセージでドラッグ移動中の座標位置に『円(点)』を描画している ようです。 ・以上。おわり。 リンク: ・http://wisdom.sakura.ne.jp/system/winapi/win32/win39.html→『39.マウスメッセージ』 ・http://wisdom.sakura.ne.jp/system/winapi/win32/win40.html→『40.マウスの移動を処理』 ・http://wisdom.sakura.ne.jp/system/winapi/windata1.html→『メッセージ一覧』
お礼
すばやい回答ありがとうございます! そうです!そのサイトからコピペして来ました! メッセージ一覧というのがあったんですね! 気がつきませでした。 プログラムの流れも教えていただきましてありがとうございます! 丁寧に教えていただきどうもありがとうございます!
お礼
すばやく、詳しい丁寧な解説ありがとうございます。 なんとなくイメージがつかめました! ありがとうございます! >この手法は『ビットマスク』といって、プログラマの常識的テクニックなので、『ビットマスク』で色々検索してマスターしてくださいね。 これは常識的なテクニックというのは、勉強になりました。 いろいろありがとうございます!