鼠标消息

来源:互联网 发布:xlplayer mac有杂音 编辑:程序博客网 时间:2024/05/06 00:42

对于所有的鼠标消息,其lParam值均含有鼠标位置:低字组为x坐标,高字组为y坐标,这两个坐标是相对于窗口显示区域左上角的位置。可以用LOWORD和HIWORD宏来提取这些值:

x = LOWORD(lParam);

y = HIWORD(lParam);

wParam值指示鼠标按键以及Shift和Ctrl键的状态。可以用WINUSER.H中定义的位屏蔽来测试wParam。例如:

收到了WM_LBUTTONDOWN的消息,而且值 wParam &MK_SHIFT是TRUE,就知道当左键按下时也按下了Shift键。

#include <windows.h>#define MAXPOINTS 1000LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT("Connect");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)){MessageBox(NULL, TEXT("Program requires Windows NT!"), szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindow(szAppName, TEXT("Context-the-Points Mouse Demo"),WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){static POINT pt[MAXPOINTS];static int iCount;HDC hdc;int i, j;PAINTSTRUCT ps;switch (message){case WM_LBUTTONDOWN:iCount = 0;InvalidateRect(hwnd, NULL, TRUE);return 0;case WM_MOUSEMOVE:if (wParam & MK_LBUTTON && iCount < MAXPOINTS){pt[iCount].x = LOWORD(lParam);pt[iCount++].y = HIWORD(lParam);hdc = GetDC(hwnd);SetPixel(hdc, LOWORD(lParam), HIWORD(lParam), 0);ReleaseDC(hwnd, hdc);}return 0;case WM_LBUTTONUP:InvalidateRect(hwnd, NULL, FALSE);return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);SetCursor(LoadCursor(NULL, IDC_WAIT));ShowCursor(TRUE);for (i = 0; i < iCount - 1; ++i){for (j = i + 1; j < iCount; ++j){MoveToEx(hdc, pt[i].x, pt[i].y, NULL);LineTo(hdc, pt[j].x, pt[j].y);}}ShowCursor(FALSE);SetCursor(LoadCursor(NULL, IDC_ARROW));EndPaint(hwnd, &ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);}


原创粉丝点击