1.2.2 Windows应用程序框架结构(1)
Windows应用程序都具有相对固定的基本框架结构,由WinMain函数和窗口函数等构成。WinMain函数和窗口函数是Windows应用程序的主体。
1.入口函数
如同C语言的main函数一样,任何Windows应用程序都是由入口函数WinMain开始的。WinMain函数是在WINBASE.H中定义的,它的函数原形如下:
- int WINAPI WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nShowCmd);
函数说明如下。
hInstance:应用程序的实例句柄,这个实例句柄是程序的唯一标识。hPrevInstance:该参数用来检查是否有多个程序实例运行,由于Windows 9X和Windows NT(包括更高版本)是32位操作系统,该参数通常设置为NULL。lpCmdLine:一个指向字符串的指针,用来保存运行程序时的命令行参数。nShowCmd:指定程序开始的时候如何显示。
2.定义并注册窗口类
在Windows中如果要创建一个窗口,首先要定义窗口类,然后注册这个窗口类。定义窗口类是通过填充WNDCLASS结构体来完成的,此结构体是在WINUSER.H中定义的,它的结构体声明如下:
- typedef struct_WNDCLASS{
- UINT style;
- WNDPROC lpfnWndProc;
- int cbClsExtra;
- int cbWndExtra;
- HANDLE hInstance;
- HICON hIcon;
- HCURSOR hCursor;
- HBRUSH hbrBackground;
- LPCTSTR lpszMenuName;
- LPCTSTR lpszClassName;
- }WNDCLASSA,* PWNDCLASSA, NEAR * NPWNDCLASSA, FAR * LPWNDCLASSA;
结构体说明如下。style:指定窗口风格,可以为如表1.3所示的各种数值组合。
表1.3 Windows应用程序窗口风格
|
取值< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
说明 |
|
CS_VREDRAW |
垂直重画 |
|
CS_HREDRAW |
水平重画 |
|
CS_OWNDC |
独占设备描述表 |
|
CS_SAVEBITS |
保存窗口覆盖区 |
|
CS_DBCLKS |
允许两次连续按动 |
|
CS_BYTEALLGNCLIENT |
鼠标用户区域按字节对齐显示 |
|
CS_BYTEALLGNWINDOW |
鼠标用户窗口按字节对齐显示 |
|
CS_NOCLOSE |
系统菜单中没有CLOSE菜单项 |
lpfnWndProc:指向窗口过程的指针,必须使用CallWindowProc函数调用窗口过程。cbClsExtra:窗口类结构体之后分配的额外的字节数,系统将该值初始化为0。cbWndExtra:窗口实例之后分配的额外的字节数,系统将该值初始化为0,如果使用资源文件里的CLASS指令创建对话框,并用WNDCLASS注册该对话框时,cbWndExtra必须设置成DLGWNDOWEXTRA。hInstance:包含该窗口类实例的句柄。hIcon:标识窗口类图标的句柄,必须为一个图标资源的句柄,如果设置为NULL,系统将提供默认图标。hCursor:标识窗口类光标的句柄,必须为一个指针资源的句柄,如果设置为NULL,应用程序必须在指针移入应用程序窗口时显式设置指针类型。hbrBackground:窗口背景画刷的句柄,该成员或者是用于绘制背景的物理画刷的句柄,或者是一个颜色值。lpszMenuName:指向NULL结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样,如果使用一个整数标识菜单,可以使用MAKEINTRESOURCE宏,如果将lpszMenuName设置为NULL,那么窗口类的窗口将没有默认菜单。lpszClassName:指向一个以NULL结尾的字符串,该字符串定义了窗口类的名字。
定义好窗口类后,就可以通过函数RegisterClass注册该窗口,它的函数原型如下:
- ATON RegisterClass(CONST WNDCLASS *lpWndClass);
函数说明如下。
返回值:成功返回值是唯一标识已注册的类的一个原子,否则返回0。lpWndClass:指向一个WNDCLASS结构体的指针。
3.创建并显示窗口
完成定义和注册窗口类后,接下来应该创建并显示该窗口。创建一个窗口要使用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);
函数说明如下。
返回值:成功返回新窗口的句柄,否则返回NULL。lpClassName:指向NULL结束的字符串或整型数atom。lpWindowName:指向一个指定窗口名的以NULL结束的字符串指针。dwStyle:指定创建窗口的风格,可以为如表1.4所示的各种数值组合。
表1.4 Windows应用程序创建窗口的风格
|
取值 |
说明 |
|
WS_BORDER |
创建一个有边框的窗口 |
|
WS_CAPTION |
创建一个有标题栏的窗口 |
|
WS_CHILDWINDOW,WS_CHILD |
创建一个子窗口(不能与WS_POPUP一起使用) |
|
WS_CLIPCHILDREN |
当在父窗口内绘制时,把子窗口
占据的区域剪切在外,即不在该区域内绘图 |
(续表)
|
取值 |
说明 |
|
WS_CLIPSIBLINGS |
裁剪相互有关系的子窗口,不在被其他子窗口
覆盖的区域内绘图,仅与WS_CHILD一起使用 |
|
WS_DISABLED |
创建一个初始被禁止的窗口 |
|
WS_DLGFRAME |
创建一个有双边框但无标题的窗口 |
|
WS_HSCROLL |
创建一个带水平滚动条的窗口 |
|
WS_VSCROLL |
创建一个带垂直滚动条的窗口 |
|
WS_ICONIC |
创建一个初始为图标的窗口,仅可以与
WS_OVERLAPPEDWINDOWS一起使用 |
|
WS_MAXIMIZE |
创建一个最大尺寸的窗口 |
|
WS_MINIMIZE |
创建一个最小尺寸的窗口(即图标) |
|
WS_MAXIMIZEBOX |
创建一个带有极大框的窗口 |
|
WS_MINIMIZEBOX |
创建一个带有极小框的窗口 |
|
WS_OVERLAPPED |
创建一个重叠式窗口,重叠式窗口带有标题和边框 |
|
WS_POPUP |
创建一个弹出式窗口,不能与WS_CHILD一起使用 |
|
WS_SYSMENU |
窗口带有系统菜单框,仅用于带标题栏的窗口 |
|
WS_THICKFRAME |
创建一个边框的窗口,使用户可以直接缩放窗口 |
|
WS_VISIBLE |
创建一个初始可见的窗口 |