友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
八万小说网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

windows环境下32位汇编语言程序设计-第22部分

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




                     。elseif ax    SB_PAGELEFT

                             sub     位置变量;页长

                     。elseif ax    SB_PAGERIGHT

                             add     位置变量;页长

                     。elseif ax    SB_THUMBPOSITION || ax  SB_THUMBTRACK

                             mov     eax;wParam

                             shr     eax;16

                             mov     位置变量;eax

                     。endif

     。elseif eax  hWnd滚动条2

             ;处理滚动条2的代码,同上面的结构

     。。。

     。endif

在例子程序Control。asm中只定义了一个滚动条,所有的消息肯定都是它发出的,所以去掉了判断lParam是哪个滚动条的步骤直接处理wParam中的动作码。

在用户按动滚动条后,滚动条不会自己移动位置,它只是将用户的动作以WM_xSCROLL消息的形式反馈给程序,真正要移动它还是要靠程序来设置,所以代码中要根据不同的动作首先计算新的位置,并判断新的位置是否越界,例子程序中的这些代码判断新的位置是否超出0~100的范围,如果是,则校正到0~100之间:

cmp     dwPos;0

jge     @F

mov     dwPos;0

@@:

cmp     dwPos;100

jle     @F

mov     dwPos;100

在介绍MASM语句的时候提到过,。if dwPos 》 0语句只可以用来比较无符号数,所以在这里使用cmp指令自己构建测试分支而不是使用 。if伪指令。

当计算好新位置的时候要将位置设置回去,用户才会看到滚动条移动了,方法是向滚动条发送SBM_SETPOS消息:

invoke   SendDlgItemMessage;hWnd;IDC_SCROLL;SBM_SETPOS;dwPos;TRUE

最后一个参数为TRUE表示设置后重新绘画滚动条。

在初始化的时候,要给滚动条发送SBM_SETRANGE消息来设定滚动范围:

invoke   SendDlgItemMessage;hWnd;IDC_SCROLL;SBM_SETRANGE;最小值;最大值

如果需要获取滚动条的信息,可以尝试发送下面两个消息:SBM_GETPOS可以获取滚动条的当前位置,也就是上一次用SBM_SETPOS设置的值;SBM_GETRANGE可以获取滚动的范围,也就是用SBM_SETRANGE设置的值。

7。 使用组合框

顾名思义,组合框是一个“组合”起来的东西,它由一个可供选择的列表和一个可供输入的edit类组合而成。组合框让用户既可以自己输入文本,也可以选择列表中的某一项当做输入。用不同的风格定义可以产生3种类型的组合框,如图5。8所示。左边的是CBS_SIMPLE风格的组合框,它的上面可以输入文本,下面的列表可供选择预设文本;中间的是CBS_DROPDOWN风格的组合框,上面同样可以输入文本,但下面的列表是下拉式的,平时处于收起状态,点击编辑框右边的三角形才会拉下来;右边的是CBS_DROPDOWNLIST风格的组合框,它仅是一个下拉的选择框,上面的框中不允许输入文字。


图5。8  组合框的3种风格

组合框中还有几种常用的、可以附加的风格:

●   CBS_AUTOHSCROLL      输入过长的文本时输入框自动卷动。

●   CBS_LOWERCASE          自动将所有的文本转换成小写。

●   CBS_SORT               自动将插入的文本项排序。

●   CBS_UPPERCASE     自动将所有的文本转换成大写。

组合框中列表框部分的文字添加、项目的选择等操作都是通过发送消息来完成的,主要的消息如表5。5所示。



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


第5章 使用资源


5。4 对 话 框(9)

    
表5。5  组合框的消息

消    息
 Wparam
 lParam
 说    明
 
CB_ADDSTRING
 0
 字符串地址
 把一个字符串添加到列表中
 
CB_INSERTSTRING
 位置索引
 字符串地址
 把一个字符串插入到列表中
 
CB_FINDSTRING
 开始查找的位置索引
 查找的字符串
 在列表中查找以lParam字符串开头的项,找到则返回位置索引,未找到则返回CB_ERR
 
CB_FINDSTRINGEXACT
 位置索引
 查找的字符串
 精确查找字符串
 
CB_DELETESTRING
 位置索引
 0
 删除一个列表项
 
CB_RESETCONTENT
 0
 0
 删除所有的列表项
 

  

消    息
 Wparam
 lParam
 说    明
 
CB_GETLBTEXT
 位置索引
 缓冲区地址
 获取指定列表项的字符串,缓冲区必须足够大
 
CB_GETLBTEXTLEN
 位置索引
 0
 获取指定列表项的字符串长度
 
CB_GETCOUNT
 0
 0
 获取列表项的总项数
 
CB_SETCURSEL
 位置索引
 0
 选中一个列表项,并将列表项中的文字拷贝到编辑控件中
 
CB_SELECTSTRING
 开始查找的位置索引
 字符串地址
 查找以lParam指定的字符串开始的列表项,如果找到则选中它并将字符串拷贝到编辑控件中
 
CB_GETCURSEL
 0
 0
 获取当前选中的位置索引,没有选中的项目则返回CB_ERR
 
CB_SHOWDROPDOWN
 状态
 0
 打开(状态为TRUE)或收起(状态为FALSE)下拉列表
 
CB_GETDROPPEDSTATE
 0
 0
 检测列表的当前下拉状态,返回TRUE表示拉下,FALSE表示收起
 

当用户在组合框中进行选择操作时,Windows向对话框过程发送WM_MAND消息,消息中wParam参数的低16位是组合框ID,高16位是通知码,用来表示用户的操作,通知码的定义如表5。6所示。

表5。6  用户操作组合框后的通知码

通  知  码
 说    明
 
CBN_SELCHANGE
 用户将要选择一个项目(鼠标移动到了这个项目上)
 
CBN_CLOSEUP
 下拉列表关闭(可能是选择完成也可能是取消选择)
 
CBN_SELENDOK
 用户完成选择项目
 
CBN_SELENDCANCEL
 用户取消选择(鼠标移动到了某个项目上,但并没有按下而是点击了其他控件,或按动了Esc键)
 
CBN_DBLCLK
 在CBS_SIMPLE的组合框中双击了一个列表项
 
CBN_DROPDOWN
 用户打开了下拉框(按动了编辑框边的下拉按钮)
 

如果想在用户选择了一个项目后做相应的动作,最好的办法就是处理CBN_SELENDOK通知码,因为这才意味着用户真正完成了一个选择动作,例子程序中就是这样处理的:

。elseif      ax    IDC_TITLETEXT   ;在WM_MAND消息中

    shr     eax;16

    。if     ax    CBN_SELENDOK

             invoke SendDlgItemMessage;hWnd;IDC_TITLETEXT;CB_GETCURSEL;0;0

            ;根据返回的eax值做相应动作。。。

    。endif

以上的操作都是针对下拉列表部分的,另外也有很多消息是针对组合框中的编辑控件的,对组合框的窗口句柄发送WM_GETTEXT和WM_SETTEXT,操作的对象就是组合框的编辑控件;如果要限制编辑控件中文本的最大输入长度,可以发送CB_LIMITTEXT消息,这时候wParam参数指定最大数量;当用户在编辑框中编辑文本的时候,Windows在用户输入之后、字符显示之前会发送CBN_EDITUPDATE通知码;当字符在编辑框中显示以后,又会发送CBN_EDITCHANGE通知码。所以在处理WM_MAND消息时通过处理这两个通知码可以检测到用户的输入操作。

组合框是子窗口控件中比较复杂的一种,这里介绍的是常用的消息和通知码,另外还有少量不常用的内容,读者可以自行查看相关的资料。

8。 使用列表框

列表框提供一个可供用户选择的列表,用户可以一次选择一个项目,也可以同时选中多个项目,本节用一个单独的例子程序来说明列表框的用法,所有的源程序可以在所附光盘的Chapter05Listbox目录中找到,包括Listbox。rc文件和Listbox。asm文件,其中Listbox。rc文件定义如下:

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

#include         

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

#define ICO_MAIN         Ox1000  //图标

#define DLG_MAIN         1

#define IDC_LISTBOX1     101

#define IDC_LISTBOX2     102

#define IDC_SEL1         103

#define IDC_RESET        104

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

ICO_MAIN     ICON                〃Main。ico〃

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

DLG_MAIN DIALOG 163; 160; 190; 108

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

CAPTION 〃列表框控件示例〃

FONT 9; 〃宋体〃



 LISTBOX IDC_LISTBOX1; 6; 5; 55; 86; LBS_STANDARD

 LISTBOX IDC_LISTBOX2; 68; 5; 115; 86; LBS_STANDARD | LBS_MULTIPLESEL

 LTEXT 〃〃; IDC_SEL1; 6; 93; 55; 8

 PUSHBUTTON 〃复位(&R)〃; IDC_RESET; 89; 90; 45; 14

 DEFPUSHBUTTON 〃查看(&S)〃; IDOK; 139; 90; 45; 14; WS_DISABLED



//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

程序运行的效果如图5。9所示。程序中总共定义了两个列表框。左边列表框为IDC_LISTBOX1,这是一个单选的列表框,选择一个项目的时候下面的文本中会显示出选择的项目,双击某个项目的时候会弹出图中标有②的消息框。右边的列表框是IDC_LISTBOX2,是一个多选的列表框,选择完毕后可以用“查看”按钮弹出图中标有①的消息框,消息框中显示了所有选中的项目。读者也可以按下“复位”按钮清除列表框的选择。


图5。9  列表框例子的运行结果

定义列表框时可以使用的风格如表5。7所示。

表5。7  列表框可以使用的风格

风    格
 说    明
 
LBS_DISABLENOSCROLL
 在不需滚动的时候也显示垂直滚动条
 
LBS_EXTENDEDSEL
 在多选列表框中允许按住Shift键同时选中一个范围
 
LBS_MULTIPLESEL
 允许多选,如果不定义的话则是单选列表框
 
LBS_NOSEL
 列表框项目只能查看不能选择
 
LBS_NOTIFY
 用户点击或双击项目时向父窗口发送WM_MAND消息
 
LBS_SORT
 自动按字母顺序排序插入的项目
 
LBS_USETABSTOPS
 列表框项目的文本中允许将Tab字符的位置展开
 
LBS_STANDARD
 组合LBS_NOTIFY,LBS_SORT,WS_VSCROLL和WS_BORDER
 

一般单选列表框只需定义LBS_STANDARD就可以了。

汇编源代码Listbox。asm如下所示:



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


第5章 使用资源


5。4 对 话 框(10)

    
                 。386

                 。model flat; stdcall

                 option casemap :none

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; Include 文件定义

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

include          windows。inc

include          user32。inc

includelib       user32。lib

include          kernel32。inc

includelib       kernel32。lib

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; Equ 等值定义

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

ICO_MAIN         equ     1000h

DLG_MAIN         equ     1

IDC_LISTBOX1     equ     101

IDC_LISTBOX2     equ     102

IDC_SEL1         equ     103

IDC_RESET        equ     104

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 数据段

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

                 。data?

hInstance        dd      ?

                 nst

szText1          db      '项目1';0

szText2          db      '项目2';0

szText3          db      '项目3';0

szPath           db      '*。*';0

szMessage        db      '选择结果:%s';0

szTitle          db      '您的选择';0

szSelect         db      '您选择了以下的项目:'

szReturn         db      0dh;0ah;0

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 代码段

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

 

     de

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

_ProcDlgMain     proc        uses ebx edi esi hWnd;wMsg;wParam;lParam

                 local   @szBuffer'128':byte

                 local   @szBuffer1'128':byte

                 local   @szTextBuff'2048':byte

                 local   @dwCount

 

                 mov     eax;wMsg

                 。if     eax  WM_CLOSE

                         invoke  EndDialog;hWnd;NULL

                 。elseif eax  WM_INITDIALOG

                         invoke  LoadIcon;hInstance;ICO_MAIN

                         invoke  SendMessage;hWnd;WM_SETICON;ICON_BIG;eax

;********************************************************************

; 初始化列表框

;********************************************************************

                         invoke  SendDlgItemMessage;hWnd;

                                 IDC_LISTBOX1;LB_ADDSTRING;0;addr szText1

                         invoke  SendDlgItemMessage;hWnd;

                                 IDC_LISTBOX1;LB_ADDSTRING;0;addr szText2

                         invoke  SendDlgItemMessage;hWnd;

                                 IDC_LISTBOX1;LB_ADDSTRING;0;addr szText3

                         Invoke   SendDlgItemMessage;hWnd;IDC_LISTBOX2;LB_DIR;

                                 DDL_ARCHIVE or DDL_DRIVES or DDL_DIRECTORY;

                                 addr szPath

;********************************************************************

                 。elseif eax  WM_MAND

                 mov eax;wParam

;********************************************************************

; 由于印刷宽度有限,WM_MAND消息处理代码的缩进格式有所影响,请读者注意

; 取多选的列表框项目

;********************************************************************

。if      ax    IDOK

         invoke  SendDlgItemMessage;hWnd;IDC_LISTBOX2;LB_GETSELCOUNT;0;0

         mov     @dwCount;eax

         invoke  SendDlgItemMessage;hWnd;IDC_LISTBOX2;

                 LB_GETSELITEMS;128/4;addr @szBuffer

         invoke  lstrcpy;addr @szTextBuff;addr szSelect

         lea     esi;@szBuffer

         。while  @dwCount

                 lodsd

                 lea     ecx;@szBuffer1

                 invoke  SendDlgItemMessage;hWnd;

                         IDC_LISTBOX2;LB_GETTEXT;eax;ecx

                 invoke  lstrcat;addr @szTextBuff;addr szReturn

                 in
返回目录 上一页 下一页 回到顶部 7 6
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!