アプリ版:「スタンプのみでお礼する」機能のリリースについて

case WM_MOUSEMOVE:
  if(wp & MK_ LBUTTON) {
  x = LOWORD(lp);
  y = HIWORD(lp);
}



if(wp & MK_ LBUTTON)  の wp & MK_ LBUTTON
ですが何をやってるんでしょうか?


WPARAMと、MK_ LBUTTONの、
ビット演算、AND演算してると思うのですが
具体的どんな」ビット計算が行われているんでしょうか?

教えてください。

A 回答 (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進数表記)
とすると、右ボタンのビットだけを判定出来る(=右ボタンが押されたか分かる)のです。

この手法は『ビットマスク』といって、プログラマの常識的テクニックなので、『ビットマスク』で色々検索してマスターしてくださいね。
    • good
    • 0
この回答へのお礼

すばやく、詳しい丁寧な解説ありがとうございます。
なんとなくイメージがつかめました!
ありがとうございます!

>この手法は『ビットマスク』といって、プログラマの常識的テクニックなので、『ビットマスク』で色々検索してマスターしてくださいね。


これは常識的なテクニックというのは、勉強になりました。
いろいろありがとうございます!

お礼日時:2007/02/27 18:07

★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/windata …→『メッセージ一覧』の下の方に
 ある『キーフラグ』か、
 http://wisdom.sakura.ne.jp/system/winapi/win32/w …→『39.マウスメッセージ』の
 定数部分を参照して下さい。

最後に:
・この質問の回答としましては、ウインドウのクライアント領域にマウスを移動したときに
 『左ボタン』が押されていたらば、LPARAM 引数(lp)から横軸を『LOWORD』マクロで取得、
 縦軸を『HIWORD』マクロで取得しています。
・つまり、マウスのドラッグ移動中の座標を『x』、『y』変数に代入していることになります。
 その後、『WM_PAINT』メッセージでドラッグ移動中の座標位置に『円(点)』を描画している
 ようです。
・以上。おわり。

リンク:
http://wisdom.sakura.ne.jp/system/winapi/win32/w …→『39.マウスメッセージ』
http://wisdom.sakura.ne.jp/system/winapi/win32/w …→『40.マウスの移動を処理』
http://wisdom.sakura.ne.jp/system/winapi/windata …→『メッセージ一覧』

参考URL:http://wisdom.sakura.ne.jp/system/winapi/win32/i …
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/27 18:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!