六、Windows子窗口控件的清单方块类别—将字符串放入清单方块

建立清单方块之后,下一步是将字符串放入其中,您可以通过呼叫SendMessage为清单方块窗口消息处理程序发送消息来做到这一点。字符串通常通过以0开始计数的索引数来引用,其中0对应于最顶上的项目。在下面的例子中,hwndList是子窗口清单方块控件的句柄,而iIndex是索引值。在使用SendMessage传递字符串的情况下,lParam参数是指向以null字符结尾字符串的指针。

在大多数例子中,当窗口消息处理程序储存的清单方块内容超过了可用内存空间时,SendMessage将传回LB_ERRSPACE(定义为-2)。如果是因为其它原因而出错,那么SendMessage将传回LB_ERR(-1)。如果操作成功,那么SendMessage将传回LB_OKAY(0)。您可以通过测试SendMessage的非零值来判断这两种错误。

如果您采用LBS_SORT样式(或者如果您在清单方块中按照想要呈现的顺序排列字符串),那么填入清单方块最简单的方法是借助LB_ADDSTRING消息:

SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) szString) ;
        

如果您没有采用LBS_SORT,那么可以使用LB_INSERTSTRING指定一个索引值,将字符串插入到清单方块中:

SendMessage (hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString) ;
        

例如,如果iIndex等于4,那么szString将变为索引值为4的字符串-从顶头开始算起的第5个字符串(因为是从0开始计数的),位于这个点后面的所有字符串都将向后推移。索引值为-1时,将字符串增加在最后。您可以对样式为LBS_SORT的清单方块使用LB_INSERTSTRING,但是这个清单方块的内容不能被重新排序(您也可以使用LB_DIR消息将字符串插入到清单方块中,这将在本章的最后进行讨论)。

您可以在指定索引值的同时使用LB_DELETESTRING参数,这就可以从清单方块中删除字符串:

SendMessage (hwndList, LB_DELETESTRING, iIndex, 0) ;
        

您可以使用LB_RESETCONTENT清除清单方块中的内容:

SendMessage (hwndList, LB_RESETCONTENT, 0, 0) ;
        

当在清单方块中增加或者删除字符串时,清单方块窗口消息处理程序将更新显示。如果您有许多字符串需要增加或者删除,那么您也许希望暂时阻止这一动作,其方法是关掉控件的重画旗标:

SendMessage (hwndList, WM_SETREDRAW, FALSE, 0) ;
        

当您完成后,可以再打开重画旗标:

SendMessage (hwndList, WM_SETREDRAW, TRUE, 0) ;
        

使用LBS_NOREDRAW样式建立的清单方块开始时其重画旗标是关闭的。