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自动生成的主程序中。