WM_NCLBUTTONDOWNでウィンドウを画面の上方向に持っていくと... part2

[戻る]
nfs 2009/12/04(金) 12:33:10
解決済みのフラグを立てたのですが、勘違いでしたので part2としました。orz

VC2008 Express Edition(SDK)
Vista SP1

ウィンドウをタイトルバー以外のところで移動したいため
WndProc()内で
case WM_LBUTTONDOWN:
    SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
    break;
としています。

これで、動くのですが、タイトルバーが隠れるように画面の上の方にウィンドウをドラッ
グすると、タイトルバーの分だけ自動的に下に戻されてしまいます。
これを回避したいのですが、どうすればいいでしょうか?

WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVEのメッセージ捕まえて自前でウィンドウの移
動は実現が難しそうなところまでは調べました。
あと、CreateWindow()でWM_SYSMENU(←使いたい)を指定すると、
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
が機能しないようです。

行き詰ってしまいました。ご回答よろしくお願いします。

nfs 2009/12/05(土) 09:59:21
[[解決]]
SetWindowRgn()で妙な形のウィンドウをつくっていたのですが、
WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVEのメッセージ捕まえて自前でウィンドウの移
動をしようとすると、どうもクライアント領域外で、マウスの位置がおかしくなるようで
した。(LOWORD(lParam)やHIWORD(lParam)に65000〜69000の値が入る)
そこで、クライアント領域を大きくとることでマウスの位置を正確につかまえられるよう
になりました。
考えてくださった皆様、どうもありがとうございました。

2度も掲示板を汚してしまい、すみませんでした。orz

仲澤@失業者 2009/12/07(月) 10:04:40
解決したと本人がいっているので良いのですが。
これを読んだ人が困らないように、少し補足させてもらいます。

LOWORD()、HIWORD()で、マウス位置を取得するのは「大間違い」です。
これは、クライアント領域のマウス座標には「負」の値をとりえるからです。
マニュアルにもありますが、

 xPos = GET_X_LPARAM(lParam); 
 yPos = GET_Y_LPARAM(lParam); 

を使いましょう(vv;)。

nsf 2009/12/08(火) 07:22:49
[[解決]]
すいません、私もその間違いに気付き、
私は、GetCursorPos()を使いました。(これでもいいのかな?)
どうも御指摘ありがとうございました。

古いスレッドには追加発言できません。