본문 바로가기

Windows/Windows API

해당영역에 마우스 위치 있는지 확인 (TRACKMOUSEEVENT, TrackMouseEvent, WM_MOUSEHOVER, WM_MOUSELEAVE, WM_MOUSEMOVE,mouseover)

#define _WIN32_WINNT 0x0400
#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("TrackMouse");

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
     ,LPSTR lpszCmdParam,int nCmdShow)
{
    HWND hWnd;
    MSG Message;
    WNDCLASS WndClass;
    g_hInst=hInstance;
    
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hInstance=hInstance;
    WndClass.lpfnWndProc=(WNDPROC)WndProc;
    WndClass.lpszClassName=lpszClass;
    WndClass.lpszMenuName=NULL;
    WndClass.style=CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&WndClass);

    hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        NULL,(HMENU)NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
    hWndMain=hWnd;
    
    while(GetMessage(&Message,0,0,0)) {
        TranslateMessage(&Message);
        DispatchMessage(&Message);
    }
    return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    TRACKMOUSEEVENT tme;    // 마우스 위치를 알기 위한 구조체
    static char Mes[256];
    static BOOL bIn=FALSE;

    switch(iMessage) {
    case WM_MOUSEMOVE:
        if (bIn == FALSE) {
            tme.cbSize=sizeof(TRACKMOUSEEVENT);
            tme.dwFlags=TME_HOVER;                // 마우스가 작업 영역에 들어 왔는지 확인
            tme.hwndTrack=hWnd;                    // 메세지를 받을 윈도우
            tme.dwHoverTime=10;                    // 0.01초기간동안 존재시 이벤트 발생
            TrackMouseEvent(&tme);
        }
        return 0;
    case WM_MOUSEHOVER:
        lstrcpy(Mes,"마우스가 윈도우 영역에 들어왔습니다");
        InvalidateRect(hWnd,NULL,TRUE);
        bIn=TRUE;
        tme.cbSize=sizeof(TRACKMOUSEEVENT);
        tme.dwFlags=TME_LEAVE;
        tme.hwndTrack=hWnd;
        tme.dwHoverTime=500;
        TrackMouseEvent(&tme);
        return 0;
    case WM_MOUSELEAVE:
        lstrcpy(Mes,"윈도우 영역을 벗어났습니다");
        InvalidateRect(hWnd,NULL,TRUE);
        bIn=FALSE;
    case WM_PAINT:
        hdc=BeginPaint(hWnd, &ps);
        TextOut(hdc,10,10,Mes,strlen(Mes));
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}