Windows列表框类
来源:互联网 发布:灵魂摆渡风华绝代知乎 编辑:程序博客网 时间:2024/05/22 06:38
列表框就是像酷狗播放器歌曲列表那种,一首首歌相当于一个个项目,可以单选一个也可以多选项目,选中的时候项目会高亮,这是自动的,无需自己设置
当一个项目被选中的时候,列表框控件便发送WM_COMMAND消息到其父窗口,然后父窗口确定哪个项目被选中
单选列表框: 用户可以按动空格键选择光标所在的项目。方向键可以移动光标和当前的选择,并可以滚动列表框中的内容
多选框列表: 空格建用于切换光标所在项目的选择状态,可以同时选择多个项目。
一般多选框不常见,主要还是单选框。
创建一个listbox(空项目)
例如:
case WM_CREATE: hListBox=CreateWindow(L"listbox",L"",WS_CHILD|WS_VISIBLE|LBS_STANDARD ,20,20,200,400,hwnd,(HMENU)1,hInst,0); break; case WM_SETFOCUS: SetFocus(hListBox); break;
效果如图:
列表框常用样式:
LBS_NOTIFY 使父窗口收到从listbox发来的WM_COMMAND消息
LBS_SORT 对项目进行排序
LBS_MULTIPLESEL 创建一个多选listbox
LBS_NOREDRAW 使listbox不更新列表
LBS_STANDARD 标准样式
窗口样式:
WS_SIZEBOX和WS_CAPTION :可以让用户移动listbox和改变大小尺寸
计算列表框的高度:一个字符的高度乘以出现在视图中项目的数量
向列表框中添加字符串:
如果使用, LBS_SORT样式,则直接插入字符串即可,会自动排序的
SendMessage(hListBox,LB_ADDSTRING,0,(LPARAM)szString);
如果没有使用LBS_SORT样式,则可以在指定位置插入字符串
SendMessage(hListBox,LB_INSERTSTRING,iIndex,(LPARAM),szString);
iIndex的计数是从0开始的,从顶部开始算起0,1,2,…
例如:
case WM_CREATE: hListBox=CreateWindow(L"listbox",L"",WS_CHILD|WS_VISIBLE|LBS_STANDARD ,20,20,200,400,hwnd,(HMENU)1,hInst,0); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串1"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串2"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串3"); SendMessage(hListBox, LB_INSERTSTRING, 3,(LPARAM)L"字符串4"); break; case WM_SETFOCUS: SetFocus(hListBox); break;
效果如图:
前面三个字符串是添加进去自动排序的,最后一个是插入进去的,因为前面三个索引是0,1,2,所以把最后一个字符串插在3位置就是第三个字符串的后面
再如:
SendMessage(hListBox, LB_INSERTSTRING, 0,(LPARAM)L"字符串4");
效果如图:
位置0就 是插在第一个前面
再如:
SendMessage(hListBox, LB_INSERTSTRING, -1,(LPARAM)L"字符串4");
效果如图:
索引是-1就表示直接插入末尾
再如:
SendMessage(hListBox, LB_INSERTSTRING, 4,(LPARAM)L"字符串4");
效果如图:
如果索引的值大于现有的项目数则插入失败
在指定索引位置删除一个字符串
例如:
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串1"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串2"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串3"); SendMessage(hListBox, LB_INSERTSTRING, 3,(LPARAM)L"字符串4"); SendMessage(hListBox, LB_DELETESTRING, 2, 0);
效果如图:
删除了索引2的字符串
清除listbox中的所有项目
例如:
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串1"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串2"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串3"); SendMessage(hListBox, LB_INSERTSTRING, 3,(LPARAM)L"字符串4"); SendMessage(hListBox, LB_RESETCONTENT, 0, 0);
效果如图:
当有大量项目被添加进去的时候要暂时抑制listbox的自我更新,等添加完之后再更新
关闭重绘标志
SendMessage(hListBox,WM_SETREDRAW,FALSE,0);
开启重绘标志
SendMessage(hListBox,WM_SETREDRAW,TRUE,0);
项目的选择和提取:
获取listbox中的项目个数
iCount=SendMessage(hListBox,LB_GETCOUNT,0,0);
突出默认选项
SendMessage(hListBox,LB_SETCURSEL,iIndex,0);
例如:
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串1"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串2"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串3"); SendMessage(hListBox, LB_INSERTSTRING, 3,(LPARAM)L"字符串4"); SendMessage(hListBox, LB_SETCURSEL, 2, 0);
效果如图:
根据起始字符选择一个项目
参数iIndex表示从哪里开始匹配
如果索引为-1表示从顶端开始查找
返回匹配处的索引值
SendMessage(hListBox, LB_SELECTSTRING, iIndex, (LPARAM)szSearchString);
例如:
SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"符串1"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"符串2"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"字符串3"); SendMessage(hListBox, LB_INSERTSTRING, 3, (LPARAM)L"字符串4"); int iIndex = SendMessage(hListBox, LB_SELECTSTRING, -1, (LPARAM)L"字"); SendMessage(hListBox, LB_SETCURSEL, iIndex, 0);
效果如图:
获取当前选中项的索引值,在WM_COMMAND消息中使用
iIndex=SendMessage(hListBox,LB_GETCURSEL,0,0);
如果没有项目被选中,返回LB_ERR
获取列表框中任何字符串的长度
iLength=SendMessage(hListBox,LB_GETTEXTLEN,iIndex,0);
可以同时复制一个文本到缓冲区中
iLength=SendMessage(hListBox,LB_GETTEXTLEN,iIndex,(LPARAM)szBuffer);
列表框的消息:
LOWORD(wParam) 子窗口ID
HIWORD(wParam) 通知码
lParam 子窗口句柄
通知码:
#define LBN_ERRSPACE (-2)//表明listbox耗尽空间#define LBN_SELCHANGE 1 //表明当前选择发生变化#define LBN_DBLCLK 2 //鼠标双击#define LBN_SELCANCEL 3#define LBN_SETFOCUS 4#define LBN_KILLFOCUS 5
例如:
case WM_COMMAND: { int wmId = LOWORD(wParam); // 分析菜单选择: switch (wmId) { case 1: if (HIWORD(wParam) == LBN_SELCHANGE) MessageBox(nullptr, L"状态发生了改变", L"", 0); if (HIWORD(wParam) == LBN_DBLCLK) MessageBox(nullptr, L"双击了这个项目", L"", 0); break; default: break; } } break;
效果如图:
列出文件:
列表框最强大最重要的消息LB_DIR
SendMessage(hListBox,LB_DIR,iAttr,(LPARAM)szFileSpec);
iAttr参数是文件属性代码,文件属性代码的最低字节可以是下表中数值的组合:
iAttr 值 属性
DDL_READWRITE 0x0000 普通文件
DDL_READONLY 0x0001 只读文件
DDL_HIDDEN 0x0002 隐藏文件
DDL_SYSTEM 0x0004 系统文件
DDL_DIRECTORY 0x0010 子目录
DDL_ARCHIVE 0x0020 归档位设立的档案
高字节提供了一些对所要求项目的附加控制:
iAttr 值 属性
DDL_DRIVES 0x4000 包括磁盘驱动器句柄
DDL_EXCLUSIVE 0x8000 互斥搜索
DDL:“dialog directory list”(对话框目录列表)
列出某个文件
例如:
case WM_CREATE: { hListBox = CreateWindow(L"listbox", L"", WS_CHILD |WS_VISIBLE | WS_SIZEBOX|WS_CAPTION|LBS_STANDARD , 20, 20, 200, 400, hwnd, (HMENU)1, hInst, 0); if (LB_ERR == SendMessage(hListBox, LB_DIR, DDL_READWRITE|DDL_DIRECTORY, (LPARAM)L"F:\\Windows程序设计\\API实例")) { dwError = GetLastError(); } } break;
效果如图:
如果你要列出的文件是个子目录而不是一个单文件就必须加上DDL_DIRECTORY,发一次消息只能列出一个文件,,所以你可以循环列出所有文件。
- Windows列表框类
- Windows程序设计,列表框类
- Windows程序设计,列表框类-显示文件目录
- 关于windows程序设计 列表框类 ——environ
- 《Windows程序设计》之列表框控件
- Windows常见进程列表
- Windows快捷键详细列表
- Windows快捷键列表
- windows.open()参数列表
- windows.open()参数列表
- windows 2000进程列表
- Windows消息列表
- Windows消息列表
- Windows内核资源列表
- windows.open()参数列表
- windows.open()参数列表
- Windows快捷键详细列表
- Windows内核资源列表
- C++虚函数与虚函数表
- jedis
- oracle 的那些事儿
- Js-Html 前端系列--全选,反选
- Android开始写笔记
- Windows列表框类
- Halcons模板匹配-读取数字
- 从学校第一次踏出
- 编译Android系统源码和内核源码
- iOS_SpriteKit_01_初识SpriteKit
- Java ArrayList学习
- unity 2D 透明遮罩 简单实现物体一半透明
- 二叉树的定义及基本操作
- Android图片二级缓存