• WINDOWS程序设计(003)----窗口类的注册


    应该结合(002)中的程序例子好好地理解,有十分大的帮助.
    链接:WINDOWS程序设计(002)—-HELLOWIN程序(源代码及详细解析) WINDOWS程序原理

    1.WNDCLASS类型结构的定义

      在WinMain中,我们通常用如下形式定义一个WNDCLASS类型的结构.(定义方式参考后面的附表)
      
      然后对该结构的10个字段进行初始化,并调用RegisterClass函数.

      在WNDCLASS结构中,两个最重要的字段是第二个字段和最后一个字段.
      第二个字段(lpfnWndProc)是用于基于该窗口类的所有窗口过程的地址.在HELLOWIN中,该窗口过程就是WndProc.
      最后一个字段是窗口类的名称,允许用户任意命名.当程序只创建一个窗口时,窗口类的名称通常与程序名相同.
      
      另外几个字段描述了窗口类的其他一些特性.下面考察WNDCLASS结构的每个字段.

    (1) style

      以下语句用C语言的按位亦或运算符,组合了两个32位的”类风格”(class style)的标识符:
      
      在头文件WINUSER.H中,所有前缀为CS的标识符定义如下:

      这种方式定义的标识符常常被称为”位标记“(bit flag),因为每个标识符都只能影响复合值的一位.在这些类风格中,只有少数会被经常使用.程序HELLOWIN使用了两个标识符,以指定无论何时窗口的水平尺寸(CS_HREDRAW)或垂直尺寸(CS_VREDRAW)被改变,所有基于该窗口类的窗口都将被重新绘制.在调整HELLOWIN的窗口尺寸时,可以发现,文本字符串被重新绘制在窗口新的中心位置上.真是这两个标识符确保了这种结果.稍后我们将了解窗口尺寸的变化是如何通知给窗口过程的.

    (2) lpfnWndProc

      对于WNDCLASS结构中的第二个字段,初始化语句如下:
      
      该语句将该窗口的窗口过程设为WndProc函数,即HELLOWIN.C中的第二个函数.这个函数将处理传递给所有的基于该窗口类创建的窗口的所有消息.在C语言中,当在语句中按这种方式使用函数名时,我们引用的实际上是指向函数的指针.

    (3&4) cbClsExtra & cbWndExtra

      下面两个字段用于在类结构和Windows内部维护的窗口结构中预留一些额外的空间:
      
      
      应用程序可以根据需要来使用这些额外的空间.HELLOWIN中没有用到这个特性,因此将这两个参数覆位0.否则,正如匈牙利标记法所表示的,这些字段可以被设为一个”字节数”.

    (5) hInstance

      接下来的字段表示应用程序的实例句柄(是WinMain的一个参数):
      

    (6) hIcon

      下面的语句为所有的基于该窗口类的窗口设定一个图标:
      
      IDI表示”图标的标识符”(ID for an icon).
      HICON,表示”图标的句柄”(handle to an icon).

    (7) hCursor

      
      LoadCursor函数载入一个预定义的鼠标指针(称为IDC_ARROW),并返回指针的句柄.该句柄被用来设定WNDCLASS结构的hCursor字段.当鼠标指针出现在这类窗口的客户区内时,将变成一个小箭头.

    (8) hbrBackground

      下一个字段为窗口的客户区指定了背景色.字段名hbrBackground的前缀hbr表示”画刷的句柄”(handle to a brush).画刷是一个图形学术语,表示用于区域填充的像素着色模式.Windows有几个标准的画刷,又称为”库存”画刷.下面对GetStockObject的调用返回一个白色画刷的句柄:
      
      这意味着窗口客户区的背景将被填充为白色.

    (9) lpszMenuName

      接下来一个字段指定了窗口类的菜单.由于HELLOWIN不带任何菜单,所以该字段被设为NULL:
      

    (10) lpszClassName

      最后,必须为窗口类赋予一个名称.对于一个小程序来说,这个名称可以简单地利用程序名表示,如保存在变量szAppName中的字符串”HelloWin”:
      
      这个字符串既可以由ASCII字符组成,也可以由Unicode字符组成,美文的英文具体取决于UNICODE标识符是否已经被定义.

    当WNDCLASS结构的所有10个字段完成初始化之后,程序HELLOWIN调用函数RegisterClass来完成该窗口类的注册.该函数的唯一参数就是一个指向WNDCLASS结构的指针.

    2.附表

    ASCII版本WNDSLASSA:

      该结构的Unicode版本定义如下:

      头文件WINUSER.H在定义了WNDCLASSA和WNDCLASSW结构之后(另外还定义了指向这些结构的指针),又基于UNICODE标识符的定义定义了WNDCLASS结构和指向WNDCLASS结构的指针(将一些指针包含进来,目的是保持向后的兼容性):

    书中的原话:

     在本书中,当我介绍后续结构时,将只给出这些结构在功能上等效的定义,例如对WNDCLASS来说.其等效的定义如下:

    同时,我也放宽了各种指针的定义.相信你也绝对不会在代码中乱堆一些LP和NP为首的变量类型.



    《Windows程序设计 第五版 珍藏版》  
  • 相关阅读:
    让 ijkplayer 支持兼容armv7 armv7s
    以太网私网建立:同一台电脑,不同电脑运行多个节点。
    solidity 语言总结笔记
    web.js 方法详解
    Fabric 环境搭建
    浅谈区块链1
    以太坊私链建立和geth的使用
    搭建联盟链
    fabric 网络 合约部署 和 测试
    【Advanced Windows Phone Programming】番外篇 WP8与WP7
  • 原文地址:https://www.cnblogs.com/zhanglixina/p/9614477.html
Copyright © 2020-2023  润新知