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程序设计 第五版 珍藏版》

原文地址:https://www.cnblogs.com/zhanglixina/p/9614477.html

时间: 2024-10-14 09:21:52

WINDOWS程序设计(003)----窗口类的注册的相关文章

windows 程序设计自学:窗口正中显示Hello,World

1 #include <windows.h> 2 3 LRESULT CALLBACK MyWndProc( HWND hwnd, // handle to window 4 UINT uMsg, // message identifier 5 WPARAM wParam, // first message parameter 6 LPARAM lParam // second message parameter 7 ); 8 9 int WINAPI WinMain( HINSTANCE h

Win32API全局窗口类的注册与创建

  Win32API全局窗口类的注册 应用程序全局窗口类的注册 typedef struct tagWNDCLASSEX { UINT      cbSize; //结构体的大小,用sizeof得出 UINT      style; //窗口类的风格,默认设置左右画出 WNDPROC   lpfnWndProc; //回调函数,窗口处理函数,干活的人 int       cbClsExtra; //窗口类的附加数据Buff的大小 int       cbWndExtra; //窗口的附加数据Bu

Windows核心编程05-窗口类的注册

窗口类 窗口类包含了窗口的各种参数信息的数据结构.每个窗口都具有窗口类,基于窗口类创建窗口.每个窗口类都具有一个名称,使用前必须注册到系统. 窗口类的分类 -系统窗口类 系统已经定义好的窗口类,所有应用程序都可以直接使用 -应用程序全局窗口类 由用户自己定义,当前应用程序的所有模块都可以使用 容易产生冗余 -应用程序局部窗口类 由用户自己定义,当前应用程序中本模块可以使用 建议使用这个,局部窗口类可以代替全局窗口类 系统窗口类的注册 不需要注册,直接使用窗口类即可.系统已经定义好相应名称,例如

MFC注册窗口类以及FindWindow按窗口类名查询(避免用#32770获取窗口句柄)

呵呵,最近在研究SendMessage函数,其中需要用到m_hWnd,之后延伸着又尝试获得窗口的句柄,于是遇到了FindWindow函数,原型如下: HWND FindWindow ( LPCSTR lpClassName,    //输入窗口的类名,其实需要是注册过的类名才行,否则是要报错或者查找失败的. LPCSTR lpWindowName, //输入窗口的名称,就是窗口上面蓝色的那行玩意儿写的字. ); 对于这个函数,如果按照窗口的名称查找,相信大家都非常简单,因为名称在rc文件里,是已

Windows 程序设计 复习笔记(共 77 问)

Windows 程序设计 复习笔记(共 77 问) (个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42706501) 知识点 双字节字符集和Unicode字符集有何区别?采用双字节字符集有何问题 双字节字符集(DBCS)编码是0-255,DBCS含有1字节代码与2字节代码,而Unicode是统一的16位系统,这样就允许表示 65536个字符.Unicode中的每个字符都是16位宽而不是8位宽.在Unicode中,

Window 窗口类

窗口类 WNDCLASS 总结 总结为下面的几个问题: 1. 什么是窗口类 2. 窗口类的三种类型 3. 窗口类各字段含义 4. 窗口类的注册和注销 5. 如何使用窗口类,子类化.超类化是什么 下面分别描述: 1. 什么是窗口类? 窗口类定义了一系列属性,系统使用这些属性作为模板来创建出一个或多个 window (窗口). 每个窗口类都关联了一个窗口过程函数(window procedure), 由窗口类创建出的所有窗口(window), 都共享同一个窗口过程函数. 在进程中创建窗口之前必须先注

窗口类(Window Class)概述

windows窗口编程(通常意义上的win32)有几个比较核心的概念:入口函数WinMain.窗口类Window Class.窗口过程.消息处理机制.通用控件.本文主要介绍窗口类的相关概念,包括: 窗口类的类型: 窗口类的注册及使用: 窗口类的构成. 窗口类是基于进程的,每个应用程序在创建窗口之前必须注册窗口类(或者使用操作系统定义的窗口类),使用完成之后需要销毁(反注册). 介绍窗口类的主要目的在于明确windows窗口编程的相关概念,掌握windows内部对于GUI处理的机制.如果你在用mf

VC++编程之第三课笔记——MFC窗口创建过程以及窗口类的封装

第三课 MFC窗口创建过程以及窗口类的封装 MFC的每一个类都是以C开头的,表明这是一个Class. 工程包含(单文档) 创建工程名为aaa的工程(单文档)时,在类视图中可看见五个类: CAboutDlg CMainFrame CAaaApp CAaaDoc CAaaView 其中: 类CAboutDlg继承自CDialog类,对话框的类 类CMainFrame继承自CFrameWnd类,创建整个程序的框架窗口 类CAaaApp继承自CWinApp类,创建唯一的应用程序对象 类CAaaDoc继承

《Windows程序设计》读书笔九 子窗口控件

第九章 子窗口控件 子窗口可以作为控制屏幕图形显示,响应用户输入,以及在有重要输入事件的时候通知另一窗口. 标准子窗口控件,按钮,复选框,编辑框,列表框,组合框,文本字符串和滚动条. 可以使用CreateWindow来创建子窗口控件,或者在程序的资源脚本里编辑好各种属性. 使用预定义控件不需要再注册相应的子窗口类,这些类已经存在于windows中并且已经有了预定义的名称. 在调用CreateWindow时,只需要使用该名称作为窗口类的参数即可. 在窗口表明直接创建子窗口,所涉及的任务比使用对话框