• 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程序设计 第五版 珍藏版》  
  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/zhanglixina/p/9614477.html
Copyright © 2020-2023  润新知