windows窗口的创建有以下几个步骤:

1、创建注册窗口类

2、创建窗口句柄

3、显示更新窗口

4、消息循环

1、创建注册窗口类

所谓创建窗口类就是定义一个WNDCLASS类对象,并将该对象进行初始化。之后就要用RegisterClass()函数对该窗口类对象进行注册,以便使某个窗口与该窗口类相关联。

关于WNDCLASS的定义如下:

 typedef struct {

    UINT style;

    WNDPROC lpfnWndProc;

    int cbClsExtra;

    int cbWndExtra;

    HINSTANCE hInstance;

    HICON hIcon;

    HCURSOR hCursor;

    HBRUSH hbrBackground;

    LPCTSTR lpszMenuName;

    LPCTSTR lpszClassName;

} WNDCLASS, *pWNDCLASS;

成员:style

描述类风格。该成员可以是“Class Styles”的任意组合,styly可以取的值如下所示:

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    包含该类实例的句柄,该实例包含了窗口过程。一般直接赋上WinMain()的hInstance参数值即可。

hIcon    类图标的句柄。该成员必须为一个图标资源的句柄。可以使用LoadIcon()函数加载图标。如果hIcon为NULL,系统将提供默认图标

hCursor    鼠标指针的句柄。改成员必须为一个指针资源的句柄。可以使用LoadCursor()去加载光标。如果hCursor为NULL,应用程序必须在指针移入应用程序窗口时显式设置指针类型。hbrBackground    背景画刷的句柄。该成员或者是用于绘制背景的物理画刷的句柄,或者是一个颜色值。颜色值必须为如下“标准系统颜色值”(值1必须加到选定颜色中):

BLACK_BRUSH   

DKGRAY_BRUSH

GRAY_BRUSH

HOLLOW_BRUSH  空画刷(相当于NULL_BRUSH) 

LTGRAY_BRUSH

NULL_BRUSH    等同于HOLLOW_BRUSH

WHITE_BRUSH   

BLACK_PEN

WHITE_PEN

NULL_PEN

SYSTEM_FONT  默认情况下,系统使用系统字体去绘制菜单、控制对话框和文本等。

DEFAULT_PALETTE  默认的调色板,这个调色板由系统调色板中的静态颜色组成。

如果颜色值给定后,必须将该值转换成如下HBRUSH类型:

COLOR_ACTIVEBORDER

    COLOR_ACTIVECAPTION

    COLOR_APPWORKSPACE

    COLOR_BACKGROUND

    COLOR_BTNFACE

    COLOR_BTNSHADOW

    COLOR_BTNTEXT

    COLOR_CAPTIONTEXT

    COLOR_GRAYTEXT

    COLOR_HIGHLIGHT

    COLOR_HIGHLIGHTTEXT

    COLOR_INACTIVEBORDER

    COLOR_INACTIVECAPTION

    COLOR_MENU

    COLOR_MENUTEXT

    COLOR_SCROLLBAR

    COLOR_WINDOW

    COLOR_WINDOWFRAME

    COLOR_WINDOWTEXT

当调用UnregisterClass时,系统自动删除背景画刷。应用程序不应删除这些画刷。

    当hbrBackground为NULL时,应用程序必须在绘制客户区域时绘制它自己的背景。为了确定背景是否一定要绘制,应用程序或者可以处理 WM_ERASEBKGND消息,或者测试PAINTSTRUCT的fErase成员。PAINTSTRUCT是由BeginPaint函数填充的。

lpszMenuName    指向NULL结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样。若使用一个整数标识菜单,可以使用MAKEINTRESOURCE宏。如果lpszMenuName为NULL,那么该窗口类的窗口将没有默认菜单。

lpszClassName    指 向NULL结束的字符串,或者是一个原型(atom)。若该参数是一个原型,它必须是一个有先前调用RegisterClass或者RegisterClassEx函数产生的类原型。类原型必须作为lpszClassName的低字,高字必须为0.若lpszClassName是一个 字符串,它描述了窗口类名。这个类名可以是由RegisterClass或者RegisterClassEx注册的名字,或者是任何预定义的控件类名。

结构信息。

 


2、创建窗口句柄

HWND hWnd ;

 hWnd = CreateWindowEx(WS_EX_TOPMOST , 

     "CreateWindows" ,

     "测试" ,

     WS_POPUP ,

     0 , 

     0 ,

     1024 ,

     768 ,

     NULL ,

     NULL ,

     hInstance ,

     NULL) ;

 if(!hWnd)

 {

  return FALSE ;

 }

 

3、显示更新窗口

ShowWindow(hWnd , nCmdShow) ;

 UpdateWindow(hWnd) ;

4、消息循环

MSG msg ;

 while(true)

 {

  if(PeekMessage(&msg , NULL , 0U , 0U , PM_REMOVE))

  {

   TranslateMessage(&msg) ;

   DispatchMessage(&msg) ;

  }

 }