2013.8.15 学习笔记《windows核心编程》(十二) 鼠标消息与定时器消息
2013-08-15 09:58
399 查看
《windows核心编程》(十二)-----------2013.8.15
一、概念
鼠标消息
•双击鼠标消息
消息参数
WPARAM- 其他按键的状态,例如Ctrl/Shift等
LPARAM -鼠标的位置,窗口客户区坐标系。
LOWORD X坐标位置
HIWORD Y坐标位置
想要获取鼠标双击消息时需要在注册窗口类的时候添加CS_DBLCLKS风格。
消息产生顺序
以WM_LBUTTONDBLCLK为例:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
•鼠标滚轮WM_MOUSEWHEEL
消息参数
WPARAM:
LOWORD -其他按键的状态
HIWORD -滚轮的偏移量,是120的倍数,通过正负值表示表示滚动方向。
正:向前滚动
负:向后滚动
LPARAM:鼠标当前的位置,屏幕坐标系
LOWORD - X坐标
HIWORD - Y坐标
使用
通过偏移量,获取滚动的方向和倍数。
定时器消息
•1 定时器消息
可以在程序中设置定时器,当到达时间
间隔时,定时器会向程序发送一个
WM_TIMER消息。
定时器的精度是毫秒,但是准确度很低。
例如设置时间间隔为1000ms,但是会在
非1000毫秒到达。
•2 消息的参数
WPARAM-
定时器ID
LPARAM-
定时器处理函数的指针
•3定时器使用
3.1创建定时器
UINT SetTimer(
HWND
hWnd,//定时器窗口句柄
UINT
nIDEvent, //定时器ID
UINT
uElapse,//时间间隔
TIMERPROC
lpTimerFunc //定时器处理函数指针
);创建成功,返回非0。
使用窗口处理函数,做为定时器处理函数,lpTimerFunc为NULL
使用定时器处理函数处理定时器消息。
设置定时器函数SetTimer中,如果定时器处理函数为空只找hWnd句柄的窗口处理函数来处理,如果定时器处理函数不为空,那么就交给定时器处理函数去处理。
3.2消息处理
WM_TIMER
3.3关闭定时器
BOOLKillTimer(
HWND
hWnd,//定时器窗口句柄
UINT
uIDEvent //定时器ID
);
附:GetClientRect获取窗口客户区大小
弹球实例:
一、概念
鼠标消息
•双击鼠标消息
消息参数
WPARAM- 其他按键的状态,例如Ctrl/Shift等
LPARAM -鼠标的位置,窗口客户区坐标系。
LOWORD X坐标位置
HIWORD Y坐标位置
想要获取鼠标双击消息时需要在注册窗口类的时候添加CS_DBLCLKS风格。
消息产生顺序
以WM_LBUTTONDBLCLK为例:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
•鼠标滚轮WM_MOUSEWHEEL
消息参数
WPARAM:
LOWORD -其他按键的状态
HIWORD -滚轮的偏移量,是120的倍数,通过正负值表示表示滚动方向。
正:向前滚动
负:向后滚动
LPARAM:鼠标当前的位置,屏幕坐标系
LOWORD - X坐标
HIWORD - Y坐标
使用
通过偏移量,获取滚动的方向和倍数。
定时器消息
•1 定时器消息
可以在程序中设置定时器,当到达时间
间隔时,定时器会向程序发送一个
WM_TIMER消息。
定时器的精度是毫秒,但是准确度很低。
例如设置时间间隔为1000ms,但是会在
非1000毫秒到达。
•2 消息的参数
WPARAM-
定时器ID
LPARAM-
定时器处理函数的指针
•3定时器使用
3.1创建定时器
UINT SetTimer(
HWND
hWnd,//定时器窗口句柄
UINT
nIDEvent, //定时器ID
UINT
uElapse,//时间间隔
TIMERPROC
lpTimerFunc //定时器处理函数指针
);创建成功,返回非0。
使用窗口处理函数,做为定时器处理函数,lpTimerFunc为NULL
使用定时器处理函数处理定时器消息。
设置定时器函数SetTimer中,如果定时器处理函数为空只找hWnd句柄的窗口处理函数来处理,如果定时器处理函数不为空,那么就交给定时器处理函数去处理。
3.2消息处理
WM_TIMER
3.3关闭定时器
BOOLKillTimer(
HWND
hWnd,//定时器窗口句柄
UINT
uIDEvent //定时器ID
);
附:GetClientRect获取窗口客户区大小
弹球实例:
// WinCreate.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "windows.h" #include "WinTimer.h" #include "stdio.h" HINSTANCE g_hInstance = 0;//用于接受应用程序实例句柄 HANDLE g_hOutput = 0; int g_nX1Pos = 100;//圆左上横坐标 int g_nY1Pos = 100;//圆左上竖坐标 int g_nX2Pos = 200;//圆右下横坐标 int g_nY2Pos = 200;//圆右下竖坐标 enum//四个方向状态 { State1, State2, State3, State4 }; int gameState = State1;//圆运动的方向状态 void OnPaint(HWND hWnd) { PAINTSTRUCT ps = {0}; HDC hdc = BeginPaint(hWnd,&ps); Ellipse(hdc,g_nX1Pos,g_nY1Pos,g_nX2Pos,g_nY2Pos); EndPaint(hWnd,&ps); } void OnTimer(HWND hWnd,WPARAM wParam) { CHAR szText[256] = {0}; sprintf_s(szText,"定时器:%d\n",wParam); WriteConsole(g_hOutput,szText,strlen(szText),NULL,NULL); RECT rc = {0}; GetClientRect(hWnd,&rc);//获取窗口左上右下坐标 if(g_nX2Pos > rc.right) { if(gameState == State1) gameState = State2; else gameState = State3; } if(g_nY2Pos > rc.bottom) { if(gameState == State2) gameState = State3; else gameState = State4; } if(g_nX1Pos < rc.left) { if(gameState == State3) gameState = State4; else gameState = State1; } if(g_nY1Pos < rc.top) { if(gameState == State4) gameState = State1; else gameState = State2; } switch (gameState) { case State1: g_nX1Pos ++; g_nY1Pos ++; g_nX2Pos ++; g_nY2Pos ++; break; case State2: g_nX1Pos --; g_nY1Pos ++; g_nX2Pos --; g_nY2Pos ++; break; case State3: g_nX1Pos --; g_nY1Pos --; g_nX2Pos --; g_nY2Pos --; break; case State4: g_nX1Pos ++; g_nY1Pos --; g_nX2Pos ++; g_nY2Pos --; break; } InvalidateRect(hWnd,NULL,TRUE); } //窗口处理函数 LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg, WPARAM wParam,LPARAM lParam) { switch(nMsg) { case WM_PAINT: OnPaint(hWnd); break; case WM_TIMER: OnTimer(hWnd,wParam); break; case WM_CREATE: SetTimer(hWnd,1,10,NULL); break; case WM_DESTROY: KillTimer(hWnd,1); PostQuitMessage(0); break; } return DefWindowProc(hWnd,nMsg,wParam,lParam); } //注册窗口类 BOOL Register(LPSTR lpClassName,WNDPROC wndproc) { WNDCLASSEX wce = {0}; wce.cbSize = sizeof(wce); wce.cbClsExtra = 0; wce.cbWndExtra = 0; wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wce.hCursor = NULL; wce.hIcon = NULL; wce.hIconSm = NULL; wce.hInstance = g_hInstance; wce.lpfnWndProc = wndproc; wce.lpszClassName = lpClassName; wce.lpszMenuName = NULL; wce.style = CS_HREDRAW | CS_VREDRAW; ATOM nAtom = RegisterClassEx(&wce); if(nAtom == 0) { return FALSE; } return TRUE; } //创建主窗口 HWND CreateMain(LPSTR lpClassName,LPSTR lpWndName) { HWND hWnd = CreateWindowEx(0,lpClassName,lpWndName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,g_hInstance,NULL); return hWnd; } //显示窗口 void Display(HWND hWnd) { ShowWindow(hWnd,SW_SHOW); UpdateWindow(hWnd); } //消息循环 void Message() { MSG nMsg = {0}; while (GetMessage(&nMsg,NULL,0,0)) { TranslateMessage(&nMsg); DispatchMessage(&nMsg); } } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. AllocConsole(); g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE); g_hInstance = hInstance; Register("Main",WndProc); HWND hWnd = CreateMain("Main","Window"); Display(hWnd); Message(); return 0; }
相关文章推荐
- 2013.8.6 学习笔记《windows核心编程》(九) 消息获取,消息派发与消息分类
- DXUT 学习笔记(3)对键盘鼠标的响应 及 消息处理
- 2013.8.13 学习笔记《windows核心编程》(十一) 键盘消息与翻译消息
- 汇编语言学习笔记-接收鼠标消息
- Arduino101学习笔记(十二)—— 101定时器中断
- 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)
- Win32学习笔记——定时器消息
- 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)
- 2013.8.5 学习笔记《windows核心编程》(八) 常用消息
- Win32学习笔记——鼠标消息
- wpf学习笔记-3D场景中的鼠标相应事件
- Linux学习笔记--IPC中的消息队列【0604】
- Windows 8学习笔记(十二)--集合控件
- Baxter学习笔记6-鼠标点动控制baxter机械臂--实战篇
- Programming Computer Vision with Python (学习笔记十二)
- JMS(java消息服务)学习笔记
- rabbitMQ消息服务器学习笔记(java)4消息路由routing
- javascript学习笔记(十二)初始化表单,及对其简单验证
- 设计模式学习笔记(十二:生成器模式)
- learning jQuery 学习笔记十二(+jQuery 1.4.1 API)-- DOM操作-基于命令改变页面 ----包装元素