1. Listbox messages
LB_ADDSTRING
LB_INSERTSTRING
LB_DELETESTRING
LB_SELITEMRANGEEX
LB_RESETCONTENT
LB_SETSEL
LB_SETCURSEL
LB_GETSEL
LB_GETCURSEL
LB_GETTEXT
LB_GETTEXTLEN
LB_GETCOUNT
LB_SELECTSTRING
LB_DIR
LB_GETTOPINDEX
LB_FINDSTRING
LB_GETSELCOUNT
LB_GETSELITEMS
LB_SETTABSTOPS
LB_GETHORIZONTALEXTENT
LB_SETHORIZONTALEXTENT
LB_SETCOLUMNWIDTH
LB_ADDFILE
LB_SETTOPINDEX
LB_GETITEMRECT
LB_GETITEMDATA
LB_SETITEMDATA
LB_SELITEMRANGE
LB_SETANCHORINDEX
LB_GETANCHORINDEX
LB_SETCARETINDEX
LB_GETCARETINDEX
LB_SETITEMHEIGHT
LB_GETITEMHEIGHT
LB_FINDSTRINGEXACT
LB_SETLOCALE
LB_GETLOCALE
LB_SETCOUNT
LB_INITSTORAGE
LB_ITEMFROMPOINT
LB_MSGMAX
LB_MSGMAX
2. Listbox Notification Codes
LBN_ERRSPACE // 列表框存储溢出
LBN_SELCHANGE // 改变选择
LBN_DBLCLK // 双击条目
LBN_SELCANCEL // 取消选择
LBN_SETFOCUS // 列表框接收到输入焦点
LBN_KILLFOCUS // 列表框接失去输入焦点
父窗口通过WM_COMMAND消息接收:
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control
3. 列表框风格
LBS_STANDARD 创建一个具有边界和垂直滚动条、当选择发生变化或条目被双击时能够通知父窗口的标准列表框。所有条目按字母排序。
LBS_SORT 按字母排序。
LBS_NOSEL 条目可视但不可选。
LBS_NOTIFY 当用户选择或双击一个串时,发出消息通知父窗口。
LBS_DISABLENOSCROLL 在条目不多时依然显示并不起作用的滚动条。
LBS_MULTIPLESEL 允许条目多选。
LBS_EXTENDEDSEL 可用SHIFT和鼠标或指定键组合来选择多个条目。
LBS_MULTICOLUMN 允许多列显示。
LBS_OWNERDRAWVARIABLE 创建一个拥有者画列表框,条目高度可以不同。
LBS_OWNERDRAWFIXED 创建一个具有相同条目高度的拥有者画列表框。
LBS_USETABSTOPS 允许使用TAB制表符。
LBS_NOREDRAW 当条目被增删后不自动更新列表显示。
LBS_HASSTRINGS 记忆了添加到列表中的字串。
LBS_WANTKEYBOARDINPUT 当有键按下时向父窗口发送WM_VKEYTOITEM或WM_CHARTOITEM消息。
LBS_NOINTEGRALHEIGHT 按程序设定尺寸创建列表框。
在MFC应用程序中,列表框的通知消息通过ON_LBN消息映射宏而映射到类成员函数。
下表给出了列表框的几个通知消息以及相应的ON_LBN宏。其中,LBN_DBLCLK,LBN_SELCHANGE
和LBN_SELCANCEL通知消息只有在列表框使用了LBS_NOTIFY或LBS_STANDARD风格时才会被发出,
其他通知消息则无此限制。
4. 重绘
缺省的,列表框在每添加或删除一个条目后都会自动重绘,如果在列表框中已经有了几百条甚至上千条条目,
将会因为重绘而引起比较严重的闪烁。可以通过使用LBS_NOREDRAW风格来禁止列表框的自动重绘。在需要更新显示时
强制重绘列表框窗口即可。如果在创建时未使用LBS_NOREDRAW风格,可以在增删条目前向列表框发送WM_SETREDRAW消息,
指定其不重绘,增添完毕后再次发送WM_SETREDRAW消息重新启用自动重绘风格。
示例过程如下: CListBox m_ctrListBox;
m_ctrListBox.SendMessage(WM_SETREDRAW, FALSE, 0); // 禁止自动重绘
// 进行条目增删操作……
m_ctrListBox.SendMessage(WM_SETREDRAW, TRUE, 0); // 允许自动重绘