WIN32汇编语言教程:第05章 使用资源 · 5.4 对话框(7)
参数uCheck用BST_CHECKED,BST_INDETERMINATE或BST_UNCHECKED来表示需要设置的状态,含义同上。向控件发送BM_SETCHECK消息也可以取得同样的效果,这时消息的wParam中放置需要设置的状态。
复选框是不互斥的,所以可以随意设置状态。而对于BS_RADIOBUTTON风格的单选钮来说,并不是把某个按钮设置为选中状态以后,同组的其他按钮就会自动变成非选中状态,所以用CheckDlgButton函数选中了一个单选钮以后,如果不是手动把同组的其他按钮全部改为非选中状态(逐个地调用CheckDlgButton),就会看到同时有两个单选钮是选中的。但把同组的所有单选钮逐个地设置显得有点麻烦,所以针对单选钮有一个专用函数:
invoke CheckRadioButton,hDlg,\ nIDFirstButton,nIDLastButton,nIDCheckButton
这个函数把ID在nIDFirstButton和nIDLastButton之间的单选钮全部设置为非选中状态,只有nIDCheckButton是选中状态,当然在使用中要注意将这一批ID定义为连续的数值。
如果还嫌CheckRadioButton有点麻烦,还有一种最简单的办法——使用自动单选钮,同组的AUTORADIOBUTTON会随着用户选中一个而自动清除其他单选钮的状态,所以在程序中只需要在初始化的时候预设一次,其他时间就可以不必关心设置问题了,以后惟一用到的就是调用IsDlgButtonChecked检查状态了。
4. 使用静态控件
静态控件是基于Static类的子窗口控件,之所以叫“静态”控件,是因为它是“安静”的——它们不向对话框发送WM_COMMAND消息,所以静态控件的ID一般是没有用处的,定义时常常将它们定为-1,如果需要在程序中改变属性,那么也可以为静态控件指定一个惟一的ID。
资源脚本文件中可以使用缩写的基于Static类的有LTEXT,CTEXT,RTEXT(文本框)和ICON(图标框),除了这些常用的类型之外,Static类还可以用CONTROL语句通过指定不同的窗口风格派生出不同用途的控件来。
下面说明静态控件的一些用法。
对于文本框,文本长度超过边界的时候默认是自动换行的,但如果同时指定SS_SIMPLE风格的话,就不会自动换行。读者可以在程序中用SetWindowText或发送WM_SETTEXT消息来动态改变显示的文本,同样,也可以用GetWindowText或发送WM_GETTEXT消息来获取其中的文本。
静态控件可以用来构筑简单的线条和图形,如果指定SS_BLACKFRAME,SS_GRAYFRAME或SS_WHITEFRAME风格,那么静态控件显示为填充的矩形,填充颜色分别是黑色、灰色或白色;而指定SS_BLACKRECT,SS_GRAYRECT或SS_WHITERECT风格的话,则显示为非填充的矩形框,边线颜色是黑色、灰色或白色。
静态控件也可以用来做立体感的线条或边框,指定SS_ETCHEDHORZ风格显示为横线,指定SS_ETCHEDVERT风格显示为竖线,指定SS_ETCHEDFRAME风格则显示为立体的矩形框,视觉上的效果类似于没有文字的GROUPBOX。
静态控件还有一个用途是做图形显示,当图形是图标的时候,用ICON语句就可以定义了,其默认的风格是SS_ICON,如果想使用位图,那么可以指定SS_BITMAP风格,例子程序中的图片框就是这样定义的:
CONTROL IDB_1, IDC_BMP, "Static", SS_BITMAP | WS_CHILD | WS_VISIBLE, 5, 5, 40, 95
在这里,“文字”部分指定位图资源的ID,前面已经把Picture1.bmp的资源ID定义为IDB_1,IDC_BMP是图片框自己的ID,如果不需要在程序中改变图片的话,那么这里可以定义为-1。
在程序中可以通过向控件发送STM_SETIMAGE消息来设置新的图片,消息的wParam指定图片的格式,取值可以是IMAGE_BITMAP,IMAGE_CURSOR和IMAGE_ICON,分别对应新图片的格式,lParam是图片的句柄,如果是位图,lParam就是用LoadBitmap装入的位图句柄,同样,图片类型是光标和图标的时候,这里就是用LoadCursor和LoadIcon装入的句柄。
在例子程序中,用来改变图片框图片的语句是:
invoke SendDlgItemMessage,hWnd,IDC_BMP,STM_SETIMAGE,IMAGE_BITMAP,eax
eax中是位图句柄,IDC_BMP是图片框的ID,wParam参数用IMAGE_BITMAP表示要设置的图片类型是位图。
5. 使用文本编辑控件
文本编辑控件是基于Edit类的控件,可以用缩写EDITTEXT定义,读者可以在文本编辑控件中输入并编辑文本。每当用户在文本编辑控件中输入一个字符的时候,控件就会向对话框过程发送一个WM_COMMAND消息,所以在例子程序中,当在自定义文字的编辑框中每输入一个字,标题栏文字就会马上改变。
要获取编辑框中的文本有多种方法,可以用GetWindowText,也可以用发送WM_GETTEXT消息的办法,要设置文本,同样可以用SetWindowText或发送WM_SETTEXT,但最简便的办法还是使用下面的函数:
invoke GetDlgItemText,hDlg,nIDDlgItem,lpString,nMaxCount ;取文本 invoke SetDlgItemText,hDlg,nIDDlgItem,lpString ;设置文本
lpString是放置字符的缓冲区地址,用GetDlgItemText函数来获取文本的时候,要用nMaxCount参数指定缓冲区的最大长度,以免获取的文本长度超过缓冲区长度引起溢出,设置的时候若使用SetDlgItemText函数时就不需要这个参数。
在实际使用中,经常要在文本编辑控件中输入输出数值型参数,将文本转换为数值比较麻烦,把数值转换为文本也要经过一个wsprintf调用,为了简化操作,Windows提供了两个函数来处理这个问题:
invoke SetDlgItemInt,hDlg,nIDDlgItem,uValue,bSigned ;取控件中的数值 invoke GetDlgItemInt,hDlg,nIDDlgItem,lpTranslated,bSigned ;设置控件中的数值
SetDlgItemInt函数将uValue参数先转换成字符串格式,然后设置到文本编辑控件中,bSigned参数指定了uValue的格式,如果是TRUE的话,表示uValue是符号数;是FALSE的话,表示uValue是无符号数。
GetDlgItemInt函数则将对话框中的文本转换成数值型返回,同样,用bSigned指定转换的方式,TRUE表示按照符号数格式转换,这时函数会检测文本的第一个字符是不是负号;FALSE则按照无符号数转换。参数lpTranslated是指向一个dword型变量的指针,GetDlgItemInt会在这个变量中返回BOOL类型值表示函数是否调用成功,成功则返回TRUE,有这样一个参数的原因是函数的返回值用来返回转换后的数值了,以至于没有地方可以表示函数是否执行成功。当然,lpTranslated参数也可以输入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