列表框
列表框允許用戶從多個對象中選擇一項或多項,這些對象可以是文本、文件和位圖等。當列表框的項不能全部顯示出來時,可以用滾動條來滾動顯示。
1. 基礎知識
默認的列表框只允許用戶單選,需要多選時,須把列表框的風格定義爲 LBS_ MULTIPLESEL 和 LBS_EXTENDEDSEL 。列表框提供的其他風格取值可以控制列表框的外觀和操作。例如是否按照列表框各項的名稱排序,是否多行排列,是否有滾動條等。
風格取值 描述
LBS_EXTENDEDSEL //能通過Shift鍵或者鼠標進行多選
LBS_HASSTRINGS //可以用GetText函數得到列表框裏選項的字符串
LBS_MULTICOLUMN //指定列表框以多列形式顯示內容
LBS_MULTIPLESEL //用戶可以選擇多個項
LBS_NOINTEGRALHEIGHT //當應用程序創建列表框時,列表框的大小由系統指定
LBS_NOREDRAW //列表框不響應用戶的修改,可以通過發送WM_REDRAW 來取消該設置
LBS_NOTIFY //讓主窗口接收列表框的任何改變的消息
LBS_OWNERDRAWFIXED //主窗口負責列表框的重畫,列表框裏每項的高度相同
LBS_0WNERDRAWVARIABLE //主窗口負責列表框的重畫,列表框裏每項的高度可以變化
LBS_SORT //按各項名稱的字母排序
LBS_STANDARD //等同於LBS_SORT和LBS_NOTIFY
LBS_USETABSTOPS //允許用戶使用Tab鍵在各項中切換
LBS_WANTKEYBOARDINPUT //輸入焦點在列表框時,任何鍵盤輸入都會向父窗口發送WM_VKEYTOITEM或者WM_CHARTOITEM消息
LBS_DISABLENOSCROLI //當列表框的項不夠時,垂直滾動條禁活:沒有該屬性時,滾動條隱藏
當用戶對列表框進行了操作時,就會向主窗口發送一條消息。列表框的消息類型比較簡單,主要是單擊、雙擊和選擇等。同編輯框一樣,列表框也會遇到內存不夠的問題,所以消息類型中含有這一項。消息總是通過WM_COMMAND的形式發送給主窗口的。其中,wParam的低位字節表示列表框的標識符,高位字節表示消息的類型,lParam表示主窗口句柄。列表框的消息類型如表所示。
消息類型 描述
LB_DELETESTRING //刪除指定的選項
LB_ADDFILE //向列表框裏增加一個文件(包括目錄)
LB_FINDSTRING //在列表框裏查找指定的項
LB_FINDSTRlNGEXACT //精確查找指定的項
LB_GETCOUNT //得到列表框裏項的數目
LB_GETCURSEL //返回當前被選中選項的序號
LB_GETSEL //得到被選項的狀態,如果出錯,則返回零值
LB_GETSELCOUNT //得到被選中的個數
LB_GETTEXT //返回選中的文本,返回值爲字符串長度
LB_GETTEXTLEN //返回字符串長度
LB_INITSTORAGE //向列表框增加項之前存儲原來的內容
LB_INSERTSTRING //向列表框增加一項,但不重新排序
LB_ITEMFROMPOINT //返回離指定點最近項的序號
LB_RESETCONTENT //清除列表框裏所有的項
LB_SELECTSTRING //尋找指定的項
LB_SELITEMRANGE //指定選擇的範圍
LB_SELITEMRANGEEX //選定或者刪除指定的項
LB_SETCOLUMNWIDTH //設置列的寬度
LB_SETCOUNT //設置列表框裏項的最大數目
LB_SETCURSEL //選中指定的項
LBN_DBLCLK //發送用戶雙擊的消息
LBN_ERRSPACE //發送內存空間不夠的消息
LBN_KILLFOCUS //當列表框失去焦點時發送該消息
LBN_SELCANCEL //當用戶取消選擇時發送該消息
LBN_SELCHANGE //當用戶選擇改變時發送該消息
LBN_SETFOCUS //當輸入焦點轉移到列表框時發送該消息
WM_CTLCOLORLISTBOX //在列表框重畫時向父窗口發送該消息
WM_DELETEITEM //刪除選項
WM_VKEYTOITEM //輸入焦點在列表框裏,用戶按鍵時發送該消息
鼠標右鍵WM_CONTEXTMENU 消息就行了。wParam 是點擊右鍵的窗口的句柄,lParam 是鼠標座標。如果用戶使用 SHIFT+F10 來響應菜單,那麼 lParam 收到的座標都是 -1。
LOWORD(wParam) 子窗口ID
HIWORD(wParam) 通知碼
Lparam 子窗口句柄
2. 定義列
增加列需要用列的結構LVCOLUMN,定義如下:
typedef struct _LVCOLUMN {
UINT mask; //定義該列可使用的類型
int fmt; //定義列格式
int cx; //定義列寬度(以像素爲單位)
LPTSTR pszText; //列內容
int cchTextMax; //列內容最大長度
int iSubItem; //定義此列序號
#if (_WIN32_IE >= 0x0300)
int iImage; //指向圖像
int iOrder; //零基列偏移量。列偏移量是從左到右的順序。例如0列在最左邊。
#endif #if (_WIN32_WINNT >= 0x0600)
int cxMin; //指定列寬最小值
int cxDefault; //默認列寬
int cxIdeal; //只讀,作爲列寬的理想寬度自動調整寬度大小
#endif
} LVCOLUMN, *LPLVCOLUMN; //結構名稱
使用方法:
SendMessage(hwnd, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn)
還有LVM_GETCOLUMN LVM_SETCOLUMN LVM_DELETECOLUMN
3. 改變項
改變項需要結構體LVITEM,定義如下:
typedef struct {
UINT mask; //設置成員標誌,如格式等
int iItem; //項目索引
int iSubItem; //添加到的列序
UINT state; //指明項目狀態,如圖片,疊加圖片
UINT stateMask; //指state成員的有效位
LPTSTR pszText; //項目內容
int cchTextMax; //項目最大長度
int iImage; //指向圖片索引
LPARAM lParam; //特殊值,如果你用SORTITEM它就需要這個,或者別的特別的
#if (_WIN32_IE >= 0x0300)
int iIndent; //圖片寬度
#endif
#if (_WIN32_WINNT >= 0x0501)
int iGroupId; //指向所在的組id
UINT cColumns; //需要展示的列數,最大爲20
UINT puColumns; //返回這個項目所指向的列
#endif
#if (_WIN32_WINNT >= 0x0600)
int piColFmt; //返回列屬性
int iGroup; //項目列
#endif
} LVITEM, *LPLVITEM;
使用方法:
SendMessage(hres, LVM_INSERTITEM, 0, (LPARAM)&item);