|
smleelms 님이 쓰신 글 :
: WM_NCMBUTTONDBLCLK 메시지를 핸들링해야 한다는 것까지는 알았는데,
: 어떻게 핸들링을 해야 되나요 ?
:
: VC++에서의 이벤트 처리루틴입니다.
:
: void CMyWin::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
: {
: if(nHitTest == HTCAPTION) // 타이틀바에서 더블클릭이면 리턴
: return;
:
: CMyWin::OnNcLButtonDblClk(nHitTest, point);
: }
:
: 이것을 Application->OnMessage로 연결해서 메시지를 잡으면 될것 같은데...
: 이때 위 함수처럼 객체(?)가 타이틀바인지. 하는 것들은 어떻게 알아내서 어떻게 처리해야 될까요?
:
: 고수님들의 가르침을 기다립니다.. ^^;
TApplication의 OnMessage 핸들러는 아래와 같은 형입니다.
typedef void __fastcall (__closure *TMessageEvent)(tagMSG &Msg, bool &Handled);
첫번째 아규먼트인 Msg에 정보가 넘어옵니다.
tagMSG는 아래와 같습니다.
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
한편, WM_NCLBUTTONDBLCLK Windows 메시지는 아래와 같습니다.
nHittest = (INT) wParam; // hit-test value
pts = MAKEPOINTS(lParam); // position of cursor
따라서, OnMessage 핸들러 내에서 아래와 같이 필요한 정보를 얻을 수 있습니다.
INT nHittest = (INT)Msg.wParam ;
POINTS pts = MAKEPOINTS(Msg.lParam);
nHittest에 가능한 값들은 WM_NCHITTEST의 도움말을 참조하시기 바랍니다.
;
Application->OnMessage를 사용할 수도 있고
아래와 같이 메시지 맵을 사용할 수도 있습니다.
void OnNcLButtonDblClk(TMessage&);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK,TMessage,OnNcLButtonDblClk);
END_MESSAGE_MAP(TForm);
void TForm1::OnNcLButtonDblClk(TMessage& Msg)
{
INT nHittest = (INT)Msg.WParam ;
POINTS pts = MAKEPOINTS(Msg.LParam);
//작업
}
|