《windows环境下32位汇编语言程序设计》

下载本书

添加书签

windows环境下32位汇编语言程序设计- 第14节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!

  HbrBackground      DWORD      ?     ;背景色

  LpszMenuName       DWORD      ?     ;窗口菜单

  LpszClassName      DWORD      ?     ;类名字符串的地址

  HIconSm                DWORD      ?     ;小图标

WNDCLASSEX ENDS

在FirstWindow程序中,注册窗口类的代码是:

    local   @stWndClass:WNDCLASSEX  ;定义一个WNDCLASSEX结构

    …

 

    invoke  RtlZeroMemory;addr @stWndClass;sizeof @stWndClass

    invoke  LoadCursor;0;IDC_ARROW

    mov     @stWndClass。hCursor;eax

    push        hInstance

    pop     @stWndClass。hInstance

    mov     @stWndClass。cbSize;sizeof WNDCLASSEX

    mov     @stWndClass。style;CS_HREDRAW or CS_VREDRAW

    mov     @stWndClass。lpfnWndProc;offset _ProcWinMain

    mov     @stWndClass。hbrBackground;COLOR_WINDOW + 1

    mov     @stWndClass。lpszClassName;offset szClassName

    invoke  RegisterClassEx;addr @stWndClass



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第4章 第一个窗口程序


4。2 分析窗口程序(2)

    
程序定义了一个WNDCLASSEX结构的变量@stWndClass,用RtlZeroMemory将它填为全零(局部变量初始化的重要性在第3章中已经强调过),再填写结构的各个字段,这样,没有赋值的部分就保持为0,结构各字段的含义如下:

●   hIcon——图标句柄,指定显示在窗口标题栏左上角的图标。Windows已经预定义了一些图标,同样,程序也可以使用在资源文件中定义的图标,这些图标的句柄可以用LoadIcon函数获得。例子程序没有用到图标,所以Windows给窗口显示了一个默认的图标。

●   hCursor——光标句柄,指定了鼠标在窗口中的光标形状。同样,Windows也预定义了一些光标,可以用LoadCursor获取它们的句柄,IDC_ARROW是Windows预定义的箭头光标,如果想使用自定义的光标,也可以自己在资源文件中定义。

●   lpszMenuName——指定窗口上显示的默认菜单,它指向一个字符串,描述资源文件中菜单的名称,如果资源文件中菜单是用数值定义的,那么这里使用菜单资源的数值。窗口中的菜单也可以在建立窗口函数CreateWindowEx的参数中指定。如果在两个地方都没有指定,那么建立的窗口上就没有菜单。

●   hInstance——指定要注册的窗口类属于哪个模块,模块句柄在程序开始的地方已经用GetModuleHandle函数获得。

●   cbSize——指定WNDCLASSEX结构的长度,用sizeof伪操作来获取。很多Win32 API参数中的结构都有cbSize字段,它主要是用来区分结构的版本,当以后新增了一个字段时,cbSize就相应增大,如果调用的时候cbSize还是老的长度,表示运行的是基于旧结构的程序,这样可以防止使用无效的字段。

●   style——窗口风格。CS_HREDRAW和CS_VREDRAW表示窗口的宽度或高度改变时是否重画窗口。比较重要的是CS_DBLCLKS风格,指定了它,Windows才会把在窗口中快速两次单击鼠标的行为翻译成双击消息WM_LBUTTONDBLCLK发给窗口过程。笔者就曾经忘了指定它,结果怎么也搞不出双击消息来。

●   hbrBackground——窗口客户区的背景色。前面的hbr表示它是一个刷子(Brush)的句柄,“刷子”一词形象地表示了填充一个区域的着色模式。Windows预定义了一些刷子,如BLACK_BRUSH和WHITE_BRUSH等,可以用下列语句来得到它们的句柄:

      invoke   GetObjectStock; WHITE_BRUSH

但在这里也可以使用颜色值,Windows已经预定义了一些颜色值,分别对应窗口各部分的颜色,如COLOR_BACKGROUND,COLOR_HIGHLIGHT,COLOR_MENU和COLOR_WINDOW等,使用颜色值的时候,Windows规定必须在颜色值上加1,所以程序中的指令是:

mov      @stWndClass。hbrBackground;COLOR_WINDOW + 1

●   lpszClassName——指定程序员要建立的类命名,以便以后用这个名称来引用它。这个字段是一个字符串指针,在程序里,它指向“MyClass”字符串。

●   cbWndExtra和cbClsExtra——分别是在Windows内部保存的窗口结构和类结构中给程序员预留的空间大小,用来存放自定义数据,它们的单位是字节。不使用自定义数据的话,这两个字段就是0。

●   lpfnWndProc——最重要的参数,它指定了基于这个类建立的窗口的窗口过程地址。通过这个参数,Windows就知道了在DispatchMessage函数中把窗口消息发到哪里去,一个窗口过程可以为多个窗口服务,只要这些窗口是基于同一个窗口类建立的。Windows中不同应用程序中的按钮和文本框的行为都是一样的,就是因为它们是基于相同的Windows预定义类建立的,它们背后的窗口过程其实是同一段代码。

结构中的style表示窗口的风格,Windows已经有一些预定义的值,它们是以CS(Class Style的缩写)开始的标识符,如表4。1所示。

表4。1  一些窗口类的style预定义值

预定义值
 16进制值
 对应二进制位
 
CS_VREDRAW
 00000001h
 0
 
CS_HREDRAW
 00000002h
 1
 
CS_KEYCVTWINDOW
 00000004h
 2
 
CS_DBLCLKS
 00000008h
 3
 
CS_OWNDC
 00000020h
 5
 
CS_CLASSDC
 00000040h
 6
 

  
  
 

可以看到,这些预定义值实际上在使用不重复的数据位,所以可以组合起来使用,同时使用不同的预定义值并不会引起混淆。

对于不同二进制位组合的计算,“加”和“或”的结果是一样的,在FirstWindow程序中用CS_HREDRAW or CS_VREDRAW来代表两个组合,若用CS_HREDRAW+CS_VREDRAW也并没有什么不同,但强烈建议使用or,因为如果不小心指定了两个同样的风格时:CS_HREDRAW or CS_VREDRAW or CS_VREDRAW和原来的数值是一样的,而CS_HREDRAW+CS_VREDRAW+ CS_VREDRAW就不对了,因为1 or 1=1,而1+1就等于2了。

2。 建立窗口

接下来的步骤是在已经注册的窗口类的基础上建立窗口,使用“类”的原因是定义窗口的“共性”,建立窗口时肯定还要指定窗口的很多“个性化”的参数——如WNDCLASSEX结构中没有定义的外观、标题、位置、大小和边框类型等属性,这些属性是在建立窗口时才指定的。

和注册窗口类时用一个结构传递所有参数不同,建立窗口时所有的属性都是用单个参数的方式传递的,建立窗口的函数是CreateWindowEx(注意不要写成CreateWindowsEx),同样,它是Win16中CreateWindow函数的扩展,主要表现在多了一个dwExStyle(扩展风格)参数,原因是Win32比Win16中多了很多种窗口风格,原来的一个风格参数已经不够用了。CreateWindowEx函数的使用方法是:

invoke  CreateWindowEx;dwExStyle;lpClassName;lpWindowName;dwStyle;

            x;y;nWidth;nHeight;hWndParent;hMenu;hInstance;lpParam

虽然这个函数的参数多达12个,但它们很好理解:

●   lpClassName—建立窗口使用的类名字符串指针,在FirstWindow程序中指向“MyClass”字符串,表示使用“MyClass”类建立窗口,这正是我们自己注册的类,这样一来,这个窗口就有“MyClass”的所有属性,并且消息将被发到“MyClass”中指定的窗口过程中去,当然,这里也可以是Windows预定义的类名。

●   lpWindowName——指向表示窗口名称的字符串,该名称会显示在标题栏上。如果该参数空白,则标题栏上什么都没有。

●   hMenu——窗口上要出现的菜单的句柄。在注册窗口类的时候也定义了一个菜单,那是窗口的默认菜单,意思是如果这里没有定义菜单(用参数NULL)而注册窗口类时定义了菜单,则使用窗口类中定义的菜单;如果这里指定了菜单句柄,则不管窗口类中有没有定义都将使用这里定义的菜单;两个地方都没有定义菜单句柄,则窗口上没有菜单。另外,当建立的窗口是子窗口时(dwStyle中指定了WS_CHILD),这个参数是另一个含义,这时hMenu参数指定的是子窗口的ID号,这样可以节省一个参数的位置,因为反正子窗口不会有菜单。

●   lpParam——这是一个指针,指向一个欲传给窗口的参数,这个参数在WM_CREATE消息中可以被获取,一般情况下用不到这个字段。

●   hInstance——模块句柄,和注册窗口类时一样,指定了窗口所属的程序模块。

●   hWndParent——窗口所属的父窗口,对于普通窗口(相对于子窗口),这里的“父子”关系只是从属关系,主要用来在父窗口销毁时一同将其“子”窗口销毁,并不会把窗口位置限制在父窗口的客户区范围内,但如果要建立的是真正的子窗口(dwStyle中指定了WS_CHILD的时候),这时窗口位置会被限制在父窗口的客户区范围内,同时窗口的坐标(x,y)也是以父窗口的左上角为基准的。

●   x,y——指定窗口左上角位置,单位是像素。默认时可指定为 CW_USEDEFAULT,这样Windows会自动为窗口指定最合适的位置,当建立子窗口时,位置是以父窗口的左上角为基准的,否则,以屏幕左上角为基准。

●   nWidth,nHeight—窗口的宽度和高度,也就是窗口的大小,同样是以像素为单位的。默认时可指定为 CW_USEDEFAULT,这样Windows会自动为窗口指定最合适的大小。

窗口的两个参数dwStyle和dwExStyle决定了窗口的外形和行为,dwStyle是从Win16开始就有的属性,表4。2列出了一些常见的dwStyle定义,它们是一些以WS(Windows Style的缩写)为开头的预定义值。



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第4章 第一个窗口程序


4。2 分析窗口程序(3)

    
表4。2  窗口风格的预定义值

预定义值
 16进制值
 含    义
 
WS_OVERLAPPED
 00000000h
 普通的重叠式窗口
 
WS_POPUP
 80000000h
 弹出式窗口(没有标题栏)
 
WS_CHILD
 40000000h
 子窗口
 
WS_MINIMIZE
 20000000h
 初始状态是最小化的
 
WS_VISIBLE
 10000000h
 初始状态是可见的
 
WS_DISABLED
 08000000h
 初始状态是被禁止的
 
WS_MAXIMIZE
 01000000h
 初始状态是最大化的
 
WS_BORDER
 00800000h
 单线条边框
 
WS_DLGFRAME
 00400000h
 对话框类型的边框
 
WS_VSCROLL
 00200000h
 带垂直滚动条
 
WS_HSCROLL
 00100000h
 带水平滚动条
 
WS_SYSMEN
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架