WM_NCLBUTTONDOWNでウィンドウを画面の上方向に持っていくと… part2 – プログラミング – Home

通知
すべてクリア

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


nfs
 nfs
(@nfs)
ゲスト
結合: 16年前
投稿: 48
Topic starter  

解決済みのフラグを立てたのですが、勘違いでしたので 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
 nfs
(@nfs)
ゲスト
結合: 16年前
投稿: 48
Topic starter  

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

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

解決したと本人がいっているので良いのですが。
これを読んだ人が困らないように、少し補足させてもらいます。

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

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

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


返信引用
nsf
 nsf
(@nsf)
ゲスト
結合: 15年前
投稿: 9
 

すいません、私もその間違いに気付き、
私は、GetCursorPos()を使いました。(これでもいいのかな?)
どうも御指摘ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました