WIN32学习——鼠标消息

1 基本鼠标消息
    WM_LBUTTONDOWN - 鼠标左键按下
    WM_LBUTTONUP - 鼠标左键抬起
    WM_RBUTTONDOWN - 鼠标右键按下
    WM_RBUTTONUP - 鼠标右键抬起
    WM_MOUSEMOVE - 鼠标移动消息
2 双击消息
    WM_LBUTTONDBCLK - 鼠标左键双击
    WM_RBUTTONDBCLK - 鼠标右键双击
3 滚轮消息

    WM_MOUSEWHEEL - 鼠标滚轮消息

以上消息附加参数(WPARAM和LPARAM)说明:

1 以上消息中的LPARAM参数均表示当前鼠标的位置,其中,LOWORD表示X坐标,HIWORD表示Y坐标

2 以上消息除了WM_MOUSEWHEEL消息之外,其他消息的WPARAM均表示其他按键的状态,如ALT、SHIFT等

WM_MOUSEWHEEL消息的WPARAM的LOWORD表示其他按键的状态,如ALT、SHIFT等。HIWORD表示滚轮的偏移量,这个值是120的倍数,通过正负值表示滚动方向(正:向前滚动,负向后滚动)


附加鼠标消息学习代码:


#include
HINSTANCE g_hInstance;
HANDLE hOutputHandle;
int n_xPos = 100, n_yPos = 100;
void OnPaint(HWND hWnd)
{PAINTSTRUCT ps = { 0 };HDC hDC = BeginPaint(hWnd, &ps);TextOut(hDC, n_xPos, n_yPos, __TEXT("hello"), lstrlen(__TEXT("hello")));EndPaint(hWnd, &ps);TCHAR szText[256] = { 0 };lstrcpy(szText, __TEXT("WM_PAINT\n"));WriteConsole(hOutputHandle, szText, lstrlen(szText), NULL, NULL);
}void OnLButtonDown(WPARAM wParam,LPARAM lParam)
{TCHAR szText[256] = { 0 };wsprintf(szText, __TEXT("WM_LBUTTONDOWN:%08X,(%d,%d)\n"), wParam, LOWORD(lParam), HIWORD(lParam));WriteConsole(hOutputHandle, szText, lstrlen(szText), NULL, NULL);
}void OnLButtonUp(WPARAM wParam, LPARAM lParam)
{TCHAR szText[256] = { 0 };wsprintf(szText, __TEXT("WM_LBUTTONUP:%08X,(%d,%d)\n"), wParam, LOWORD(lParam), HIWORD(lParam));WriteConsole(hOutputHandle, szText, lstrlen(szText), NULL, NULL);
}void OnLButtonDbclk(WPARAM wParam,LPARAM lParam)
{TCHAR szText[256] = { 0 };wsprintf(szText, __TEXT("WM_LBUTTONDBLCLK:%08X,(%d,%d)\n"), wParam, LOWORD(lParam), HIWORD(lParam));WriteConsole(hOutputHandle, szText, lstrlen(szText), NULL, NULL);
}void OnMouseMove(HWND hWnd,WPARAM wParam, LPARAM lParam)
{TCHAR szText[256] = { 0 };wsprintf(szText, __TEXT("WM_MOUSEMOVE:%08X,(%d,%d)\n"), wParam, LOWORD(lParam), HIWORD(lParam));WriteConsole(hOutputHandle, szText, lstrlen(szText), NULL, NULL);n_xPos = LOWORD(lParam);n_yPos = HIWORD(lParam);InvalidateRect(hWnd, NULL, TRUE);
}void OnMouseWheel(WPARAM wParam, LPARAM lParam)
{TCHAR szText[256] = { 0 };SHORT num = HIWORD(wParam);wsprintf(szText, __TEXT("WM_MOUSEWHEEL:%08X,%d,(%d,%d)\n"), LOWORD(wParam), num, LOWORD(lParam), HIWORD(lParam));WriteConsole(hOutputHandle, szText, lstrlen(szText), NULL, NULL);
}LRESULT CALLBACK MyProc(HWND   hWnd, UINT   uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){//鼠标消息case WM_MOUSEWHEEL:OnMouseWheel(wParam,lParam);break;case WM_MOUSEMOVE:OnMouseMove(hWnd,wParam,lParam);break;case WM_LBUTTONDBLCLK:OnLButtonDbclk(wParam,lParam);break;case WM_LBUTTONDOWN:OnLButtonDown(wParam,lParam);break;case WM_LBUTTONUP:OnLButtonUp(wParam, lParam);break;case WM_PAINT:OnPaint(hWnd);break;case WM_SYSCOMMAND:if (wParam == SC_CLOSE){if (IDOK == MessageBox(hWnd, __TEXT("确定要关闭窗口?"), __TEXT("提示"), MB_OKCANCEL)){PostQuitMessage(0);}else{return 0;}}break;}return DefWindowProc(hWnd, uMsg, wParam, lParam);
}ATOM Register(LPCWSTR className)
{WNDCLASSEX wc = { 0 };wc.cbClsExtra = 0;wc.cbSize = sizeof(WNDCLASSEX);wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)COLOR_WINDOW;wc.hCursor = NULL;wc.hIcon = NULL;wc.hIconSm = NULL;wc.hInstance = g_hInstance;wc.lpfnWndProc = MyProc;wc.lpszClassName = className;wc.lpszMenuName = NULL;//要窗口实现双击功能,需要在注册窗口类中添加 CS_DBLCLKS 这种风格wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;return RegisterClassEx(&wc);
}HWND Create(LPCWSTR className, LPCWSTR windowName)
{return CreateWindowEx(0, className, windowName, WS_OVERLAPPEDWINDOW, 100, 100, 600, 600, NULL, NULL, g_hInstance, NULL);
}void Show(HWND hWnd)
{ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);
}void Message()
{MSG ms = { 0 };while (GetMessage(&ms, NULL, 0, 0)){TranslateMessage(&ms);DispatchMessage(&ms);}
}int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{AllocConsole();g_hInstance = hInstance;hOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);Register(__TEXT("Main"));HWND hWnd = Create(__TEXT("Main"), __TEXT("This is test"));Show(hWnd);Message();return 0;
}




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部