Windows 程序结构

来源:互联网 发布:捕鱼游戏网页版源码 编辑:程序博客网 时间:2024/05/21 02:49

与控制台程序相比,虽然编制一个Windows应用程序所需的代码要多得多,但是Windows应用程序所具有的强大功能和易操作的特性是控制台程序所不能比拟的。和其他应用程序一样,基于WindowsC++应用程序也有自己的结构,称为Win32应用程序结构。一个简单的Windows程序主要包括应用程序主函数WinMain函数和消息处理函数,WinMain函数的主要工作是定义窗口、注册窗口、显示窗口、消息循环;消息处理函数的主要工作是处理各类消息。下面的示例程序显示了一个简单的窗口程序的结构。 

例、一个简单的Windows程序。 

    在Visual C++开发环境下,创建一个空的Win32Application工程,添加如下代码

#include <windows.h>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);// 申明窗口函数int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdline,int nCmdShow)//Windows程序的入口为WinMain函数{HWND hwnd;//定义窗口句柄MSG msg;//定义消息结构变量WNDCLASS wndclass;//定义窗口类的结构变量wndclass.style=CS_HREDRAW|CS_VREDRAW;//改变窗口大小这重绘wndclass.lpfnWndProc=WndProc;//窗口函数为WndProcwndclass.cbClsExtra=0;//窗口类无扩展wndclass.cbWndExtra=0;//窗口实例无扩展wndclass.hInstance=hInstance;//注册窗口实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//用箭头光标wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//背景为白色wndclass.lpszMenuName=NULL;//窗口默认无菜单//窗口类名为windows窗口创建wndclass.lpszClassName=TEXT("windows窗体创建");/*注册窗口类*/if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("窗口注册失败!"),TEXT("windows窗体创建"),0);return false;}/*创建窗体*/hwnd=CreateWindow(TEXT("windows窗体创建"),//窗口类名windows窗体创建TEXT("windows窗体创建"),//窗口名windows窗体创建WS_OVERLAPPEDWINDOW,//重叠式窗口CW_USEDEFAULT,CW_USEDEFAULT,//左上角屏幕坐标默认值CW_USEDEFAULT,CW_USEDEFAULT,//窗口大小默认值NULL,//无父窗口NULL,//无子窗体hInstance,//创建值窗体实例句柄NULL//值窗体无创建参数);/*显示并更新窗口*/ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);//更新窗口,包括窗口的客户区//进入消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循环/*消息循环*/while (GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);//键盘消息转换DispatchMessage(&msg);//发送消息给窗口函数}return msg.wParam;//返回推出值}/*窗口函数*/LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lparam)//参数:句柄,消息,消息参数,消息参数{/*根据消息值转相应的消息处理*/switch (message){ case WM_PAINT://重绘窗口客户区消息处理HDC hdc;//定义设备描述表句柄PAINTSTRUCT ps;//定义绘图星系结构变量hdc=BeginPaint(hwnd,&ps);//获取要重绘的窗口的设备描述表句柄TextOut(hdc,10,20,TEXT("Hello World!"),strlen("Hello World!"));//输出文本EndPaint(hwnd,&ps);//结束要重绘的窗口return 0;case WM_DESTROY://撤销窗口消息处理PostQuitMessage(0);//产生退出程序消息WM_QUITreturn 0;case WM_LBUTTONDOWN://add by shufac 添加鼠标左键按下的消息响应MessageBox(NULL,TEXT("你好,我的C++世界!"),TEXT("问候"),0);return 0;}return DefWindowProc(hwnd,message,wParam,lparam);//其他消息交给有系统提供的缺省处理函数} 

运行结果:


 

这个Windows应用比控制台应用程序还是要复杂得多。但总可以将其分解成两个基本的函数结构。一个是WinMain函数,另一个是用户定义的窗口过程函数WndProc 

窗口过程函数WndProc用来接收和处理各种不同的消息,而WinMain函数通常要完成以下几步工作。

① 定义并调用API函数RegisterClass注册应用程序的窗口类。

② 调用相关API函数创建和显示窗口,并进行其他必要的初始化处理。其中,函数CreateWindow用来创建已经注册窗口类的窗口。Windows每一个窗口都有一些基本的属性,如窗口标题,窗口位置和大小、应用程序图标、鼠标指针、菜单和背景颜色等。窗口类就是充当这些属性的模板。创建窗口的函数CreateWindow,函数功能:该函数创建一个重叠式窗口、弹出式窗口或子窗口。它指定窗口类,窗口标题,窗口风格,以及窗口的初始位置及大小(可选的)。该函数也指定该窗口 的父窗口或所属窗口(如果存在的话),及窗口的菜单。若要使用除CreateWindow函数支持的风格外的扩展风格,则使用 CreateWindowEx函数代替CreateWindow函数。函数原型:

HWND CreateWindow(LPCTSTR lpClassName,//已注册的窗口类名LPCTSTR lpWindowName,//窗口标题DWORD dwStyle,//窗口风格int x,//窗口的水平位置int y,//窗口的垂直位置int nWidth,//窗口宽度int nHeight,//窗口高度HWND hWndParent,//父窗口句柄HMENU hMenu,//菜单句柄或控件标识HANDLE hlnstance,//应用程序实例句柄LPVOID lpParam//其他窗口创建时的参数数据);

③ 创建和启动应用程序的消息循环。Windows应用程序接收各种不同的消息,包括键盘消息、鼠标以及窗口产生的各种消息。Windows首先将消息放入消息队列中,应用程序的消息循环就是从应用程序的消息队列中检取消息,并将消息发送到相应的窗口过程函数中做进一步处理。API函数GetMessageDisPatchMessage就是起到这样的作用。

④ 如果收到WM_QUIT消息,则退出应用程序。

⑤ 编译并运行,在窗口中单击鼠标左键,就会弹出一个对话框,结果如下图所示:

 

上述Windows应用程序的基本流程还可以用下面的流程图表示:

 


0 0
原创粉丝点击