2013.8.15 学习笔记《windows核心编程》(十二) 鼠标消息与定时器消息

《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

  使用窗口处理函数,做为定时器处理函数,lpTimerFuncNULL

  使用定时器处理函数处理定时器消息。

设置定时器函数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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值