フォームの外までドラッグしてもMouseMoveを拾いたい

[戻る]
DirtRunner [E-Mail] 2009/08/20(木) 17:35:07
VS2005 VC++ WinXP MFCです。

ダイアログベースのアプリを作成していますが、マウスの移動(座標)を
拾いたいと思っております。

具体的には、フォームのある一部分で左ボタンをクリックし、
そのままドラッグしたときのマウスの移動量を取得し、その移動量を
随時記録します。
左ボタンを放すまで記録します。

OnMouseMove()だと、フォームの外に外れるとイベントが発生せずに止まってしまいます。
(フォーム内のタブコントロール上ですら止まってしまいます)
希望としては、フォーム外であってもフォーム内と同じように座標を拾いたいです。
(D&Dではなく、ただ移動座標(デスクトップ上の絶対座標でも、移動量だけでも可)を
拾うだけです。)
ちなみに、シングルモニターです。


そこで、
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg){
        case WM_LBUTTONDOWN:
   :
   :
}

のような記述を試したのですが、これはAPIなので使用できない(コールされない)よう
です。

そこでWndProcのクラス化なども調べたのですが、理解できずに困っています。

なにかヒントはありますでしょうか?
よろしくお願いいたします。

bun 2009/08/20(木) 17:52:44
SetCapture()してはどう?

DirtRunner [E-Mail] 2009/08/20(木) 18:12:20
[[解決]]
bun様

ありがとうございます!

SetCapture()はCWnd::(MFC)のものとHWND(API)と両方あるということだったんですね?


void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
  SetCapture();
    CDialog::OnLButtonDown(nFlags, point);
}
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    //ここでpoint.xなどを取得・処理
    CDialog::OnMouseMove(nFlags, point);
}
void CPartsBuilderDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
    ReleaseCapture();
    CDialog::OnLButtonUp(nFlags, point);
}

これでうまく取得できました。

[SetCapture MFC]で改めて検索し、
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200802/08020045.txt
ここも見つかり、よく読んでから気がつきました。

迅速な回答、ありがとうございました!

DirtRunner [E-Mail] 2009/08/20(木) 18:13:48
上記の訂正。

void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)

   ↑ここがコピペミスでした。

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