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

下载本书

添加书签

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


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
脑蚴呛姆祷刂涤美捶祷刈缓蟮氖盗耍灾劣诿挥械胤娇梢员硎竞欠裰葱谐晒Α5比唬琹pTranslated参数也可以输入NULL,这样,当函数返回0的时候就无法知道是文本框是“0”还是文本不符合格式造成转换失败。

SetDlgItemInt和GetDlgItemInt函数不仅适用于文本编辑控件,所有对其上面的文本可以修改的控件都可以使用它们。

使用文本编辑控件的时候,文本的长度也是个需要注意的问题。如果控件的宽度定义得过窄,当字符填充到最右边的时候,编辑框就不允许继续输入了,为了继续输入并让文本自动卷动,可以指定WS_HSCROLL风格;反之,定义WS_HSCROLL风格后输入文本的长度不受限制又不好,那么可以用向控件发送EM_LIMITTEXT消息的方法来设定最大长度。下面的例子将IDC_EDIT的输入最大长度定为10个字符:

invoke SendDlgItemMessage;hDlg;IDC_EDIT;EM_LIMITTEXT;10;NULL

另外,有时候可能需要把编辑框设置为只读的(和灰化不同,灰化的编辑框中文本无法进行任何操作,包括卷动操作,而只读的仅仅是不能修改),要把初始状态定义为只读的,只需在定义语句中加上ES_READONLY风格,在程序中需要动态改变只读状态可以发送EM_SETREADONLY消息,下面的第一句把编辑框设为只读,第二句把编辑框改回到可写状态:

invoke SendDlgItemMessage;hDlg;IDC_EDIT;EM_SETREADONLY;TRUE;NULL ;只读

invoke SendDlgItemMessage;hDlg;IDC_EDIT;EM_SETREADONLY;FALSE;NULL    ;可写

文本编辑框在默认状态下是单行的,也可以通过加上ES_MULTILINE风格变成多行的,这时可以同时加上WS_VSCROLL风格显示一个垂直方向的滚动条。

6。 使用滚动条

滚动条有水平和垂直两种,默认的SCROLLBAR语句定义的是水平的滚动条,它的默认风格是SBS_HORZ,例子程序中用下面的语句定义了一个水平滚动条:

SCROLLBAR IDC_SCROLL; 6; 118; 125; 10

如果要定义垂直的滚动条,那么要指明SBS_VERT风格:

SCROLLBAR IDC_SCROLL; x; y; 宽度; 高度,SBS_VERT



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


第5章 使用资源


5。4 对 话 框(8)

    
和其他子窗口控件发送WM_MAND消息不同,水平滚动条向对话框窗口发送WM_HSCROLL消息,而垂直滚动条则发送WM_VSCROLL消息,所以针对两种方式的滚动条要分别处理不同的消息。

WM_xSCROLL消息的参数如下所示:

wParam的低16位 = nScrollCode        ;动作码

wParam的高16位 = nPos       ;滚动条当前位置

lParam  = hwndScrollBar      ;滚动条控件的窗口句柄

其中nScrollCode代表了滚动条的当前动作,定义值及其含义如下:

●   SB_BOTTOM                   滚动条移到了最下/右边。

●   SB_ENDSCROLL             用户停止了滚动动作。

●   SB_THUMBPOSITION     滚动条被拖动到某处。

●   SB_THUMBTRACK          滚动条在拖动中。

●   SB_TOP                          滚动条移到了最上/左边。

●   SB_LINELEFT                 滚动条左移了一格(对于水平滚动条)。

●   SB_LINERIGHT               滚动条右移了一格(对于水平滚动条)。

●   SB_PAGELEFT                滚动条左移了一页(对于水平滚动条)。

●   SB_PAGERIGHT              滚动条右移了一页(对于水平滚动条)。

●   SB_LINEDOWN               滚动条下移了一格(对于垂直滚动条)。

●   SB_LINEUP                     滚动条上移了一格(对于垂直滚动条)。

●   SB_PAGEDOWN              滚动条下移了一页(对于垂直滚动条)。

●   SB_PAGEUP                    滚动条上移了一页(对于垂直滚动条)。

nPos的值只有当动作码是SB_THUMBPOSITION或SB_THUMBTRACK时才有效,其他的时候为0,图5。7示出了鼠标点击滚动条各处时对应的nScrollCode。

第一眼看到SB_xxx动作码的时候,读者可能会以为水平滚动条和垂直滚动条的动作码是不相同的——水平滚动条是SB_xxxLEFT、SB_xxxRIGHT,而垂直滚动条是SB_xxxUP、SB_xxxDOWN,但在Windows。inc中查看一下就可以发现,SB_xxxLEFT和SB_xxxUP在数值上是相同的,SB_xxxRIGHT和SB_xxxDOWN也是如此,所以不同定义方法只是为了直观起见而已。


图5。7  鼠标单击滚动条各处时产生的nScrollCode

以水平滚动条为例,处理滚动条消息的代码一般是如下结构:

。elseif  eax  WM_HSCROLL       ;窗口的消息处理分支,eax为wMsg

     mov     eax; lParam

     。if     eax  hWnd滚动条1

             mov     eax;wParam

                     。if     ax    SB_LINELEFT

                             dec     位置变量

                     。elseif ax    SB_LINERIGHT

                             inc     位置变量

                     。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位是通知码,用来表示用户的操作,通知码的定义如表
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架