C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[76037] Re:WM_MOUSEWHEEL 이벤트에서 화면 스크린 좌표가 이상하게 들어옵니다..
빌더(TWx) [builder] 1334 읽음    2021-02-05 13:33
우로스 님이 쓰신 글 :
: 서브클래싱 작업을 하고 있습니다.
:
: 아래처럼 코딩하였는데, 마우스클릭이나 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);
}



+ -

관련 글 리스트
76027 WM_MOUSEWHEEL 이벤트에서 화면 스크린 좌표가 이상하게 들어옵니다.. 우로스 1182 2021/01/27
76037     Re:WM_MOUSEWHEEL 이벤트에서 화면 스크린 좌표가 이상하게 들어옵니다.. 빌더(TWx) 1334 2021/02/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.