您的位置:首页 > 编程语言

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获取窗口客户区大小

弹球实例:

// 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: