文档库 最新最全的文档下载
当前位置:文档库 › Win32程序快速入门指南

Win32程序快速入门指南

Win32程序快速入门指南
Win32程序快速入门指南

Win32程序快速入门指南

1.程序说明

示例程序放在Win32ShapeOrg中

1.1_tWinMain

_tWinMain是程序入口。

while (GetMessage(&msg, NULL, 0, 0))开始为消息处理循环。

如果程序运行到此处将进入一个消息响应过程,即如果有消息就会进入消息响应函数

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 1.2全局初始化

如果要做全局初始化可以在tWinMain函数中while (GetMessage(&msg, NULL, 0, 0))前1.3消息响应机制

win32程序是基于消息响应的,最核心的模块是消息响应函数

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

消息是依附在某个窗口的。其中hWnd是窗口句柄,windows程序里,每一个窗口都有一个HWND类型的句柄用于标识这个窗口。

message是UINT类型的消息,实质上整数,消息的其它信息包含在wParam和lParam中

1.4绘制函数

WM_PAINT是绘制消息,所有和绘制相关的代码都放在WM_PAINT消息响应部分(具体在hdc = BeginPaint(hWnd, &ps);和EndPaint(hWnd, &ps);之间),win32所有绘制函数都带有一个HDC类型设备上下文句柄的参数。

InvalidateRect(hWnd, NULL, true);语句会发出绘制消息。如果需要更新绘制画面,就可以调用此语句。

Windows绘制机制的基础是图像设备交互(GDI,Graphics Device Interface)。

Brush是用来填充的刷子,绘制的东西是实心的。Pen相当于画笔,用来描述绘制直线曲线时的颜色粗细样式等等。如果不做设置,系统会提供默认的设置。

直线和曲线函数在这里,这是一个直线段的例子。

//显示文字

char cMessage[128];

sprintf(cMessage, "%d, %d", g_xPos, g_yPos);

SetBkMode(hdc, TRANSPARENT); //设置背景透明显示模式

TextOut(hdc, g_xPos+10, g_yPos-10, cMessage, strlen(cMessage));

//实心椭圆

int r = 9;

Ellipse(hdc, g_xPos-r, g_yPos-r, g_xPos+r, g_yPos+r); //当前位置坐标&位置+直径:

//空心椭圆

MoveToEx(hdc, g_xPos+r, g_yPos, 0);

AngleArc(hdc, g_xPos, g_yPos, r, 0, 360);

//画线

1.5一些有用的消息

消息和消息队列,Message Types里的System-Defined Messages中的WM,列出了各种类型的消息。

比较常见的消息包括:

●鼠标

左键点击,WM_LBUTTONDOWN,其它各种消息

获取鼠标位置:

int xPos, yPos;

xPos = GET_X_LPARAM(lParam);

yPos = GET_Y_LPARAM(lParam);

为了使用GET_X_LPARAM和GET_Y_LPARAM需要在加上头文件Windowsx.h

●键盘

某个键按下WM_KEYDOWN,按键信息在wParam中

switch(wParam)//看看是哪个键

{

case 'A':

case 'a':

break;

case 'S':

case 's':

break;

}

●时钟

WM_TIMER,启动一个时钟的函数SetTimer,这里是例子

示例中加在程序初始化部分,消息循环之前。

SetTimer(hWnd, 1, 30, NULL);//每隔30毫秒激活一次时钟响应

此语句要用到窗口句柄,放在BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)中。

WM_SIZE

窗口大小改变,是Window Notifications系列的消息。获取窗口尺寸示意代码int nWidth, nHeight;

nWidth = LOWORD(lParam); // width of client area

nHeight = HIWORD(lParam); // height of client area

1.6关于画面的特别讨论

Win32用于动画游戏绘制时,不加特殊处理会出现闪烁情况。可以使用双缓冲技术来解决。可以参考,在hdc = BeginPaint(hWnd, &ps);和EndPaint(hWnd, &ps);之间使用以下代码

此外还要响应WM_ERASEBKGND消息,直接return FALSE;即可。

2.程序封装

可以对程序进行接口封装处理。示例程序放在Win32Shape中。

void UserInit(); //用户初始化函数

void UserFinish(); //用户清理函数

bool UserWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);//消息响应函数

void UserRender(HDC hdc); //用户绘制函数

用户添加的程序不再放在VS自动生成的主程序中。

相关文档