zoukankan      html  css  js  c++  java
  • 谈谈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


  • 相关阅读:
    随笔:判断一个范围内有多少质数,分别是多少
    随笔:判断一个整数是否是质数,如果不是质数,那么因数表达式是什么
    随笔:Python发送SMTP邮件方法封装
    Python基础学习:打印九九乘法表
    随笔:docker学习笔记(包括了基础学习和制作运行jar包的docker镜像,还有centos7防火墙这个坑)
    随笔:测试心得
    随笔:docker安装
    Python基础:Python连接MySQL数据库方法封装2
    随笔:Python打印临时日志、清空临时日志
    radio点击一下选中,再点击恢复未选状态
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468362.html
Copyright © 2011-2022 走看看