ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,ListBox自然也不例外,ListBox中有它独有的消息,通知消息,风格,查看MSDN可以看到风格主要有:
  • LBS_EXTENDEDSEL  用户可以通过SHIFT + 鼠标或者其他组合键进行多选(只能通过SHIFT + 鼠标或者其他组合键)
  • LBS_HASSTRINGS   指定一个自绘的列表框中包含有字符串项,这些字符串的指针由应用程序管理,我们可以利用GetText函数得到相应的字符串
  • LBS_MULTICOLUMN   列表框可以有多列,默认情况是只有一列即一行只有一个字符串,我们可以使用 SetColumnWidth设置列宽
  • LBS_MULTIPLESEL   用户可以同时选择多项(用户单击一项时这项被选中,单击另一项时,这两项都被选中,选择多项时只需要点击不同的项,不需要用组合键的方式,同一项第一次单击时选中,第二次单击时取消选中)
  • LBS_NOINTEGRALHEIGHT   列表框的大小由系统在创建这个列表框的时候决定。一般不会只显示部分列表项
  • LBS_NOREDRAW   列表框的大小在显示后不会改变,但是可以通过发 WM_SETREDRAW消息来取消这一风格
  • LBS_NOTIFY   当用户单击或双击时会发送一条消息到父窗口,风格,父窗口将接收不到用户选择的项
  • LBS_OWNERDRAWFIXED   父窗口负责绘制列表框,这个时候列表框中的项的大小都一样
  • LBS_OWNERDRAWVARIABLE   列表项的大小可以不一样
  • LBS_SORT   字符串会以首字母排序
  • LBS_STANDARD  系统会将字符串排序,同时父窗口会收到用户单机或者双击鼠标的消息
  • LBS_USETABSTOPS   允许用户使用TAB键在各项中切换
  • LBS_WANTKEYBOARDINPUT   当列表框通过键盘获得焦点时会向父窗口发送 WM_VKEYTOITEM 或 WM_CHARTOITEM 消息,以便程序处理特殊的键盘消息
  • LBS_DISABLENOSCROLL  列表框会拥有一个垂直滚动条 ,在列表框不能够显示所有项时显示。
一般父窗口通过向列表框发送消息来控制列表框的行为,而发送的消息一般有以下几种:
LB_ADDFILE 添加文件
LB_ADDSTRING 添加字符串
LB_DELETESTRING 删除字符串
LB_DIR 添加文件名列表
LB_FINDSTRING 返回列表框中的一个字符的索引
LB_FINDSTRINGEXACT 在列表框查找第一个与特定字符匹配的字符并返回它的索引
LB_GETANCHORINDEX 获取锚点的索引,锚点就是在多选模式下选中的第一项
LB_GETCARETINDEX 在多选模式下返回具有焦点条目的索引
LB_GETCOUNT 获取列表框中子项的总数
LB_GETCURSEL 获取被选中的子项的索引,只在单选模式下有效
LB_GETHORIZONTALEXTENT 获取水平滚动条的宽度
LB_GETITEMDATA 获取与指定列表项相关的程序的自定义值(长度为32位)
LB_GETITEMHEIGHT 获取列表项的高
LB_GETITEMRECT 获取列表项边界矩形的大小
LB_GETLOCALE 获得当前列表的区域,可以通过该区域决定正确的排序规则或者显示排序后的文本
LB_GETSEL 获得列表项的选择状态,被选中时大于0,未被选中时为0,发生错误时小于0
LB_GETSELCOUNT 在多选模式下获取当前被选中的项总数
LB_GETSELITEMS  在多选模式下,获取选项的值,需要提供一个相应的数组的首地址用来保存返回结果
LB_GETTEXT  获取指定项的字符串
LB_GETTEXTLEN 获得指定项字符串的长度
LB_GETTOPINDEX 获取列表框中显示的第一列的索引,当使用滚动条使显示内容发生变化时,这个索引也会发生改变
LB_INITSTORAGE 需要加入大量列表项时使用
LB_INSERTSTRING 添加列表项,但是与LB_ADDSTRING不同的是,加入后新字符串不参加排序
LB_RESETCONTENT 清除所有列表项
LB_SELECTSTRING  从指定位置向后查找我们指定的字符串项,找到后将该项设置为选中状态
LB_SELITEMRANGE  在多选模式下,将某一区域内一个或多个项设置为选中状态
LB_SETCARETINDEX 在多选模式下,设置给定索引值的矩形设置为焦点矩形,如果该值没有显示,那么滚动条将会自动滚动到相应行
LB_SETCOLUMNWIDTH 在多列模式下设置所有项的的列宽,使用这个消息必须保证列表框有LBS_MULTICOLUMN风给
LB_SETCOUNT 设置列表项的总数,用于具有LBS_NODATA风给但是不具有LBS_HASSTRINGS风格的列表框
LB_SETCURSEL 设置某项处于被选中状态,并将该项加亮显示
LB_SETHORIZONTALEXTENT 设置水平滚动条的宽度,当列表框的宽度不足以显示所有项的时候,滚动条出现,否则隐藏
LB_SETITEMDATA 设置特定项的值
LB_SETITEMHEIGHT 设置列表项的宽。
LB_SETLOCALE 设置列表框的当前区域
LB_SETSEL 在多选模式下选中某一字符串
LB_SETTABSTOPS 设置TAB键停止的位置
LB_SETTOPINDEX 设置列表框中的某一项处于可见位置

列表框向其父窗口发送的通知码为:
LBN_DBLCLK 当某一项被单击时发送
LBN_ERRSPACE 当系统不能分配足够的内存来进项相应的处理时发送该通知码
LBN_KILLFOCUS 当列表框中某一项失去焦点时发送
LBN_SELCANCEL当用户取消选择时发送
LBN_SELCHANGE 当用户选择改变时发送
LBN_SETFOCUS 当某一项获得焦点时发送
下面是一个小例子:(在窗口程序中创建列表框,框中选择人物姓名,可以得到人物的相应信息)
利用到的结构体的定义如下:
struct PERSON
{
const char *pszName;
int nAge;
const char *pszPhoneNum;
};

首先在WM_CREATE中创建:
HWND hList = CreateWindow("LISTBOX", "", WS_CHILD | WS_BORDER | WS_VISIBLE | LBS_HASSTRINGS | LBS_NOTIFY |  LBS_NOINTEGRALHEIGHT
, 0,0,200,800,hWnd, (HMENU)123, g_hInst, NULL); for(int i = 0; i < 3; i++)
{
SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)(g_Person[i].pszName));
} SendMessage(hList, LB_SETCURSEL, (WPARAM)0, 0);
}

关于列表框的显示与行为控制都在WM_COMMAND中处理:

	if (123 == LOWORD(wParam))
{
if (LBN_DBLCLK == HIWORD(wParam))
{
int nIndex = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);
sprintf(szBuf, "姓名:%s 年龄:%d 电话:%s", g_Person[nIndex].pszName, g_Person[nIndex].nAge,
g_Person[nIndex].pszPhoneNum);
InvalidateRect(hWnd, NULL, TRUE);
}
}

当点击某一项后需要在窗口中显示,显示的工作可以在WM_PAINT中完成

PAINTSTRUCT ps;
RECT rtClient;
GetClientRect(hWnd, &rtClient);
HDC hDc = BeginPaint(hWnd, &ps);
DrawText(hDc, szBuf, strlen(szBuf), &rtClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
EndPaint(hWnd, &ps);



windows编程学习笔记(三)ListBox的使用方法的更多相关文章

  1. python网络编程学习笔记(三):socket网络服务器(转载)

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较. 步骤 TCP客户端 TCP服务器 第一步 建立socket对象  建立socket对 ...

  2. 【Linux_Shell 脚本编程学习笔记三、分支与循环结构】

    if 语句是实际生产工作中最重要且最常用的语句,所以,必须掌握牢固 if 条件语法 1. 单分支机构 if  [ 条件 ] then 指令 fi 或 if  [  条件 ]; then 指令 fi   ...

  3. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  4. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  5. kvm虚拟化学习笔记(三)之windows kvm虚拟机安装

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  6. 多线程编程学习笔记——使用异步IO(一)

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  7. 【Visual C++】游戏编程学习笔记之七:键盘输入消息

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  8. 多线程编程学习笔记——使用异步IO

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  9. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

随机推荐

  1. GIT如何从本地上传代码到github

    转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46738929 本文出自:[海龙的博客] 开篇之前说下题外话,之前写过一 ...

  2. Postgres中的物化节点之sort节点

    顾名思义,物化节点是一类可缓存元组的节点.在执行过程中,很多扩展的物理操作符需要首先获取所有的元组后才能进行操作(例如聚集函数操作.没有索引辅助的排序等),这时要用物化节点将元组缓存起来.下面列出了P ...

  3. JavaScript中函数function fun(){}和 var fun=function(){}的区别

    function fun(){} 和 var fun=function(){}的区别 标题有点长···· 废话少说,其实他们的主要区别就是"函数声明的提前行为". var fun= ...

  4. 字符串输入时的strlen()与\0

    在做串的数据结构时,被字符串printf %s输出时的结尾判断.strlen();长度.自定义StrCopy();字符串复制函数.StrAssign();字符串赋值函数卡了一下,固写此博巩固相关知识点 ...

  5. Swift3.0 自定义tableView复用cell 的写法,与CollectionViewCell的不同,数据model

    Model数据 class HospitalModel: NSObject { //后边不赋值 会报错 var imgurl :String = "" var introducti ...

  6. Python学习日记:day8-------文件操作

    文件操作 1,文件路径:d:\xxxx.txt     绝对路径:从根目录到最后     相对路径:当前目录下的文件 2,编码方式:utf-8 3,操作方式:只读,只写,追加,读写,写读...... ...

  7. ABP 找不到版本为 (>= 1.0.0-preview1-27891) 的包 Microsoft.AspNetCore.SignalR 错误

    错误描述: 下载ABP模板项目3.4.1的版本(当前最新版本),编译加载nuget包Microsoft.AspNetCore.SignalR时会报如下错误: 严重性     代码         说明 ...

  8. 【Zookeeper】源码分析之服务器(一)

    一.前言 前面已经介绍了Zookeeper中Leader选举的具体流程,接着来学习Zookeeper中的各种服务器. 二.总体框架图 对于服务器,其框架图如下图所示 说明: ZooKeeperServ ...

  9. C#设计模式之二十二备忘录模式(Memeto Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就 ...

  10. js变量提升与函数提升

    在es6之前,js语言并没有块级作用域,即{}形成的作用域,只有全局作用域和函数作用域,所谓的提升,即是将该变量的声明或者函数的声明提升,举个例子 console.log(global); //und ...