• ベストアンサー

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演算してると思うのですが 具体的どんな」ビット計算が行われているんでしょうか? 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Eklundh
  • ベストアンサー率18% (9/48)
回答No.1

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進数表記) とすると、右ボタンのビットだけを判定出来る(=右ボタンが押されたか分かる)のです。 この手法は『ビットマスク』といって、プログラマの常識的テクニックなので、『ビットマスク』で色々検索してマスターしてくださいね。

startover
質問者

お礼

すばやく、詳しい丁寧な解説ありがとうございます。 なんとなくイメージがつかめました! ありがとうございます! >この手法は『ビットマスク』といって、プログラマの常識的テクニックなので、『ビットマスク』で色々検索してマスターしてくださいね。 これは常識的なテクニックというのは、勉強になりました。 いろいろありがとうございます!

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★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→『メッセージ一覧』

参考URL:
http://wisdom.sakura.ne.jp/system/winapi/win32/index.html
startover
質問者

お礼

すばやい回答ありがとうございます! そうです!そのサイトからコピペして来ました! メッセージ一覧というのがあったんですね! 気がつきませでした。 プログラムの流れも教えていただきましてありがとうございます! 丁寧に教えていただきどうもありがとうございます!

関連するQ&A