10.5 组合框控件

组合框(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 组合框控件演示结果
转载请附上原文出处链接及本声明
李老师的博客 » 10.5 组合框控件

发表评论

提供最优质的文章集合

立即查看 了解详情