专栏首页MasiMaro 的技术博文windows编程学习笔记(三)ListBox的使用方法

windows编程学习笔记(三)ListBox的使用方法

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);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • windbg蓝屏调试

    一般在写Windows内核程序的时候,经常会出现蓝屏的问题,这个时候一般是采用记录下dump文件然后用windbg查看得方式,具体的过程就不说了,网上一大堆的内...

    Masimaro
  • windows 多任务与进程

    多任务的本质就是并行计算,它能够利用至少2处理器相互协调,同时计算同一个任务的不同部分,从而提高求解速度,或者求解单机无法求解的大规模问题。以前的分布式计算正是...

    Masimaro
  • 自己写的驱动用CreateFile打开时错误码返回1的问题

    就像题目上说的,今天在写一个例子代码时遇到了这个问题,下面是当时驱动层和应用层的代码:

    Masimaro
  • 20180803_ARTS_week06

    这个是个比较不好的解法,就是像题目介绍里面那样先把这个『之』字形给做出来,然后再逐行读成字符串,但是通过这个比较好帮助我们理解这个题目。

    Bob.Chen
  • python如何对类进行测试

    下面介绍针对类的测试,很多程序中都会用到类,因此能够证明你的类能够正确地工作会大有裨益。如果针对类的测试通过了,你就能确信对类所做的改进没有意外地破坏其原有的行...

    于小勇
  • Cobalt Strike|配置转发器

    Hello,大家好哇,我们上一节讲了Cobalt Strike Beacon的一些基础知识,但是好像喜欢看的小伙伴不是很多呀,是不是太枯燥呢?但是我觉得我们在渗...

    用户7021283
  • 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(一)

      我:嗨,老板娘,有冰红茶没   老板娘:有   我:多少钱一瓶   老板娘:3块   我:给我来一瓶,给,3块   老板娘:来,你的冰红茶   我:玩呐,我...

  • 科学计算库Numpy——数值计算

    py3study
  • 老友记即将回归!数据告诉你:这十季里到底说了多少次Oh my God?

    基于老友记剧本,然我们对总共232集电视剧进行搜索,来确定剧中每位人物说“Oh my God”的频率。

    CDA数据分析师
  • 微信Android热补丁实践演进之路

    继插件化后,热补丁技术在2015年开始爆发,目前已经是非常热门的Android开发技术。其中比较著名的有淘宝的Dexposed、支付宝的AndFix以及Qzon...

    微信终端开发团队

扫码关注云+社区

领取腾讯云代金券