分享

Win32窗口创建流程--

 lhzstudio 2011-09-24

窗口类风格

CS_DBLCLKS              鼠标指针在窗口内时,用户双击鼠标,向响应的窗口类的Windows Procedure发送双击消息

CS_CLASSDC             同一窗口类的所有窗口共享一个设备环境

CS_GLOBALCLASS    允许所有应用程序创建此类的窗口,不用考虑传递给CreateWindowEx()函数的hInstance参数的值。

CS_HREDRAW          如果客户区宽度改变或者移动窗口,重绘整个窗口

CS_VREDRAW          如果客户区高度改变或者移动窗口,重绘整个窗口

CS_NOCLOSE            禁用系统菜单中的关闭命令项

CS_OWNDC              为此类窗口中的每个窗口分配一个唯一的设备环境(上下文)

CS_PARENTDC                   设置父窗口中的子窗口的剪贴区域,以便在父窗口上绘制子窗口

CS_SAVEBIT                        将被窗口覆盖的屏幕图像部分作为位图保存,这种风格类型对于小的窗口很有用(例如菜单或者对话框),这类窗口在屏幕上只是暂时显示,其他的屏幕操作执行之前,它就会消失。

 

 

应用程序创建窗口之前必须先定义和注册一个相应的窗口类,

老的是WNDCLASS,扩展的是WNDCLASSEX

WNDCLASSEX增加两项内容,1是保存结构大小的变量,2是小图标的句柄

 

typedef struct _WNDCLASSEX{

UINT                 cbSize                          ;                 //WNDCLASSEX结构的大小

UINT                  style                            ;                 //窗口风格类型

WNDPROC      lpfnWndProc;                     //Windows Procedure地址

int                       cbClsExtra        ;                           //类的扩展信息

int                    cbWndExtra     ;                           //窗口的扩展信息

HANDLE            hInstance         ;                           //应用程序实例句柄

HICON               hIcon        ;                           //应用程序大图标的句柄

HCURSOR        hCursor;                              //鼠标指针句柄

HBRUSH           hbrBackground;                 //窗口背景色

LPCTSTR         lpszMenuName;                //主菜单名

LPCTSTR           lpszClassName;                 //窗口类名

HICON               hIconSm;                             //应用程序小图标句柄

}WNDCLASSEX

 

1.       创建窗口类

WNDCLASSEX   windowClass;

2.       窗口属性设置

windowClass.cbSize=sizeof(WNDCLASSEX);

 

窗口风格类型数据成员用来描述窗口的一般特性

windowClass.style=CS_VREDRAW|CS_HREDRAW

 

Windows Procedure的地址赋给lpfnWndProc

wndowClass.lpfnWndProc=WndProc;

 

结构成员cbClsExtracbWndExtra应被设置为0cbClsExtra用来指定分配给窗口类结构的扩展字节的大小,cbWndExtra指定了分配给窗口实例的扩展字节的大小。

 

hInstance用于保存当前应用实例的句柄,可以从WinMain()中得到。

 

3.       图标和鼠标指针的加载

应用程序的图标和鼠标指针也需要在窗口类结构中定义。用户可以自定义这些资源,也可以使用windows系统提供的内建资源

可以为一个窗口类创建两个图标:一个大的一个小的。小图标用于系统菜单或者当应用程序最小化时在任务栏中的显示。大图标用于在文件、文件夹中和桌面上表示窗口。

LoadIcon()加载图标。

 

HICON       LoadIcon(HINSTANCE hInst,LPCSTR lpszName);

参数lpszName指定图标资源

参数hInst指定包含此图标资源的模块的句柄

函数返回指向此图标的一个句柄。

 

如果使用windows提供的内建图标资源,只需将参数hInst赋值为NULL,然后lpszName赋值为系统内建图标资源的图标宏。

例如:系统默认的应用程序图标宏是IDI_APPLICATION

           windClass.hIcon       =       LoadIcon(NULL,IDI_APPLICATION);

小图标同样

           windClass.hIconSm =       LoadIcon(NULL,IDI_WINLOGO);

IDI_APPLICATION               默认应用程序图标

IDI_ASTERISK                      星状图标

IDI_ERROR                           手型图标

IDI_EXCLAMATION            惊叹号图标

IDI_HAND                                      手型图标

IDI_INFORMATION            星状图标

IDI_QUESTION                    问号图标

IDI_WARNING                     惊叹号图标

IDI_WINLOGO                     Windows标志图标

 

LoadCursor()加载鼠标指针资源。

HCURSOR LoadCursor(HINSTANCE  hInst,     LPCSTR     lpszName)

参数hInst指定包含资源的模块的句柄

参数lpszName指定资源

返回指向指针的句柄。

 

如果使用windows提供的内建指针资源,将参数hInst设置为NULL,lpszName设置为内建宏。

例如:默认的箭头指针宏是IDC_ARROW

           windowClass.hCursor      =       LoadCursor(NULL,IDC_ARROW);

IDC_APPSTARTING            带小沙漏的标准箭头指针

IDC_ARROW                        标准箭头指针

IDC_CROSS                          十字指针

IDC_HELP                             带问号的箭头指针

IDC_IBEAM                          工字梁指针

IDC_NO                                 禁止符号指针

IDC_SIZEALL                        四向箭头指针

IDC_SIZENS                          南北双向箭头指针

IDC_SIZEWE                        东西双向箭头指针

IDC_SIZEWNSE                   西北-东南双向箭头指针

IDC_SIZENESW                   东北-西南双向箭头指针

IDC_UPARROW                            垂直向上箭头指针

IDC_WAIT                             沙漏指针

 

4.       完整窗口类示例

WNDCLASSEX   windowClass;

 

windowClass.cbSize          =       sizeof(WNDCLASSEX);               //设置窗口类数据结构大小

windowClass.style             =       CS_HREDRAW|CS_VREDRAW          //设置窗口类风格(重绘类型)

windowClass.lpfnWndProc       =       (WNDPROC)WndProc;     //函数指针(窗口消息过程)

windowClass.cbClsExtra  =       0;                                                   

windowClass.cbWndExtra        =       0;

windowClass.hInstance   =       hInstance;                                    //应用程序实例

windowClass.hIcon            =       NULL;                                             //无图标

windowClass.hCursor       =       LoadCursor(NULL,IDC_ARROW);    //鼠标

windowClass.hbrBackgroudn   =       NULL;                                   //无背景刷

windowClass.lpszMenuName  =       NULL;                                   //无菜单

windowClass.lpszClassName   =       “MyClass”;                         //窗口类名

windowClass.hIconSm      =       NULL;                                             //无小图标

 

RegisterClassEx(&windowClass)      ;                                             //注册窗口类

5.        窗口的创建

窗口创建函数:

           CreateWindow()

           CreateWindowEx()

HWND       CreateWindowEx(

           DWORD            dwExStyle,                          //窗口的扩展风格类型

           LPCTSTR            lpClassName,                     //指向已注册的窗口类名字的指针

           LPCTSTR            lpWindowName,               //指向窗口名字的指针

           DWORD            dwStyle,                               //窗口风格类型

           int                       x,                                           //窗口的水平位置

           int                       y,                                            //窗口的垂直位置

           int                       nWidth,                                //窗口宽度

           int                       nHeight,                              //窗口高度

           HWND               hWndParent,                      //父窗口句柄

           HMENU             hInstance,                           //菜单或者子窗口标识的句柄

           LPVOID              lpParam);                                      //窗口创建数据的指针

 

lpClassName 窗口类名字 此处应为” MyClass”

lpWindowName应用程序窗口顶部的标题栏文本

dwSytle

WS_BORDER                       细线边界

WS_CAPTION                      有标题栏(包括WS_BORDER风格)

WS_CHILD                            是子窗口,不能和WS_POPUP一同使用

WS_HSCROLL                      有水平滚动条

WS_ICONIC                          初始状态是最小化的窗口,等效于WS_MINIMIZE

WS_MAXIMIZE                   初始化状态是最大化的窗口

WS_MAXIMIZEBOX                     具有最大化按钮,不能与WS_EX_CONTEXTHELP组合使用,必须同时指定WS_SYSMENU风格

WS_MINIMIZE                             初始化是最小化的窗口,与WS_ICONIC等效

WS_MINIMIZEBOX                     具有最小化按钮,不能与WS_EX_CONTEXTHELP组合使用,必须同时指定WS_SYSMENU风格

WS_OVERLAPPED                        重叠窗口,重叠窗口具有标题栏和边界,与WS_TILED等效

WS_OVERLAPPENDWINDOW

                                                重叠窗口,同时具有:WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX,WS_TILEDWINDOW等效

WS_POPUP                           弹出式菜单窗口,不能和WS_CHILD一起使用

WS_POPUPWINDOW        同时具有WS_BORDER,WS_POPUP,WS_SYSMENU的弹出式菜单窗口,WS_POPUPWINDOWWS_CAPTION必须一起使用使窗口菜单可见

WS_SIZEBOX                        具有胶条边界,与WS_THICKFRAME风格等效

WS_SYSMENU                              标题栏上有菜单的窗口,WS_CAPTION必须同时指定

WS_VISIBLE                         初始化状态为可见

WS_VSCROLL                                具有垂直滚动条

6.       创建窗口实例

hwnd                   =       CreateWindowEx(

                             NULL,                                             //无扩展风格

                             “MyClass”,                                   //窗口类名

                             “MY_Window”,                           //窗口标题

                             WS_OVERLAPPEDWINDOW    //窗口风格

                             |WS_CLIPSIBLINGS,

                             0,0,200,200,                                //窗口位置大小

                             NULL,                                             //无父窗口

                             NULL,                                             //无菜单

                             hInstance,                                    //应用程序实例

                             NULL);                                           //无扩展窗口创建参数

窗口创建后不是立即可见,可以加入WS_VISIBLE风格使窗口创建初始状态为可见

没有加入WS_VISIBLE需调用ShowWindow()显示窗口

ShowWindow(hwnd,nCmdShow);

nCmdShow来自程序入口函数WinMain().

 

要强制刷洗窗口中的内容,向Windows Procedure发送WM_PAINT消息需要调用

UpdateWindow();

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多