上面的LoadIcon()、LoadCursor()、GetStockObject()都是Windows的API函数,它们的用法可以参看VC的帮助,这里就不多介绍了。
lpszMenuName成员的值我们给它NULL,表示该窗口将没有菜单。如果你想让你的窗口拥有菜单,就把lpszMenuName成员赋值为标志菜单资源的字符串。
WNDCLASS结构的最后一个成员lpszClassName是让你给这个窗口类起一个唯一的名称,因为Windows操作系统中有许许多多的窗口类,必须用一个独一无二的名称来代表它们。通常,你可以用你的程序名来命名这个窗口类的名称。这个名称将在创建窗口的CreateWindow()函数中用到。
填充完毕后,对于WNDCLASS结构,调用RegisterClass()函数进行注册;对于WNDCLASSEX结构,调用RegisterClassEx()函数进行注册,它们的原型分别如下:
ATOM RegisterClass( CONST WNDCLASS *lpWndClass );
ATOM RegisterClassEx( CONST WNDCLASSEX *lpwcx );
该函数如调用成功,则返回一个非0值,表明系统中已经注册了一个名为EasyWin的窗口类。如果失败,则返回0。
创建窗口当窗口类注册完毕之后,并不会有窗口显示出来,因为注册的过程仅仅是为创建窗口所做的准备工作。实际创建一个窗口的是通过调用CreateWindow()函数完成的。窗口类中已经预先定义了窗口的一般属性,而CreateWindow()中的参数可以进一步指定一个窗口的更具体的属性,在EasyWin程序中,是如下调用CreateWindow()函数来创建窗口的:
hwnd = CreateWindow(
"EasyWin", //创建窗口所用的窗口类的名称*
"一个基本的Win32程序", //窗口标题
WS_OVERLAPPEDWINDOW, //窗口风格,定义为普通型*
100, //窗口位置的x坐标
100, //窗口位置的y坐标
400, //窗口的宽度
300, //窗口的高度
NULL, //父窗口句柄
NULL, //菜单句柄
hInstance, //应用程序实例句柄*
NULL ); //一般都为NULL
CreateWindow()函数的参数的含义在上面的注释中已有介绍,注释后打了星号标记的参数应该着重注意,其它的参数都很简单,不多做介绍,可参看VC的帮助。
第一个参数是创建该窗口所使用的窗口类的名称,注意这个名称应与前面所注册的窗口类的名称一致。
第三个参数为创建的窗口的风格,下表列出了常用的窗口风格:
风格 含义 WS_OVERLAPPEDWINDOW 创建一个层叠式窗口,有边框、标题栏、系统菜单、最大最小化按钮,是以下几种风格的集合:WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX WS_POPUPWINDOW 创建一个弹出式窗口,是以下几种风格的集合: WS_BORDER,WS_POPUP,WS_SYSMENU。WS_CAPTION与WS_POPUPWINDOW风格必须一起使用才能使窗口菜单可见 WS_OVERLAPPED 创建一个层叠式窗口,它有标题栏和边框,与WS_TILED风格一样 WS_POPUP 该窗口为弹出式窗口,不能与WS_CHILD同时使用 WS_BORDER 窗口有单线边框 WS_CAPTION 窗口有标题栏 WS_CHILD 该窗口为子窗口,不能与WS_POPUP同时使用 WS_DISABLED 该窗口为无效,即对用户操作不产生任何反应 WS_HSCROLL 窗口有水平滚动条 WS_ICONIC 窗口初始化为最小化 WS_MAXIMIZE 窗口初始化为最大化 WS_MAXIMIZEBOX 窗口有最大化按钮 WS_MINIMIZE 与WS_MAXIMIZE一样 WS_MINIMIZEBOX 窗口有最小化按钮 WS_SIZEBOX 边框可进行大小控制的窗口 WS_SYSMENU 创建一个有系统菜单的窗口,必须与WS_CAPTION风格同时使用 WS_THICKFRAME 创建一个大小可控制的窗口,与WS_SIZEBOX 风格一样. WS_TILED 创建一个层叠式窗口,有标题栏 WS_VISIBLE 窗口为可见 WS_VSCROLL 窗口有垂直滚动条
程序中使用了WS_OVERLAPPEDWINDOW标志,它是创建一个普通窗口常用的标志。而在DirectX编程中,我们常用的是WS_POPUP,用这个标志创建的窗口没有标题栏和系统菜单,如果设定窗口为最大化,客户区可以占满整个屏幕,以满足DirectX编程的需要。
CreateWindow()函数后面的参数中,仍用到了该应用程序的实例句柄hInstance。
如果窗口创建成功,返回值是新窗口的句柄,否则返回NULL。
显示和更新窗口窗口创建后,并不会在屏幕上显示出来,要真正把窗口显示在屏幕上,还得使用ShowWindow()函数,其原型如下:
BOOL ShowWindow( HWND hWnd, int nCmdShow );
参数hWnd指定要显示得窗口的句柄,nCmdShow表示窗口的显示方式,这里指定为从WinMain()函数的nCmdShow所传递而来的值。
由于ShowWindow()函数的执行优先级不高,所以当系统正忙着执行其它的任务时,窗口不会立即显示出来,此时,调用UpdateWindow()函数以可以立即显示窗口。其函数原型如下:
BOOL UpdateWindow( HWND hWnd ); 消息循环
在Win32编程中,消息循环是相当重要的一个概念,看似很难,但是使用起来却是非常简单。在WinMain()函数中,调用InitWindow()函数成功的创建了应用程序主窗口之后,就要启动消息循环,其代码如下:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Win32编程基础知识