電子書籍の厳選無料作品が豊富!

いつもお世話になっております。
WinXP,SDKです。

WM_LBUTTONDOWN時に、別なウィンドウへ移動メッセージを出しています。
SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);

ただ、受け取り側のウィンドウでは
WM_EXITSIZEMOVE時にのみ処理を行っています。

マウスを左クリックし、押したままの状態で移動した時はWM_EXITSIZEMOVEが有効ですが、マウスを左クリックしてすぐに離した時はWM_EXITSIZEMOVEメッセージは来ない為に結果がおかしくなります。

左クリック後にすぐに離した時は
SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
このメッセージは送らないようにしたいのですが、どのようなタイミングでどうチェックすれば良いでしょうか?

ウィンドウの移動をさせたいので、どうしても左クリックと同時に移動メッセージは出したいのです。
でも、まったく移動されずにマウスを離された時に困ります。

WM_MOSEMOVE時にMK_LBUTTONをチェックして処理をしてみましたが結果は一緒でした。

移動開始の左クリックなのか、シングルクリックなのかが分かればいいような気がするのですが、それもどのように知ることが出来るか分かりません。

アドバイスをお願い致します。

A 回答 (2件)

 こんばんは。


 どうやら、色々バグがある様です。
 SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
 はそのままで、WM_EXITSIZEMOVEと同時にWM_SETCURSORも追加して見て下さい。

//移動ウィンドウのプロシージャ
LRESULT CALLBACK WndProcMove(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
POINT pt = {0};
RECT rc = {0};
switch(uMsg)
{
case WM_SETCURSOR://クリックだけで離されると此れが送られる(ココを追加)
case WM_EXITSIZEMOVE://移動されて話されると此れが送られる
//アプリウィンドウの外側に居るので浮揚する
if(!::IsMouseIn(s_data.hWndApp))
{
::TransformWindow(s_data.ftb.hWndFloat, s_data.ftb.hWndMove, WS_OVERLAPPEDWINDOW, WS_EX_TOOLWINDOW);
}
else//アプリウィンドウの内側に居るので着地する
{
//着地点を決める
pt = GetLandWindowPointHelper(&s_data);
::TransformWindow(s_data.ftb.hWndLand, s_data.ftb.hWndMove, WS_BORDER, 0, &pt);
}
break;
}
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
    • good
    • 0
この回答へのお礼

前回のアドバイスも本当にありがとうございました。
使わせて頂いています。
WM_SETCURSOR を追加したところ、ツールバーが後に行ってしまう事がなくなりました!
助かりました。
いつもありがとうございます。

お礼日時:2008/12/10 09:17

最近vcな案件やってないので、想像ですが


WM_LBUTTONDOWN時にWM_EXITSIZEMOVEも相手windowに送ったらどうですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
WM_EXITSIZEMOVEを一緒に送ったところ、上手く動作するようになりました!
助かりました。ありがとうございます。

お礼日時:2008/12/10 09:13

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