六、Windows子窗口控件的清单方块类别—清单方块样式
当您使用CreateWindow建立清单方块子窗口时,您应该将「listbox」作为窗口类别,将WS_CHILD作为窗口样式。但是,这个内定清单方块样式不向其父窗口发送WM_COMMAND消息,这样一来,程序必须向清单方块询问其中的项目的选择状态(借助于发送给清单方块控件的消息)。所以,清单方块控件通常都包括清单方块样式标识符LBS_NOTIFY,它允许父窗口接收来自清单方块的WM_COMMAND消息。如果您希望清单方块控件对清单方块中的项目进行排序,那么您可以使用另一种常用的样式LBS_SORT。
内定情况下,清单方块是单项选择的。多项选择的清单方块相当少。如果您想建立一个多项选择清单方块,那么您可以使用样式LBS_MULTIPLESEL。通常,当给有滚动条的清单方块增加新项目时,清单方块本身会自己重画。您可以通过将样式LBS_NOREDRAW包含进去来防止这种现象。但是您也许不想使用这种样式,这时可以使用WM_SETREDRAW消息来暂时防止清单方块控件重新画过,我将在稍后讨论WM_SETREDRAW消息。
内定状态下,清单方块窗口消息处理程序只显示列表项目,它的周围没有任何边界。您可以使用窗口样式标识符WS_BORDER来加上边界。另外,您可以使用窗口样式标识符WS_VSCROLL来增加垂直滚动条,以便用鼠标来滚动条表项目。
Windows表头文件定义了一个清单方块样式,叫做LBS_STANDARD,它包含了最常用的样式,其定义如下:
(LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER)
您也可以采用WS_SIZEBOX和WS_CAPTION标识符,但是这两个标识符允许您重新定义清单方块的大小,也允许您在清单方块父窗口的显示区域中移动清单方块。
清单方块的宽度应该能够容纳最长字符串的宽度加上滚动条的宽度。您可以使用:
GetSystemMetrics (SM_CXVSCROLL) ;
来获得垂直滚动条的宽度。您用一个字符的高度乘以想要在视端口中显示的项目数来计算出清单方块的高度。