2010-11-25 15 views
1

スタティックコントロールでマウスドラッグイベントをトリガーするにはどうすればよいですか?スタティックコントロールでマウスイベントをトリガーする


編集:

は、サブクラス化がどのように動作するか、このですか?次に、ウィンドウクラス(マウスクリックなど)に新しいメッセージを追加するにはどうすればよいですか?

WNDPROC wpOrigKnobProc; 

LRESULT CALLBACK wpKnobProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch (uMsg) { 
     // So here I can receive custom messages for the control? 
    } 
    return CallWindowProc(wpOrigKnobProc, hwnd, uMsg, wParam, lParam); 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
    switch (uMsg) { 
     case WM_CREATE: 
      { 
       HWND hctl = CreateWindowEx(0, "STATIC", NULL, SS_CENTERIMAGE | SS_REALSIZEIMAGE | SS_BITMAP | WS_CHILD | WS_VISIBLE, 90, 10, 64, 64, hwnd, (HMENU) KNOB, GetModuleHandle(NULL), 0); 
       wpOrigKnobProc = (WNDPROC) SetWindowLong(hctl, GWL_WNDPROC, (LONG) wpKnobProc); 
      } 
      return 0; 
    } 
    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 

ありがとうございます!

答えて

1

「マウスドラッグイベント」はありません。コントロールをサブクラス化する必要があります。マウスの位置をWM_LBUTTONDOWNメッセージハンドラに記録し、マウスをキャプチャします。次に、WM_MOUSEMOVEメッセージハンドラの現在のマウス位置と照合します。ボタンがまだダウンしていて、距離がGetSystemMetrics、SM_CXDOUBLECLK、SM_CYDOUBLECLKより大きい場合、マウスドラッグイベントになります。

+0

よろしくお願いいたします。しかし、マウスが静的コントロール(例えば、テキストラベル)上にあるかどうかを確認するにはどうすればよいですか? – Midas

+0

Erm、コントロールにない場合、マウスメッセージも表示されません。 –

+0

メインウィンドウのどこかをクリックするとメッセージが表示されます。メッセージが送信する唯一のパラメータは、マウスのxとyの位置です。現在のコントロールのようなものではありません。 – Midas

0

私はあなたにWTLを見てみることをお勧めします: CContainedWindowはSubclassWindowにとても便利です。手作業によるサブクラス分類は非常に面倒ですが、WTLを使用することは脳の問題ではありません。要するに、ウィンドウがコントロールに送るウィンドウメッセージを処理する独自のwindowprocを設定することができます。

ここで初心者のための最高のチュートリアルの一つだ: http://www.codeproject.com/KB/wtl/wtl4mfc4.aspx#atl2

0

あなたはどのSS_*フラグなしでプレーンな静的コントロールを作成した場合、あなたはおそらくあなたのwndprocWM_NCHITTESTを処理し、HTCLIENTを返却する必要があります、それ以外の場合は、あなたがしませんWM_MOUSExxxWM_LBUTTONなどのメッセージを入手してください。