우로스 님이 쓰신 글 :
: 서브클래싱 작업을 하고 있습니다.
:
: 아래처럼 코딩하였는데, 마우스클릭이나 Move 이벤트에서는 스크린 좌표가 정상적으로 들어오는데,
: WM_MOUSEWHEEL 에서는 값이 이상하게 들어옵니다.
:
: 어떻게 해줘야 WM_MOUSEWHEEL 이벤트에서도 정상적인 스크린 좌표를 얻을수 있는지 도움 부탁드립니다.
: (해당 패널의 좌표값이 아니라, 모니터 전체 영역에서의 좌표값이 들어오는것 같습니다.)
:
: 감사합니다.
:
:
: //---------------------------------------------------------------------------
: void __fastcall TForm1::NewProc(Messages::TMessage &Message)
: {
: Message.Result = WindowProc(Message.Msg, Message.WParam, Message.LParam);
: OriginalProc(Message);
: }
: //---------------------------------------------------------------------------
: bool __fastcall TForm1::WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
: {
: int nCurX, nCurY;
: switch(uMsg)
: {
: case WM_MOUSEWHEEL: // 스크린 좌표(nCurX, nCurY) 이상한 값이 들어옵니다.
: nCurX = LOWORD(lParam);
: nCurY = HIWORD(lParam);
: break;
: case WM_MOUSEMOVE: // 스크린 좌표(nCurX, nCurY) 정상적으로 읽힙니다.
: nCurX = LOWORD(lParam);
: nCurY = HIWORD(lParam);
: break;
: default:
: return FALSE;
: }
: return TRUE;
: }
: //---------------------------------------------------------------------------
:
:
답변:
윈도우즈 프로그래밍 기초가...
멀티모니터 환경에선...
어느 쪽 모니터가 프라이머리 모니터로 지정되냐에 따라서 좌표 값이 음수 값으로 표현될 수도 있으므로
멀티모니터 환경도 고려해서 지원하도록 프로그램을 만들기 위해선
<windowsx.h>
윈도우즈 Extension 헤더 파일을 추가로 include 해서 LOWORD / HIWORD 대신
GET_X_LPARAM / GET_Y_LPARAM 을 사용해야 하고
WM_MOUSEMOVE 메세지가 윈도우 창에 상대적인 Client Rect 좌표계를 이용하는 반면에...
WM_MOUSEWHEEL 메세지는 윈도창이 아닌 모니터의 Screen 좌표계를 이용하기 때문에
다음과 같이 Screen 좌표계를 Client 좌표계로 변환해야 합니다.
#include < windowsx.h > // 윈도우즈 Extension 헤더
//---------------------------------------------------------------------------
TWndMethod OrgProc;
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
OrgProc = Form2->WindowProc;
Form2->WindowProc = NewWndProc;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::NewWndProc(TMessage &M)
{
int nCurX, nCurY;
switch(M.Msg) {
case WM_MOUSEWHEEL: {
POINT pt{GET_X_LPARAM(M.LParam), GET_Y_LPARAM(M.LParam)};
::ScreenToClient(Handle, &pt);
nCurX = pt.x;
nCurY = pt.y;
Caption = String().sprintf(L"WH: %d, %d", nCurX, nCurY);
M.Result = 0;
}
break;
case WM_MOUSEMOVE:
nCurX = GET_X_LPARAM(M.LParam);
nCurY = GET_Y_LPARAM(M.LParam);
Caption = String().sprintf(L"WM: %d, %d", nCurX, nCurY);
M.Result = 0;
break;
}
OrgProc(M);
}