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,发一次消息只能列出一个文件,,所以你可以循环列出所有文件。

0 0
原创粉丝点击