第七章 子窗口控件(下)
控件这部分比较多,看了很长时间才差不多。
/***************************************************/
静态类别
我们可以建立静态文字的子窗口控件,这些字窗口不会接受鼠标或键盘输入,也不向父窗口发送wm_command消息,当我们在静态子窗口上移动或按下鼠标时,这个窗口将拦截wm_nchittest消息并将httransparent值传回给windows,这将使windows向器下层窗口发送相同的wm_nchittest消息。
前六个静态窗口样式只简单的在子窗口的显示区域画一个矩形或边框:
·ss_blackrect·ss_blackframe
·ss_grayrect·ss_grayframe
·ss_whiterect·ss_whiteframe
静态类别也包含了三种文字样式:
·ss_left
·ss_right
·ss_center
/******************************************************/
滚动条类别
与按钮控件不同,滚动条控件不向父窗口发送wm_command消息,而是向窗口滚动条一样发送wm_vscroll和wm_hscroll消息,我们可以通过lParam参数来区分窗口滚动条与滚动条控件。对于窗口滚动条为0,而滚动条控件是滚动条的窗口句柄。
对于窗口滚动条我们可以设定滚动条的范围等参数:
SetScrollRange (hwndScroll, SB_CTL, iMin, iMax, bRedraw) ;
SetScrollPos (hwndScroll, SB_CTL, iPos, bRedraw) ;
SetScrollInfo (hwndScroll, SB_CTL, &si, bRedraw) ;
当滚动条具有输入焦点时,可以接受键盘输入,如下:
·Home SB_TOP
·End SB_BTOTTOM
·Page Up SB_PAGEUP
·Page Down SB_PAGEDOWN
·上 SB_LINEUP
·下 SB_LINEDOWN
我们可以使用 SetFocus(hwnd)来使某个控件具有输入焦点。
/*******************************************************************/
编辑类别
编辑控件最简单的应用之一是作为单行输入区域,但是编辑控件并不仅局限于单行。当子窗口获得输入焦点时,我们可以输入文字,移动光标,使用鼠标或者shift键、ctrl+C、ctrl+X等来复制剪切文字。
编辑类别样式:
·ES_AUTOHSCROLL ES_AUTOVSCROLL 说明编辑控件是自动有滚动条的
·ES_CENTER 编辑控件的内容是居中的
·ES_LEFT ES_RIGHT 编辑控件的内容是靠左还是靠右
·ES_MULTLINE 编辑控件的内容是多行的
·ES_NUMBER 只允许输入数字
·ES_PASSWORD 单输入时显示*
·ES_READONLY 编辑控件是只读的
·ES_UPPERCASE ES_LOWERCASE 编辑控件输入的转化为大写和小写
编辑控件通知:
编辑控件向父窗口消息处理程序发送wm_command消息,对按钮来说,wparam和lParam变量含义是相同的:
LOWORD(wParam)子窗口ID
HIWORD(wParam)通知码
lParam 子窗口句柄
通知码如下所示:
EN_SETFOCUS 获得输入焦点
EN_KILLFOCUS 失去输入焦点
EN_CHANGE 编辑控件的内容将改变
EN_UPDATE 编辑控件的内容已经改变
EN_ERRSPACE
EN_MAXTEXT 编辑控件在插入时超出空间
EN_HSCROLL EN_VSCROLL 编辑控件的滚动条已经被按下
/**************************************************************/
清单方块类别
Windows定义了一个清单方块样式,是LBS_STANDARD,他就是最常用的样式。
建立好清单别表后,就是向里面放入字符串了,有两种方法:
·对于LBS_SORT样式,可以发送LB_ADDSTRING消息
SendMessage(hwndList,LB_ADDSTRING,0,(LPARAM)szString);
·对于不是LBS_SORT样式,可以发送LB_INSERTSTRING消息
SendMessage(hwndList,LB_INSERTSTRING,iIndex,(LPARAM)szString);
其中index是下标值,如果是4,那么就会是第五个位置,如果是-1,那么就是在末尾插入。
在控件中增加或删除字符处串时,清单列表将会更新显示,如果有多字符串需要插入,那么可以先阻止重画动作:
SendMessage(hwndList,WM_SETREDRAW,FALSE,0);
当完成插入或删除后:
SendMessage(hwndList,WM_SETREDRAW,TRUE,0);
·使用LB_GETCOUNT来得到元素个数:
iCount = SendMessage(hwndList,LB_GETCOUNT,0,0);
·加亮一个内定选择:
SendMessage(hwndList,LB_SETCURSEL,iIndex,0);
·当接到来自清单列表的WM_COMMAND消息时,我们可一使用LB_GETCURSEL来确定目前选项的索引值:
iIndex = SendMessage(hwndList,LB_GETCURSEL,0,0);
·确定清单中字符串的长度:
iLength = SendMessage(hwndList,LB_GETTEXTLEN,iIndex,0);
iLength = SendMEssage(hwdnList,LB_GETTEXT,iIndex,(LPARAM)szBuffer);
清单方块向父窗口发送WM_COMMAND消息:
·LOWORD(wParam) 子窗口ID
·HIWORD(wParam) 通知码
·lParam 子窗口句柄
/***************************************************/
文件列表
LB_DIR,这是功能最强的清单列表消息,它用文件目录列表填入清单方块,并且可以选择将子目录和有效的磁盘驱动器也包括进来:
SendMessage(hwndList,LB_DIR,iAttr,(LPARAM)szFileSpec);
iAttr是文件属性码:
低字节是文件属性码:
·DDL_READWRITE
·DDL_READONLY
·DDL_HIDEN
·DDL_SYSTEM
·DDL_DIRECTORY
·DDL_ARCHIVE
高字节是附加控制:
·DDL_DRIVES 包括磁盘驱动器句柄
·DDL_EXCLUSIVE 互斥搜索