2010-11-25 10 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를 설정할 수 있습니다. 당신이 어떤 SS_* 플래그없이 일반 정적 컨트롤을 만들 경우, 당신은 아마 그렇지 않으면 당신은하지 않습니다, 당신의 wndprocWM_NCHITTEST를 처리하고 HTCLIENT를 반환해야합니다 http://www.codeproject.com/KB/wtl/wtl4mfc4.aspx#atl2

0

:

여기에 초보자를위한 최고의 자습서 중 하나입니다 WM_MOUSExxx 또는 WM_LBUTTON 등의 메시지를받습니다.