组合框(ComboBox)是将文本框和列表框的功能融合在一起的一种控件。因此从外观上看,它包含列表框和文本框两个部分,程序运行时,在列表框中选中的列表项会自动填入文本框。组合框分为简易式组合框(Simple ComboBox)、下拉式组合框(DropDown ComboBox)和下拉式列表框( DropDown ListBox)三种。
// 创建列表框
g_hComBoxWnd = CreateWindow("ComboBox", NULL,
WS_CHILDWINDOW | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_SORT,
10, 10, 200, 300, hWnd, (HMENU)ID_COMBOX_TEXT, g_hIns, NULL);
组合框创建后,需要初始化,即通过向组合框发送CB_ADDSTRING增加最初的项,这类似于列表框。如果没有定义CBS_SORT风格,新增的项将被增加到组合框的末尾。应用程序的父窗口主要通过 WM_COMMAND消息与组合框通信,应用程序可以用CB_FINDSTRINGEXACT搜索指定的项,还可以发送CB_DELETESTRING删除指定的项,当需要删除所有的项时,发送消息CB_RESETCONTENT即可。组合框风格取值如表10.7所示。
- 表10.7 组合框控件风格
| 风格 | 描述 |
| CBS_AUTOHSCROLL | 编辑框中自动水平滚动 |
| CBS_DROPDOWN | 组合框由列表框和编辑框组成,列表框平时不可见 |
| CBS_DROPDOWNLIST | 组合框由列表框和静态文本组成,列表框平时不可见 |
| CBS_HASSTRINGS | 应用程序能够使用GetText取得组合框里的文本 |
| CBS_OEMCONVERT | 把输入的文本将从ANSI码转换成OEM码,然后又转换成ANSI码;这样的目的是保证函数AnsiToOem的正确调用 |
| CBS_OWNERDRAWFIXED | 父窗口负责重画组合框里的各项,并使各项的高度一致 |
| CBS_OWNERDRAWVARIABLE | 父窗口负责重画组合框里的各项,各项的高度不一致 |
| CBS_SIMPLE | 组合框显示所有的项,当前的选项在编辑区域中显示 |
| CBS_SORT | 自动排序 |
| CBS_DISABLENOSCROLL | 组合框有垂直滚动条,当组合框的项不足时,滚动条禁活;没有该风格,则滚动条隐藏 |
| CBS_NOINTEGRALHEIGHT | 指定组合框的大小由程序精确控制,通常组合框的大小由组合框里项的数目决定 |
Win32 SDK为组合框提供了文件显示和搜索的功能,它们主要通过DlgDirListComboBox和DlgDirSelectComboBox函数来实现。其函数设置参数如表10.8所示。
- 表10.8 参数设置列表
| 参数 | 描述 |
| CB_ADDSTRING | 增加一项 |
| CB_DELETESTRING | 删除指定的项 |
| CB_DIR | 发送搜索目录的消息 |
| CB_FINDSTRING | 搜索指定的项 |
| CB_FINDSTRINGEXACT | 精确搜索指定的项 |
| CB_GETCOUNT | 得到组合框中项的数目 |
| CB_GETCURSEL | 得到当前选中项的序号 |
| CB_GETEDITSEL | 得到编辑区域选中的文本 |
| CB_GETLBTEXT | 得到编辑区域的文本 |
| CB_GETLBTEXTLEN | 得到编辑区域中文本的长度 |
| CB_LIMITTEXT | 发送限制编辑区域文本的消息 |
| CB_RESETCONTENT | 删除所有的项 |
| CB_SELECTSTRING | 选中指定的字符串 |
| CB_SETCURSEL | 将光标设置在指定的位置 |
| CB_SETDROPPEDWIDTH | 设置下拉的宽度 |
| CB_SETEDITSEL | 选取编辑区域的文本 |
| CBN_CLOSEUP | 关闭组合框 |
| CBN_DBLCLK | 发送用户双击组合框中项的消息 |
| CBN_DROPDOWN | 下拉时发送消息 |
| CBN_EDITCHANGE | 发送编辑区域改变的消息 |
| CBN_EDITUPDATE | 发送编辑区域改变的消息,但在更新之前发送 |
| CBN_ERRSPACE | 发送内存不够的消息 |
| CBN_KILLFOCUS | 当组合框失去输入焦点时发送该消息 |
| CBN_SETFOCUS | 设置输入焦点 |
【例10-5】列表框实现了当前工作目录的加载,同时双击组合组合框列表时,显示当前列表框中的内容。
//**************************************************************
// NAME : Demo_10
//**************************************************************
// POWER : Copyright (c) 2012 for lixinghua.
// AUTHOR : 2012-8-7 8:47 Create by lixinghua for functions.
// VERSION : V1.0.0.1
// NOTE : 手工整理的创建窗口的代码,本程序只创建一个名称为
// MyWin的窗口。
//**************************************************************
//
#include <windows.h>
#include <stdio.h>
// 宏定义,分别定义组合框的ID
#define ID_COMBOX_TEXT 0x01
// 回调函数,用于系统消息的处理。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hIns = NULL;
HWND g_hComBoxWnd = 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[] = { "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_hComBoxWnd = CreateWindow("ComboBox", NULL,
WS_CHILDWINDOW | WS_VISIBLE |
CBS_AUTOHSCROLL | CBS_SORT,
10, 10, 200, 300, hWnd, (HMENU)ID_COMBOX_TEXT,
g_hIns, NULL);
// 显示当前工作目录的所有文件
SendMessage(g_hComBoxWnd, CB_DIR, 0, (LPARAM)"*.*") ;
break;
// 菜单响应事件
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 双击事件处理
if(wmId == ID_COMBOX_TEXT && wmEvent == CBN_DBLCLK)
{
// 根据消息的发送,返回选择的位置
nSelPos = SendMessage(g_hComBoxWnd, CB_GETCURSEL, 0, 0);
// 获得列表框中的内容
nSelPos=SendMessage(g_hComBoxWnd,CB_GETLBTEXT,
nSelPos, (LPARAM) szContext);
MessageBox(hWnd, szContext, "提示", MB_OK);
}//end if
// 点击按钮时,捕获编辑框的内容,并显示。
switch (wParam)
{
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;
}
首先,定义了组合框的ID,并对组合框定义了句柄;其次,创建组合框并对组合框的内容进行初始化,初始化的内容为当前的工作目录;最后,通过组合框双击当前的位置,来获得相应的内容,从而实现双击事件。程序执行结果如图10.6所示。

- 图10.6 组合框控件演示结果
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。