• 谈谈windows窗口注册和创建


    如图1是单文档应用程序的窗口,是由MFC向导程序帮我们创建和设计的,如果我们想自己创建一个类似的窗口,我们该怎么办呢?就像汽车公司想生产汽车,他们就要解决两个问题。


                                            图1 单文档窗口样式


    问题1:

     汽车形状是什么样子,汽车是什么颜色的等外观问题,这个问题可以由汽车设计图来解决,有了设计图我们就可以知道汽车长什么样子了。

    问题2:

    有了汽车设计图,还要有人去生产加工才行,工厂就是车辆创建的角色,工厂会按照设计图纸生产出符合预期的车辆。


    按照这个思路,一个窗口的创建需要以下几个步骤:

    第一:需要窗口的设计图(比如标题栏是什么图标,鼠标是什么形状,窗口背景是什么颜色)
    第二:我们需要将窗口的设计图纸提交给(注册)windows系统,
    第三:如果提交成功了,windows就会按照这个图纸去创建我们需要的窗口
    第四:如果有必要,我们还要把它显示出来,默认窗口仅存在于内存中。


    关于设计图纸

        微软给我们提供了WNDCLASS结构体,这个结构体指示了我们要创建怎样的窗口,lpszClassName是这个窗口的唯一标识,如下是具体内容:

    typedef struct   
    {  
        UINT style;             //这一类型窗口的样式  
        WNDPROC lpfnWndProc;    //指向窗口过程的函数指针  
        int cbClsExtra;         //类附加内存  
        int cbWndExtra;         //窗口附加内存  
        HINSTANCE hInstance;    //实例句柄  
        HICON hIcon;            //窗口类的图标句柄  
        HCURSOR hCursor;        //窗口类的光标句柄  
        HBRUSH hbrBackground;   //窗口类的背景      
        LPCTSTR lpszMenuName;   //菜单名字  
        LPCTSTR lpszClassName;  //窗口类名字,是窗口类的唯一标识  
    } WNDCLASS;  

    关于注册窗口信息

        微软给我们提供了RegisterClass函数,它的入参是WNDCLASS对象指针,也就是告诉系统我要创建窗口的具有的特征,其函数声明如下:

    ATOM RegisterClass(const WNDCLASS* lpWndClass); 


    关于创建窗口

          系统有了窗口的设计图纸,就开始生成这个窗口,微软提供了CreateWindow函数,第一个参数是窗口类的名称,也就是WNDCLASS结构体中的lpszClassName,第二个是当前这个窗口的名字,具体函数声明见如下代码:

    HWND CreateWindow(LPCTSTR lpClassName,  //指定窗口类的名称,需要和WNDCLASS的className一样。  
                      LPCTSTR lpWindowName, //窗口的名字  
                      DWORD dwStyle,        //创建的窗口样式  
                      int x,                //窗口左上角的x坐标  
                      int y,                //窗口左上角的y坐标  
                      int nWidth,           //窗口宽度  
                      int nHeight,          //窗口高度  
                      HWND hWndParent,      //父窗口句柄  
                      HMENU hMenu,          //窗口菜单的句柄  
                      HANDLE hInstance,     //应用程序句柄  
                      PVOID lpParam );      //附件参数,多文档窗口为CLIENTCREATESTRUCT结构体,其余多是NULL 

    关于显示

       当我们把窗口按照设计图纸给创建后,我们还可以调用ShowWindow函数来展示我们设计的窗口,其函数声明如下:                         

    BOOL ShowWindow(HWND hWnd, int nCmdShow)
    hWnd 
       指示要显示哪个窗口
    nCmdShow
       指示要窗口的状态,有如下取值范围,具体含义见MSDN
       SW_HIDE  
       SW_SHOW  
       SW_SHOWNA  
       SW_SHOWNORMAL 

    从以上内容可以知道,一个窗口的最终外观由两部分决定:

    一个是WNDCLASS结构体中的部分参数比如光标,图标,窗口背景;另一部分是CreateWindow接口中的部分参数,比如宽度、高度,位置信息,以及这个窗口的名字。

    如果想修改窗口的外观也是从这两个反向进行修改。

     

    参考以下两篇文章也有助于理解窗口类的注册和创建,链接如下:

    http://blog.csdn.net/c_base_jin/article/details/52263627

    http://blog.sina.com.cn/s/blog_520f749201009bgi.html


  • 相关阅读:
    【SICP练习】63 练习2.34
    【SICP练习】62 练习2.33
    【SICP练习】61 练习2.31-2.32
    【SICP练习】60 练习2.30
    【SICP练习】59 练习2.29
    【SICP练习】58 练习2.28
    【SICP练习】57 练习2.27
    【SICP练习】56 练习2.24-2.26
    【SICP练习】55 练习2.23
    【SICP练习】54 练习2.22
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468362.html
Copyright © 2020-2023  润新知