Win32字控件-列表框

[样式]


LBS_DISABLENOSCROLL 当列表框不包含足够的项目移动时,列表框中显示禁用垂直滚动条。如果没有此样式当列表框不包含足够的项目时,滚动条隐藏。

LBS_EXTENDEDSEL 使用shift键和鼠标或特定组合键,用户可以选择多个项。

LBS_HASSTRINGS 指定所有者描述包含字符串的项列表框。列表框保留内存和字符串的指针,以便应用程序可以使用 GetText 成员函数检索文本特定项的。

LBS_MULTICOLUMN 指定具有水平滚动的列表框。SetColumnWidth 成员函数上设置列宽。

LBS_MULTIPLESEL 用户每次单击或双击该字符串,字符串选择切换。任意数量的字符串中选择。

LBS_NODATA 指定无数据列表框。在计数列表框中的项将多个千,请指定此样式。无数据列表框还必须具有 LBS_OWNERDRAWFIXED样式,但是不能有 LBS_SORT 或 LBS_HASSTRINGS 样式。

无数据类似于所有者描述的列表框列表框,但它不包含字符串或位图数据为项。命令添加,插入或删除项目始终忽略任何特定项目数据;请求始终会在列表框中失败的字符串。必须在绘制时,该系统发送 WM_DRAWITEM 信息对所有者窗口的项目。DRAWITEMSTRUCT 结构的 itemID 成员通过使用 WM_DRAWITEM 消息指定要绘制的项的行号。无数据列表框不会发送 WM_DELETEITEM 信息。

LBS_NOINTEGRALHEIGHT 在创建了列表框,列表框的尺寸恰好为应用程序指定的范围。通常,窗口的大小一个列表框,以便列表框不显示分部项目。

LBS_NOREDRAW 当更改时, 列表框中显示不更新。此样式可交付 WM_SETREDRAW 信息随时更改。

LBS_NOSEL 指定列表框包含中查看,但不要选择的项。

LBS_NOTIFY 父窗口接收输入消息,每当用户单击或双击字符串。

LBS_OWNERDRAWFIXED 列表框的所有者绘制到其内容负责;在列表框中的项是同一高度。

LBS_OWNERDRAWVARIABLE 列表框的所有者绘制到其内容负责;在列表框中的项是可变在高度。

LBS_SORT 在列表框中字符串按字母顺序排序。

LBS_STANDARD 在列表框中字符串按字母顺序排序,并且,父窗口接收输入消息,每当用户单击或双击字符串。列表框在任何方面包含边框。

LBS_USETABSTOPS 在绘制其字符串时, 允许列表框识别并展开制表符。默认 tab 位置为 32 个对话框单位。(对话框单位是一个水平或垂直距离。一个水平对话框单位相等到当前对话框基础宽度单位的四分之一。对话框基本单元根据当前系统字体的高度和宽度计算。GetDialogBaseUnits windows 函数返回以像素为单位的当前对话框基本单元。)不应使用此样式。 LBS_OWNERDRAWFIXED。

LBS_WANTKEYBOARDINPUT 列表框的所有者接收 WM_VKEYTOITEM 或 WM_CHARTOITEM 消息,只要用户按键,当列表框输入焦点时。这使应用程序执行特殊处理在键入。

 

[通知码]

必须指定LBS_NOTIFY风格
LBN_ERRSPACE内存分配失败
LBN_SELCHANGE当前选择项发生变化
LBN_CLICKED单击
LBN_DBLCLK双击
LBN_SELCANCEL取消选择
LBN_SETFOCUS列表框获得焦点
LBN_KILLFOCUS列表框失去焦点
LBN_CLICKCHECKMARK单击条目检查框
LBN_ENTER在列表框中按下Enter键
只有指下LBS_NOTIFY时,列表框才会向父窗口发送通知消息
如果用SetNotificationCallback设定了通知回调函数
则控件不发送MSG_COMMAND通知消息,而会直接调用设定的通知回调函数

 

[消息]

LB_ADDSTRING  在列表框中添加字符串项,SendMessage( listHwnd, LB_ADDSTRING, 0, (LPARAM)TEXT("abc") );
LB_INSERTSTRING 在列表框插入字符串项,SendMessage( listHwnd,LB_INSERTSTRING,1,TEXT("e") );//在索引位置1处插入
LB_DELETESTRING 在列表框中删除字符串项,SendMessage( listHwnd,LB_DELETESTRING,1,0 );//删除索引位置为1的项
LB_SELITEMRANGEEX 当列表框设置为LBS_EXTENDEDSEL样式时可以发送此消息进行多选,SendMessage( listHwnd,LB_SELITEMRANGEEX,0,2 )选择前3项
LB_RESETCONTENT 删除列表框中所有项,SendMessage( listHwnd,LB_RESETCONTENT,0,0 ); 
LB_SETSEL 选中或取消选中 多选列表框中某项(必须有LBS_EXTENDEDSEL样式的情况下才会响应此消息),SendMessage( listHwnd,LB_RESETCONTENT,TRUE,2 );//选中第3项,为FALSE时取消选中第3项
LB_GETSEL 得到多选列表框中某项是否被选中(必须有LBS_EXTENDEDSEL样式的情况下才会响应此消息),选中返回值>0,否则返回值为0,发生错误返回LB_ERR。SendMessage( listHwnd,LB_GETSEL,2,0 );

LB_SETCURSEL 选中单选列表框中某项(必须没有LBS_EXTENDEDSEL样式的情况下才会响应此消息)SendMessage( listHwnd,LB_SETCURSEL,2,0 );//选中第3项LB_GETCURSEL 得到单选列表框中是否有选中项(必须没有LBS_EXTENDEDSEL样式的情况下才会响应此消息),有就返回从0开始的索引值,否则返回值为LB_ERR。SendMessage( listHwnd,LB_GETCURSEL,0,0 );
LB_GETTEXT 取列表框中指定项的文本到参数lParam中,此时wParam为项的索引,lParam指向一个字符串缓冲区(长度必须大于返回值)。SendMessage( listHwnd,LB_GETTEXT,1,szTemp );返回值为字符串的长度
LB_GETTEXTLEN 取列表框中指定项的文本长度,此时wParam为项的索引,lParam为0。SendMessage( listHwnd,LB_GETTEXTLEN,1,0 );
LB_GETCOUNT 返回列表框所有项目数。SendMessage( listHwnd,LB_GETCOUNT,0,0 );
LB_SELECTSTRING 应用程序发送LB_SELECTSTRING的信息搜索单选列表框中指定的字符串中的字符开头的项目。如果找到匹配的项目,该项目被选中。wParam开始搜索的项索引号,lParam要搜索字符串。如果搜索成功,则返回值是所选项目的索引。如果搜索不成功,则返回值是LB_ERR并不会改变当前选择。
LB_DIR 应用程序发送LB_DIR消息向列表框添加(驱动器或文件夹或文件)列表,wParam应设置为文件属性,lParam设置为过滤器

文件属性:
wParam参数的值。指定文件的属性被添加到列表框中。这个参数可以是下列值的组合:值描述
DDL_ARCHIVE包括归档文件。
DDL_DIRECTORY包括子目录。子目录名被括在方括号([])。
DDL_DRIVES包括驱动器。驱动形式列出[-X],其中x是驱动器盘符。
DDL_EXCLUSIVE只包括具有指定属性的文件。默认情况下,读写文件列出,即使没有指定DDL_READWRITE。
DDL_HIDDEN包括隐藏文件。
DDL_READONLY包括只读文件。
DDL_READWRITE包括读写文件没有附加属性。
DDL_SYSTEM包括系统文件。

例:

//列出C盘所有子目录和文件(包括隐藏文件和系统文件),返回值为最末项的索引号
INT n=SendMessage(listbox1,LB_DIR,DDL_ARCHIVE|DDL_DIRECTORY|DDL_HIDDEN|DDL_SYSTEM,TEXT("c:\\*.*"));
//列出硬盘所有分区,返回值为最末项的索引号
INT n=SendMessage(listbox1,LB_DIR,DDL_ARCHIVE|DDL_DRIVES,TEXT(""));

LB_GETTOPINDEX 返回列表框中第一个可见项目的索引。INT n=SendMessage(listbox1,LB_GETTOPINDEX,0,0);
LB_FINDSTRING 与LB_SELECTSTRING相似同样是返回匹配成功的项目索引号,但这个消息可以针对多选列表框且不会选中该项
LB_GETSELCOUNT 返回值多选列表框中选定的项目总数。如果列表框是一个单选列表框,返回值是LB_ERR。
LB_GETSELITEMS
返回一个整形数组,它包含多选列表框中所选中的项目索引号,例如选中了第1,3,5,6项。那么返回的数组为{1,3,5,6}

例子(个人理解):

INT *psel,selcnt;
//选中第1到5项
SendMessage(listbox1,LB_SELITEMRANGEEX,1,5);
//统计所有选中项总数
selcnt=SendMessage(listbox1,LB_GETSELCOUNT,0,0);
//分配selcnt个整形单元
psel=(INT*)malloc(sizeof(INT)*selcnt);
//把选中项的索引号放到psel中
SendMessage(listbox1,LB_GETSELITEMS,5,nsel);


 

LB_SETTABSTOPS 应用程序发送LB_SETTABSTOPS的的消息在列表框中设置制表位位置。
LB_GETHORIZONTALEXTENT 返回列表框水平滚动的宽度,以像素为单位。
LB_SETHORIZONTALEXTENT 设置列表框水平滚动的宽度,以像素为单位。
LB_SETCOLUMNWIDTH 当列表框设置为LBS_MULTICOLUMN多列时,此消息设置列宽
LB_ADDFILE 添加一个文件名到列表中,SendMessage(listbox1,LB_ADDFILE,0,TEXT("c:\\MyMusicPlayer.ini"));
LB_SETTOPINDEX  设置列表框中第一个可见项目的索引。SendMessage(listbox1,LB_SETTOPINDEX,5,0)设置第5项为第一个可见项
LB_GETITEMRECT 得到某个列表项目的客户端区域。SendMessage(listbox1,LB_GETITEMRECT,1,&rect);返回第1项的客户端区域到rect中
LB_GETITEMDATA 得到某个列表项目的值,而非文本
LB_SETITEMDATA 设置某个列表项目的值,当这个项目存在时
LB_SELITEMRANGE 设置多选列表框中的选中项,与LB_GETSEITEMS相反
LB_SETANCHORINDEX  应用程序发送一个的LB_SETANCHORINDEX消息设置锚项目,该项目从多重选择开始。多重选择跨越所有项目从锚项插入符项目。
LB_GETANCHORINDEX 应用程序发送一个LB_GETANCHORINDEX信息检索索引锚项目,该项目从开始多重选择。多重选择跨越所有项目从锚项插入符项目
LB_SETCARETINDEX 应用程序发送的LB_SETCARETINDEX消息,在指定的指数在多重选择列表框中的项目设置焦点矩形。如果该项目是不可见的,它滚动到视图。
LB_GETCARETINDEX 应用程序发送LB_GETCARETINDEX的消息来确定该项目的索引,在多重选择列表框中的焦点矩形。的产品可能会或可能不会被选中。
LB_SETITEMHEIGHT 当列表为LBS_OWNERDRAWVARIABLE风格时,设置列表项的高度,以像素为单位
LB_GETITEMHEIGHT 当列表为LBS_OWNERDRAWVARIABLE风格时,返回列表项的高度,以像素为单位
LB_FINDSTRINGEXACT 返回索引号,该项精确匹配要查找的字符串,不区分大小写。例如查找所有列表项中是否有"abc"
INT nIndex=SendMessage(listbox1,LB_FINDSTRINGEXACT,-1,TEXT("abc"));
LB_GETLOCALE 应用程序发送一个LB_GETLOCALE消息检索列表框中的当前地区。返回值:高位字包含国家代码,低位字包含的语言标识符。
LB_SETCOUNT 应用程序发送LB_SETCOUNT的消息设置的项目数,列表框必须是LBS_NODATA风格
LB_INITSTORAGE 当添加大量的列表项目时,此消息先初始化项目的数量和分配内存,然后再添加列表框。能提高性能。
wParam:要添加的项目数量
lParam:分配的内存量,以字节为单位
LB_ITEMFROMPOINT 从一个坐标点计算列表项的索引号。

(个人理解)

TCHAR szTemp[64];
//旧的列表框消息处理
WNDPROC oldListBoxProc;

//声明新的列表框消息处理
LRESULT CALLBACK ListBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
//当鼠标在列表框中移动
void OnMouseMove(HWND hwnd,int x,int y,UINT keyFlags)
{
	_stprintf(szTemp,TEXT("x=%d,y=%d,ITEM INDEX=%d"),x,y,
		SendMessage(hwnd,LB_ITEMFROMPOINT,0,(LPARAM)MAKELPARAM(x,y)));
	SetWindowText(GetParent(hwnd),szTemp);
}
//建立主窗口
BOOL onCreate(HWND hwnd,LPCREATESTRUCT lpCreateStruct)
{
	//建立1个列表框
	listbox1=CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("LISTBOX"),
		NULL,WS_VISIBLE|WS_CHILD|LBS_DISABLENOSCROLL|LBS_EXTENDEDSEL|(LBS_STANDARD & ~WS_BORDER),
		10,10,150,90,hwnd,(HMENU)LISTBOX_1,lpCreateStruct->hInstance,NULL);
	//将C盘所有文件夹和文件转入列表框
	SendMessage(listbox1,LB_DIR,DDL_ARCHIVE|DDL_DIRECTORY|DDL_HIDDEN|DDL_SYSTEM,TEXT("c:\\*.*"));
	//为listbox1设置新的窗口处理过程,同时保存默认的窗口处理
	oldListBoxProc=(WNDPROC)SetWindowLong(listbox1,GWL_WNDPROC,ListBoxProc);
}
//定义新的列表框消息处理
LRESULT CALLBACK ListBoxProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
		//如果是鼠标移动消息,转到OnMouseMove
		HANDLE_MSG(hwnd,WM_MOUSEMOVE,OnMouseMove);
	}
	//其它消息交给旧的列表框消息处理过程
	return CallWindowProc(oldListBoxProc,hwnd,message,wParam,lParam);
}
//主窗口建立及消息处理 省略。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值