WIN32用户界面设计基础之ListBox 篇(3)
三、 可多项选择的列表框
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));