WIN32用户界面设计基础之ListBox篇

2008-04-09 04:08:52来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


  一、 简单列表框的设计

  1、 使用结构存放批量数据

typedef struct
{
TCHAR name[25];
BOOL gender;
UINT age;
TCHAR country[25];
TCHAR email[25];
}Contactors
定义结构体
Contactors myCon[]={
{"SINOASTEROID",TRUE,22,"CHINA","sinoasteroid@sina.com"},
{"SMITH",TRUE,21,"AMERICA","smith@gsoft.com"},
{"ROSE",FALSE,20,"GERMEN","rose@psoftware.com"},
{"LICHADE",TRUE,21,"KOREA","lich@korea.com"},
}
  定义并初始化机构体数组

  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);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:在VisualC 中用ADO进行数据库编程

下一篇:VisualC .NET编程:托管C 概述

热门词条
热门标签