2.4 Windows应用程序举例(2)
(6) 编译并运行程序,结果如图2.18所示。
|
| (点击查看大图)图2.18 generic运行结果 |
从上面的程序可以看出:控制台应用程序是以main函数作为进入程序的初始入口点,但在Windows应用程序中,main函数被WinMain函数取而代之,WinMain函数的原型如下:- int WINAPI WinMain(
- HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdshow
- )
每一个Win32应用程序都需要Windows.h头文件,它还包含了其他的一些Windows头文件。这些头文件定义了Windows的所有数据类型、函数调用、数据结构和符号常量。
WinMain函数通常要完成以下几步操作。
(1) 定义并调用API函数RegisterClass注册应用程序的窗口类。
(2) 调用相关API函数创建和显示窗口,并进行其他必要的初始化处理。其中,函数CreateWindow用于创建已注册窗口类的窗口。Windows每一个窗口都有一些基本属性,如窗口标题、窗口位置和大小、应用程序图标、鼠标指针、菜单和背景颜色等。窗口类就是充当这些属性的模板。CreateWindow函数具有如下的原型:
- HWND CreateWindow(
- LPCTSTR lpCIassName,
- LPCTSTR lpWindowName,
- DWORD dwStyle,
- int x,
- int y,
- int nWidth,
- int nHeight,
- HWND hWndParent,
- HMENU hMenu,
- HINSTANCE hInstance,
- LPVOID lpParam
- );
创建和启动应用程序的消息循环。Windows应用程序接受各种不同的消息,包括键盘消息、鼠标以及窗口产生的各种消息。Windows系统首先将消息放入消息队列中,应用程序的消息循环就是从应用程序的消息队列中检取消息,并将消息发送相应的窗口过程函数中作进一步处理。API函数GetMessage和DispatchMessage就是起到这样的作用。
(3) 如果接收到WM_QUIT消息,则退出应用程序。
窗口过程函数WndProc用来接收和处理各种不同的消息。
在该函数中主要处理以下消息:
① WM_PAINT消息
在case WM_PAINT语句后的代码用来将文本"这是一个Windows模板程序!"显示到窗口客户区。在绘制文本时需要先调用BeginPaint函数,用来返回指定窗口句柄的设备描述表句柄,设备描述表用来将程序与计算机外部输出设备连接起来。Hdc定义的是句柄HDC变量,TextOut等GDI函数都需要通过这样的HDC句柄来绘制图形和文本。EndPaint用来释放设备描述表句柄,并使先前无效区域变为有效,从而使Windows不再发送WM_PAINT消息。PAINTSTRUCT是"绘图信息结构",BeginPaint和EndPaint都需要PAINTSTRUCT结构变量作为自己的参数,并且这两个函数必须成对出现,所有的GDI函数的调用也应该在这两个函数之间进行。Textout函数是用来显示文本的最常用的GDI函数,它具有下列原型:
- BOOL Textout(
- HDC hdc,
- int nXStart,
- int nYStart,
- LPCTSTR lpString,
- int cbstring
- );
② WM_CHAR消息
在case WM_CHAR语句后的代码用来将通过键盘输入的字符绘制在窗口客户区的左上角。通过键盘输入字符的ASC码保存在参数wParam。利用函数sprintf将wParam转换为字符数组Buffer,最后调用Textout函数将字符数组Buffer显示在窗口客户区。
③ WM_LBUTTONDOWN消息
case WM_LBUTTONDOWN语句后代码的作用是以按下鼠标左键的点为圆心,绘制一个半径为10的圆。Ellipse函数用来绘制椭圆,其原型为:
- BOOL Ellipse(
- HDC hdc,
- int nLeftRect,
- int nTopRect,
- int nRightRect,
- int nBottomRect
- );
【责任编辑:
云霞 TEL:(010)68476606】