特殊说明:版权归个人所有,请勿转载,谢谢合作。
列表框控件主要用于输入、它允许从列表项中进行单项或多项选择,选择的对象可以是文本、文件、位图等。被选择的列表项呈高亮状态。
// 创建列表框 g_hListWnd = CreateWindow("ListBox", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_SORT | WS_VSCROLL, 10, 10, 200, 300, hWnd, (HMENU)ID_LIST_TEXT, g_hIns, NULL);
- 表10.5 列表框控件风格
风格 | 描述 |
LBS_EXTENDEDSEL | 可以通过Shift键或鼠标进行多选 |
LBS_HASSTRINGS | 指定一个各自绘的列表框,列表框负责分配内存空间,可以使用GetText函数获得列表框里选项的内容 |
LBS_MULTICOLUMN | 指定列表框以多列形式显示内容 |
LBS_MULTIPLESEL | 指定可以选择多个列表项 |
LBS_NOINTEGRALHEIGHT | 指定创建列表框时,列表框的大小由系统指定 |
LBS_NOREDRAW | 列表框不响应用户的修改,可以通过发送WM_REDRAW来取消该设置 |
LBS_NOTIFY | 指定主窗口接收列表框的任何改变的消息 |
LBS_OWNERDRAWFIXED | 主窗口负责列表框的重绘操作,列表框中每项的高度相同 |
LBS_OWNERDRAWVARIABLE | 主窗口负责列表框的重绘操作,列表框中每项的高度可以变化 |
LBS_SORT | 按各项名称的字母排序 |
LBS_STANDARD | 等同于LBS_SORT和LBS_NOTIFY |
LBS_USETABSTOPS | 允许用户使用Tab键在各项中切换 |
LBS_WANTKEYBOARDINPUT | 输入焦点在列表框时,任何键盘输入都会向父窗口发送WM_VKEYTOITEM或者WM_CHARTOITEM消息 |
LBS_DISABLENOSCROLI | 当列表项超出显示范围,激活垂直滚动条。没有该属性时,滚动条处于隐藏状态 |
在默认情况下,列表框只允许单选操作,如果需要多选操作,需要表列表框的风格定义为MULTIPLESEL和LBS_EXTENDEDSEL。当然可以通过风格的设置,可以使列表框展示不同的外观与操作。
列表框控件本身也是一个窗口,如果直接对它进行各种各样的操作,就需要使用SendMessage函数来进行控制。虽然列表框在代码中没有过程处理函数,但它可以接收到发送过的消息。列表框通常会发送WM_COMMAND消息给主窗口,其中,wParam的低位字节表示列表框的标识符,高位字节表示消息的类型,lParam表示主窗口句柄。如表10.6所示,为发送与捕获的消息类型。
- 表10.6 列表框消息
消息 | 描述 |
LB_DELETESTRING | 删除指定行 |
LB_ADDFILE | 向列表框里增加一个文件(包括目录) |
LB_FINDSTRING | 在列表框里查找指定的项 |
LB_FINDSTRlNGEXACT | 精确查找指定的项 |
LB_GETCOUNT | 获得列表中行的数量 |
LB_GETCURSEL | 获得当前被选中列的序号(即第几行) |
LB_GETSEL | 获得被选项的状态 |
LB_GETSELCOUNT | 获得列表项被选择的数量(多列选择) |
LB_GETTEXT | 获得选中的文本内容,返回值为该字符串长度 |
LB_GETTEXTLEN | 获得字符串长度 |
LB_INITSTORAGE | 向列表框增加项之前存储原来的内容 |
LB_INSERTSTRING | 向列表框增加一项,但不重新排序 |
LB_ITEMFROMPOINT | 获得离指定点最近项的序号 |
LB_RESETCONTENT | 清除列表框 |
LB_SELECTSTRING | 寻找指定的项 |
LB_SELITEMRANGE | 指定选择的范围 |
LB_SELITEMRANGEEX | 选定或者删除指定的项 |
LB_SETCOLUMNWIDTH | 设置列的宽度 |
LB_SETCOUNT | 设置列表框里项的最大数目 |
LB_SETCURSEL | 选中指定的项 |
LBN_DBLCLK | 发送用户双击的消息 |
LBN_ERRSPACE | 发送内存空间不够的消息 |
LBN_KILLFOCUS | 当列表框失去焦点时发送该消息 |
LBN_SELCANCEL | 当用户取消选择时发送该消息 |
LBN_SELCHANGE | 当用户选择改变时发送该消息 |
LBN_SETFOCUS | 当输入焦点转移到列表框时发送该消息 |
WM_CTLCOLORLISTBOX | 在列表框重绘时向父窗口发送该消息 |
WM_DELETEITEM | 删除选项 |
WM_VKEYTOITEM | 输入焦点在列表框里,用户按键时发送该消息 |
【例10-4】实现了点击【添加】按钮,将编辑框的内容,添加到列表框中,同时在列表框中选择后,可以点击【删除】按钮将内容在列表中删除。
//************************************************************** // NAME : Demo_10.cpp //************************************************************** // POWER : Copyright (c) 2012 for lixinghua. // AUTHOR : 2012-8-5 14:01 Create by lixinghua for functions. // VERSION : V1.0.0.1 // NOTE : 手工整理的创建窗口的代码,本程序只创建一个名称 // 为MyWin的窗口。 //************************************************************** // #include <windows.h> #include <stdio.h> // 宏定义,分别定义按钮的ID #define ID_BUTTON_ADD 0x01 #define ID_BUTTON_DEL 0x02 #define ID_EDIT_TEXT 0x03 #define ID_LIST_TEXT 0x04 // 回调函数,用于系统消息的处理。 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE g_hIns = NULL; HWND g_hBtnAddWnd = NULL; // 按钮句柄 HWND g_hBtnDelWnd = NULL; // 按钮句柄 HWND g_hEditWnd = NULL; // 编辑框句柄 HWND g_hListWnd = NULL; // 列表句柄 //----------------------------------------------------------------------------- // FUNC : 入口函数 //----------------------------------------------------------------------------- // IN : hInstance,进程的实例句柄; // hPrevInstance,前一个进程实例句柄,默认为NULL即可; // lpCmdLine,命令行参数; // nCmdShow,当前窗口显示状态。 // OUT : void // RETURN : 返回为整型,代表窗口的状态,其中APIENTRY描述了 // 压栈的顺序。 // AUTHOR : 2012-2-6 11:18 Create by lixinghua for functions. // NOTE : 此函数为Win32入口函数。 //----------------------------------------------------------------------------- // int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 定义所用到的参数 // char szWindowClass[] = { "WinClsName" }; // 窗口类的名称 HWND hWnd = NULL; // 用于存放窗口句柄 //char szTitle[] = { "五子棋" }; // 窗口标题名称 char szTitle[] = { "MyWin" }; // 窗口标题名称 MSG msg; // 存放消息的结构体, // 由系统提供 // 保存进程实例句柄 g_hIns = hInstance; // 1. 设计一个窗口类 // WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWindowClass; wcex.hIconSm = NULL; // 2. 注册窗口 // RegisterClassEx(&wcex); // 3. 创建窗口 // HMENU hMenu = NULL; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, hMenu, hInstance, NULL); // 判断创建是否成功 if (!hWnd) { return FALSE; }//end if // 4. 显示并更新窗口 ShowWindow(hWnd, nCmdShow); // 请注意 nCmdShow 参数 UpdateWindow(hWnd); // 5. 进入消息循环 while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }//end while return 0; } //----------------------------------------------------------------------------- // FUNC : 回调函数 //----------------------------------------------------------------------------- // IN : hWnd,窗口句柄; // message,要处理的消息ID,以此来区分消息; // wParam,消息参数,根据消息的不同内容也有所不同; // lParam,消息参数,根据消息的不同内容也有所不同。 // OUT : void // RETURN : void // AUTHOR : 2012-2-6 11:36 Create by lixinghua for functions. // NOTE : 此函数用于系统消息的处理。 //----------------------------------------------------------------------------- // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; // 结构体包含了用于绘 // 制窗口客户区的信息 HDC hdc; // 设备环境句柄 int wmId, wmEvent; char szContext[512] = { 0 }; // 用于存放控件的内容 int nSelPos = 0; // 存放选择列表的位置 // 消息处理 // switch (message) { // 创建窗口时响应的事件 case WM_CREATE: // 创建列表框 g_hListWnd = CreateWindow("ListBox", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD| LBS_SORT| WS_VSCROLL, 10, 10, 200, 300, hWnd, (HMENU)ID_LIST_TEXT, g_hIns, NULL); // 创建编辑框 g_hEditWnd = CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER, 220, 80, 200, 20, hWnd, (HMENU)ID_EDIT_TEXT, g_hIns, NULL); // 创建按钮-添加 g_hBtnAddWnd = CreateWindow("BUTTON", "添加", WS_CHILD | WS_VISIBLE, 220, 120, 50, 30, hWnd, (HMENU)ID_BUTTON_ADD, g_hIns, NULL); g_hBtnDelWnd = CreateWindow("BUTTON", "删除", WS_CHILD | WS_VISIBLE, 340, 120, 50, 30, hWnd, (HMENU)ID_BUTTON_DEL, g_hIns, NULL); break; // 菜单响应事件 case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 选择了列表项 if(wmId == ID_LIST_TEXT && wmEvent == LBN_SELCHANGE) { // 根据消息的发送,返回选择的位置 nSelPos = SendMessage(g_hListWnd, LB_GETCURSEL, 0, 0); // 获得列表框中的内容 nSelPos = SendMessage(g_hListWnd, LB_GETTEXT,nSelPos,(LPARAM)szContext); // 设置编辑框中的内容 SetWindowText(g_hEditWnd, szContext); }//end if // 点击按钮时,捕获编辑框的内容,并显示。 switch (wParam) { // 添加功能 case ID_BUTTON_ADD: // 获得编辑框里的内容 GetWindowText(g_hEditWnd, szContext, 512); // 将内容发送到列表控件中 SendMessage(g_hListWnd, LB_ADDSTRING, 0, (LPARAM)szContext); // 清空编辑框中的内容 SetWindowText(g_hEditWnd, ""); break; // 删除功能 case ID_BUTTON_DEL: // 根据消息的发送,返回选择的位置 nSelPos = SendMessage(g_hListWnd, LB_GETCURSEL, 0, 0); // 发送删除消息 SendMessage(g_hListWnd, LB_DELETESTRING, nSelPos, wParam); break; default: return DefWindowProc(hWnd, message, wParam, lParam); }//end switch break; // 图形绘制事件 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; // 窗口销毁消息,关闭窗口时响应。 case WM_DESTROY: PostQuitMessage(0); break; default: // 调用系统默认消息处理,即交给系统处理。 return DefWindowProc(hWnd, message, wParam, lParam); }//end switch return 0; }
列表框控件本身是窗口,所以需要以SendMessage函数来实现消息的传递,其执行结果如图10.5所示。
- 图10.5 列表框控件演示结果
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。