10.4 列表框控件

特殊说明:版权归个人所有,请勿转载,谢谢合作。

列表框控件主要用于输入、它允许从列表项中进行单项或多项选择,选择的对象可以是文本、文件、位图等。被选择的列表项呈高亮状态。

 

// 创建列表框
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 列表框控件演示结果

 

转载请附上原文出处链接及本声明
李老师的博客 » 10.4 列表框控件

发表评论

提供最优质的文章集合

立即查看 了解详情