一、 簡單列表框的設計
1、 使用結構存放批量數據
typedef struct
{
TCHAR name[25];
BOOL gender;
UINT age;
TCHAR country[25];
TCHAR email[25];
}Contactors
定義結構體
Contactors myCon[]={
{"SINOASTEROID",TRUE,22,"CHINA","[email protected]"},
{"SMITH",TRUE,21,"AMERICA","[email protected]"},
{"ROSE",FALSE,20,"GERMEN","[email protected]"},
{"LICHADE",TRUE,21,"KOREA","[email protected]"},
}
定義並初始化機構體數組
2、 在對話框的WM_INITIAL消息中向LISTBOX添加項目
for(I=0;I<3;I++)
{
SendMessage(hlist,LB_ADDSTRING,0,(LPARAM)myCon[I].name;
)
file://使用LISTBOX無法正確顯示,改用COMBOBOX,指定其Owner Draw 為None
3、 捕獲控件發往父窗口的通知消息
switch(LOWord(wParam))
case IDC_LIST1:
{switch(HIWord(wParam))
case LBN_SELCHANGE:
nItem=SendMessage(hlist,LB_GETCURSEL,0,0);
LB_GETCURSEL得到列表框中當前選定的項目的以0為基准的索引值,如果沒有選定值,返回LB_ERR,WPARAM和LPARAM均為0
I=SendMessage(hlist,LB_GETITEMDATA,nItem,0);
對於自繪制的沒有指定LBS_HANSTRING風格LISTBOX,LB_GETITEMDATA返回的值為在LB_ADDSTRING或LB_INSERTSTRING中的LPARAM參數,否則為LB_SETITEMDATA的LPARAM參數
4、 將int、double類型變量轉換成字符串
TCHAR tempbuffer;
_itoa(myCon[I].age,tempbuffer,10);
整數轉換成字符串,存入緩沖區tempbuffer,10為基數,如果要得到以16進制字符串表示,換10為16即可,也可以換為2
_gcvt(myCon[I].adouble, 3, tempbuffer);
浮點數轉換成字符串,3為輸出的位數
二、 用LISTBOX顯示文件列表
1、 使用字符緩沖區存放當前目錄
TCHAR pathBuffer[256];//緩沖區應當足夠大
DWORD lenofPath;//存放字符串的長度定義為Word、int仍正常運行
GetCurrentDirectory(256,pathBuffer);//將當前路徑存入緩沖區pathBuffer
lenofPath=strlen(pathBuffer);//獲得字符串的長度
pathBufer[lenofPath]=0;//截斷字符串
2、 在WM_INITDIALOG消息中填充列表框
DlgDirList(hDlg,//對話框句柄
pathBuffer,路徑
IDC_LIST,//列表框
IDS_PATH,//顯示路徑的靜態控件
DDL_DIRECTORY//除普通文件外還顯示目錄,如果此參數為0,只顯示普通文件,還可以是DDL_READONLY、DDL_HIDE
);
3、 用戶雙擊,顯示選定的字符串並刪除
DWord nItem;
TCHAR lpText[256];
case WM_COMMAND:
{switch LOWord(wParam)
case IDL_FILELIST:
{switch HIWord(wParam)
case LBN_DBLCLK:
nItem=SendMessage(hList,LB_GETCURSET,0,0);
SendMessage(hList,LB_GETTEXT,nItem,lpText);
SendMessage(hList,LB_DELETESTRING,nItem,0);
break;
}
break;
}
三、 可多項選擇的列表框
1、 准備兩個int類型變量分別存儲用戶選定的項目數量和索引號已經被添加到緩沖區中的項目總數,如果加入到緩沖區的項目小於選定的項目,提示用戶
int nItems;
int nItemsSel;
int nBuffer[256];
nItems=SendMessage(hlist,LB_GETSELCOUNT,0,0);
nItemsSel=SendMessage(hlist,LB_GETSELITEMS,256,(LPARAM)nBuffer);
if(nItems {MessageBox(NULL,"Too Many Items Selected","",MB_OK);
return true;}
2、 遍歷用戶選定的項目
TCHAR outChar[256];
for(I=nItemsSel-1;I>=0;I--)//等效於for(I=0;I {
SendMessage(hlist,LB_GETTEXT,nBuffer[I],(LPARAM)outChar);
MessageBox(hDlg,outChar,outChar,MB_OK);
}
四、 自繪制的列表框
自繪制列表框可以在列表框中繪制圖片並隨意設置列表項的大小,自繪制ComboBox的設計方法和自繪制ListBox的設計方法大同小異,
1、 使用自繪制的列表框必須具有LBS_OWNERDRAW和LBS_HASSTRINGS風格,一點注意:LISTBOX的風格如果包含有LBS_OWNERDRAW,那麼LB_ADDSTRING加入的字符串不會顯示出來,只占位,等待父窗口對其進行繪制。
2、 自定義函數
void AddItem(HWND hlist,LPSTR lpstr,HBITMAP hbm)
{
UINT nItem;
nItem=SendMessage(hlist,LB_ADDSTRING,0,(LPARAM)lpstr);//返回新加入的字串的索引號
SendMessage(hlist,LB_SETITEMDATA,nItem,(LPARAM)hbm);//根據返回的索引號為列表框的項目附加額外數據,即位圖指針
}
3、 捕獲WM_MEASUREITEM消息,該消息的LPARAM為一個LPMEASUREITEMSTRUCT指針,用這個指針來設置列表框項目的高度:
LPMEASUREITEMSTRUCT lpmis;
lpmis=(LPMEASUREITEMSTRUCT)lParam;
lpmis->itemHeight=48;
return TRUE;
4、 捕獲WM_DRAWITEM消息,該消息的LPARAM為一個LPDRAWITEMSTRUCT指針
LPDRAWITEMSTRUCT lpdis;
HDC hMem;
HBITMAP htmpbm;
lpdis=(LPDRAWITEMSTRUCT)lParam;
hMem=CreateCompatibleDC(lpdis->hDC);
htmpbm=SendMessage(lpdis->hwndItem,LB_GETITEMDATA,lpdis->itemID,(LPARAM)0);
SelectObject(hMem,htmpbm);
BitBlt(lpdis->hDc,lpdis.rcItem.left,lpdis->rcItem.top,lpdis->rcItem.right,_lpdis->rcItem.bottom,hMem,0,0,SRCCOPY);
以上代碼應當在ODA_DRAWENTIRE中,即
switch (lpdis->iteMaction)
case ODA_DRAWENTIRE:
5、 輸出文本,這裡的關鍵是文本的定位
TCHAR tmpBuffer[256];
SendMessage(lpdis->hwndItem,LB_GETTEXT,lpdis->itemID,(LPARAM)tmpBuffer);//得到項目的文本
使用lpdis->rcItem.top/bottom進行定位,每一個項目的坐標以LISTBOX為坐標系,左上角為(0,0)。
TextOut(lpdis->hDc,48,(lpdis->rcItem.top+lpdis->rcItem.bottom)/2,tmpBuffer,strlen(tmpBuffer));