WM_MOUSEWHEEL - 鼠标滚轮消息
以上消息附加参数(WPARAM和LPARAM)说明:
1 以上消息中的LPARAM参数均表示当前鼠标的位置,其中,LOWORD表示X坐标,HIWORD表示Y坐标
2 以上消息除了WM_MOUSEWHEEL消息之外,其他消息的WPARAM均表示其他按键的状态,如ALT、SHIFT等
3 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;
}