脑蚴呛姆祷刂涤美捶祷刈缓蟮氖盗耍灾劣诿挥械胤娇梢员硎竞欠裰葱谐晒Α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位是通知码,用来表示用户的操作,通知码的定义如表