windows編程學習筆記(三)ListBox的使用方法


ListBox是Windows中的一種控件,一般被當做子窗口使用,Windows中所有子窗口都是通過發送一個通知碼到父窗口父窗口通過WM_COMMAND消息接收,並在此消息中處理,並控制子窗口,ListBox自然也不例外,ListBox中有它獨有的消息,通知消息,風格,查看MSDN可以看到風格主要有:
  • LBS_EXTENDEDSEL  用戶可以通過SHIFT + 鼠標或者其他組合鍵進行多選(只能通過SHIFT + 鼠標或者其他組合鍵
  • LBS_HASSTRINGS   指定一個自繪的列表框中包含有字符串項,這些字符串的指針由應用程序管理,我們可以利用GetText函數得到相應的字符串
  • LBS_MULTICOLUMN   列表框可以有多列,默認情況是只有一列即一行只有一個字符串,我們可以使用 SetColumnWidth設置列寬
  • LBS_MULTIPLESEL   用戶可以同時選擇多項(用戶單擊一項時這項被選中,單擊另一項時,這兩項都被選中,選擇多項時只需要點擊不同的項,不需要用組合鍵的方式,同一項第一次單擊時選中,第二次單擊時取消選中)
  • LBS_NOINTEGRALHEIGHT   列表框的大小由系統在創建這個列表框的時候決定。一般不會只顯示部分列表項
  • LBS_NOREDRAW   列表框的大小在顯示后不會改變,但是可以通過發 WM_SETREDRAW消息來取消這一風格
  • LBS_NOTIFY   當用戶單擊或雙擊時會發送一條消息到父窗口,風格,父窗口將接收不到用戶選擇的項
  • LBS_OWNERDRAWFIXED   父窗口負責繪制列表框,這個時候列表框中的項的大小都一樣
  • LBS_OWNERDRAWVARIABLE   列表項的大小可以不一樣
  • LBS_SORT   字符串會以首字母排序
  • LBS_STANDARD  系統會將字符串排序,同時父窗口會收到用戶單機或者雙擊鼠標的消息
  • LBS_USETABSTOPS   允許用戶使用TAB鍵在各項中切換
  • LBS_WANTKEYBOARDINPUT   當列表框通過鍵盤獲得焦點時會向父窗口發送 WM_VKEYTOITEM 或 WM_CHARTOITEM 消息,以便程序處理特殊的鍵盤消息
  • LBS_DISABLENOSCROLL  列表框會擁有一個垂直滾動條 ,在列表框不能夠顯示所有項時顯示。
一般父窗口通過向列表框發送消息來控制列表框的行為,而發送的消息一般有以下幾種:
LB_ADDFILE 添加文件
LB_ADDSTRING 添加字符串
LB_DELETESTRING 刪除字符串
LB_DIR 添加文件名列表
LB_FINDSTRING 返回列表框中的一個字符的索引
LB_FINDSTRINGEXACT 在列表框查找第一個與特定字符匹配的字符並返回它的索引
LB_GETANCHORINDEX 獲取錨點的索引,錨點就是在多選模式下選中的第一項
LB_GETCARETINDEX 在多選模式下返回具有焦點條目的索引
LB_GETCOUNT 獲取列表框中子項的總數
LB_GETCURSEL 獲取被選中的子項的索引,只在單選模式下有效
LB_GETHORIZONTALEXTENT 獲取水平滾動條的寬度
LB_GETITEMDATA 獲取與指定列表項相關的程序的自定義值(長度為32位)
LB_GETITEMHEIGHT 獲取列表項的高
LB_GETITEMRECT 獲取列表項邊界矩形的大小
LB_GETLOCALE 獲得當前列表的區域,可以通過該區域決定正確的排序規則或者顯示排序后的文本
LB_GETSEL 獲得列表項的選擇狀態,被選中時大於0,未被選中時為0,發生錯誤時小於0
LB_GETSELCOUNT 在多選模式下獲取當前被選中的項總數
LB_GETSELITEMS  在多選模式下,獲取選項的值,需要提供一個相應的數組的首地址用來保存返回結果
LB_GETTEXT  獲取指定項的字符串
LB_GETTEXTLEN 獲得指定項字符串的長度
LB_GETTOPINDEX 獲取列表框中顯示的第一列的索引,當使用滾動條使顯示內容發生變化時,這個索引也會發生改變
LB_INITSTORAGE 需要加入大量列表項時使用
LB_INSERTSTRING 添加列表項,但是與LB_ADDSTRING不同的是,加入后新字符串不參加排序
LB_RESETCONTENT 清除所有列表項
LB_SELECTSTRING  從指定位置向后查找我們指定的字符串項,找到后將該項設置為選中狀態
LB_SELITEMRANGE  在多選模式下,將某一區域內一個或多個項設置為選中狀態
LB_SETCARETINDEX 在多選模式下,設置給定索引值的矩形設置為焦點矩形,如果該值沒有顯示,那么滾動條將會自動滾動到相應行
LB_SETCOLUMNWIDTH 在多列模式下設置所有項的的列寬,使用這個消息必須保證列表框有LBS_MULTICOLUMN風給
LB_SETCOUNT 設置列表項的總數,用於具有LBS_NODATA風給但是不具有LBS_HASSTRINGS風格的列表框
LB_SETCURSEL 設置某項處於被選中狀態,並將該項加亮顯示
LB_SETHORIZONTALEXTENT 設置水平滾動條的寬度,當列表框的寬度不足以顯示所有項的時候,滾動條出現,否則隱藏
LB_SETITEMDATA 設置特定項的值
LB_SETITEMHEIGHT 設置列表項的寬。
LB_SETLOCALE 設置列表框的當前區域
LB_SETSEL 在多選模式下選中某一字符串
LB_SETTABSTOPS 設置TAB鍵停止的位置
LB_SETTOPINDEX 設置列表框中的某一項處於可見位置

列表框向其父窗口發送的通知碼為:
LBN_DBLCLK 當某一項被單擊時發送
LBN_ERRSPACE 當系統不能分配足夠的內存來進項相應的處理時發送該通知碼
LBN_KILLFOCUS 當列表框中某一項失去焦點時發送
LBN_SELCANCEL當用戶取消選擇時發送
LBN_SELCHANGE 當用戶選擇改變時發送
LBN_SETFOCUS 當某一項獲得焦點時發送
下面是一個小例子:(在窗口程序中創建列表框,框中選擇人物姓名,可以得到人物的相應信息)
利用到的結構體的定義如下:
struct PERSON 
{
	const char *pszName;
	int nAge;
	const char *pszPhoneNum;
};

首先在WM_CREATE中創建:
HWND hList = CreateWindow("LISTBOX", "", WS_CHILD | WS_BORDER | WS_VISIBLE | LBS_HASSTRINGS | LBS_NOTIFY |  LBS_NOINTEGRALHEIGHT
				, 0,0,200,800,hWnd, (HMENU)123, g_hInst, NULL);

			for(int i = 0; i < 3; i++)
 			{
 				SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)(g_Person[i].pszName));
			}

			SendMessage(hList, LB_SETCURSEL, (WPARAM)0, 0);
		}
關於列表框的顯示與行為控制都在WM_COMMAND中處理:
	if (123 == LOWORD(wParam))
			{
				if (LBN_DBLCLK == HIWORD(wParam))
				{
					int nIndex = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
					sprintf(szBuf, "姓名:%s          年齡:%d          電話:%s", g_Person[nIndex].pszName, g_Person[nIndex].nAge,
						 g_Person[nIndex].pszPhoneNum);
					InvalidateRect(hWnd, NULL, TRUE);
				}
			}

當點擊某一項后需要在窗口中顯示,顯示的工作可以在WM_PAINT中完成
PAINTSTRUCT ps;
			RECT rtClient;
			GetClientRect(hWnd, &rtClient);
			HDC hDc = BeginPaint(hWnd, &ps);
			DrawText(hDc, szBuf, strlen(szBuf), &rtClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
			EndPaint(hWnd, &ps);






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM