中年人学C语言Windows程序设计,26控件ListBox

ListBox是Windows中的一种控件,一般被当做子窗口使用,Windows中所有子窗口都是通过发送一个通知码到父窗口父窗口通过WM_COMMAND消息接收,并在此消息中处理,并控制子窗口,ListBox自然也不例外,ListBox中有它独有的消息,通知消息,风格,查看MSDN可以看到风格主要有:

风格

有两种类型的列表框:单项选择(默认)和多选择。
在一个单项选择列表框,用户可以选择只一次一个项目。
在多选列表框,用户可以选择多个项目在同一时间。要创建一个多选列表框中,指定LBS_MULTIPLESEL或LBS_EXTENDEDSEL风格。

列表框的样式和风格,控制窗口的外观和一个列表框的操作。这些样式列表框项目说明是否进行排序,多列排列,绘制应用程序,等等。尺寸和一个列表框样式通常定义在一个对话框,在应用程序的资源包含的模板。

对于一个列表框的样式表,请参见

列表框样式:
【LBS_COMBOBOX】
通知列表框,它是一个组合框的一部分。
//看来还要回过头去学下组合框的内容

【LBS_DISABLENOSCROLL】
显示被禁用的垂直滚动列表框时,框不包含足够的项目滚动条。如果不指定这个样式,滚动栏隐藏时,列表框不包含足够的项目。

【LBS_EXTENDEDSEL】
允许选择多个项目使用SHIFT键和鼠标或特殊键组合。
//可以使用组合键来选择

【LBS_HASSTRINGS】
指定列表框包含项目字符串组成。列表框保持为字符串,以便应用程序可以使用LB_GETTEXT信息检索特定项目的文本存储和地址。默认情况下,除所有者描述的列表框的列表框有这种风格。您可以创建带或不带这种风格的所有者描述的列表框。
//有字符串显示

【LBS_MULTICOLUMN】
指定amulti columnn列表框水平滚动。该LB_SETCOLUMNWIDTH消息设置列的宽度。

//设置多列显示的样式

【LBS_MULTIPLESEL】
打开或关闭用户每次点击或双击列表中的一个选择框中的字符串的字符串。用户可以选择任何字符串的数量。
//设置可以选择多行的功能。

【LBS_NODATA】
指定无数据列表框。当指定此风格中的项目列表框数将超过一千。无数据列表框中还必须有LBS_OWNERDRAWFIXED风格,但绝不能有LBS_SORT或LBS_HASSTRINGS风格。
无数据列表框类似于一个所有者描述的列表框,除了它包含一个项目没有字符串或位图数据。命令添加,插入或删除一个项目总忽略任何指定的项目资料;要求找到一个在列表框中的字符串总是失败。该系统将发送WM_DRAWITEM消息给所有者窗口时,必须制定一个项目。在与WM_DRAWITEM消息通过DRAWITEMSTRUCT结构itemid的成员指定行号的项目要绘制。无数据列表框不寄WM_DELETEITEM消息。
//这么说,这个风格只是显示用的,就当作是PAINT函数中的画板,不保存任何数据。

【LBS_NOINTEGRALHEIGHT】
指定列表框的大小是完全由应用程序时创建的列表框中指定的大小。通常,系统尺寸的列表框,以便列表框不显示部分项目。
//使用默认的项目高度

【LBS_NOREDRAW】
指定列表框的外观没有更新更改。
要改变重绘控制状态,使用WM_SETREDRAW消息。
//可以在操作大量数据时,修改成这个风格,然后手动发消息更新界面。

【LBS_NOSEL】
指定列表框显示那些没有被被选中的项目。
//这个什么意思,

【LBS_NOTIFY】
通知与父窗口输入消息当用户点击或双击列表中的一个框中的字符串。
//这个一定要有,不然,处理不了单击双击事件了。

【LBS_OWNERDRAWFIXED】
指定该列表框的所有者负责绘制其内容负责,并在列表框中的项目是相同的高度。所有者窗口收到WM_MEASUREITEM消息,当列表框是一个创建和WM_DRAWITEM消息时,列表框的视觉方面发生了变化。
//自绘画风格,项目高度都是一样的。

【LBS_OWNERDRAWVARIABLE】
指定该列表框的所有者负责绘制其内容,并在列表框中的项目是在高度变数。所有者窗口收到一个组合中的每个方块项目WM_MEASUREITEM消息,当组合框创建和WM_DRAWITEM消息时,组合框的视觉方面发生了变化。
//完全自己画的风格???

【LBS_SORT】
在列表框中的字符串按字母顺序排序。

【LBS_STANDARD】
在列表框中的字符串按字母顺序排序。父窗口接收输入消息当用户点击或双击一个字符串。该列表框有各方的边界。
//标准样式

LBS_USETABSTOPS
启用一个列表框承认并扩大其在制定制表符的字符串。您可以使用LB_SETTABSTOPS消息指定制表位位置。默认的制表符位置是32对话框模板单位分开。对话框模板单位是独立于设备的对话框中使用的模板单位。转换到屏幕上对话框模板单位单位(像素)的测量,使用MapDialogRect功能。
//使用TAB键来定位

【LBS_WANTKEYBOARDINPUT】
指定该列表框的所有者获得WM_VKEYTOITEM消息当用户按下一个键,列表框具有输入焦点。这使应用程序能够在键盘上输入执行特殊处理。

//可以处理按键消息的风格

列表框的行为

一般父窗口通过向列表框发送消息来控制列表框的行为,而发送的消息一般有以下几种:
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 当某一项获得焦点时发送

发送消息到列表框

一个对话框程序可以将消息发送到一个列表框添加,删除,检查和更改列表框中的项目。
例如,一个对话框程序可以发送消息到一个LB_ADDSTRING列表框中添加一个项目,一个LB_GETSEL消息,以确定该项目是否被选中。其他消息设置和检索信息的大小,外观和列表框的行为。例如,LB_SETHORIZONTALEXTENT消息设置一个列表框滚动宽度。一个对话框程序可以发送任何信息到一个列表框使用SendMessage或SendDlgItemMessage功能

一个列表框项是经常引用其索引,一个整数,表示该项目在列表框的位置。作者在一个列表框中的第一项指数为0,第二项指标是1,依此类推。

以下消息处理由默认窗口进程处理为预定义列表框窗口类窗口程序执行的所有邮件的列表框不进程的默认处理。当列表框过程返回一个消息假,预定义的窗口过程检查邮件,并执行默认操作,如下表所示。

消息默认操作WM_CHAR消息移动到第一个项目,与用户键入的字符开始的选择。如果列表框具有LBS_OWNERDRAW风格,没有动作发生。在很短的时间间隔输入多个字符都被视为一组,第一个项目,有了一系列字符开始被选中。

WM_CREATE
创建一个空的列表框。

WM_DESTROY
销毁列表框和释放任何资源的用途。 传递到对话框的父窗口的程序或进程的信息。

WM_ENABLE
如果控制是可见的,无效的字符串,以便可以涂灰色的矩形。

WM_ERASEBKGND
消息擦除一个列表框的背景。如果列表框具有LBS_OWNERDRAW风格,背景也不会消失。

WM_GETDLGCODE
返回DLGC_WANTARROWS | DLGC_WANTCHARS,表示默认的过程处理列表框上的箭头键和WM_CHAR消息。

WM_GETFONT
返回的句柄为列表框中的当前字体。

WM_HSCROLL
滚动列表框水平。

WM_KEYDOWN
消息流程,滚动虚拟键。虚拟关键是这个项目的移动插入符号索引。选拔是没有改变。
WM_KILLFOCUS

打开关闭和破坏它插入符号。通知消息发送LBN_KILLFOCUS到列表框的所有者。
WM_LBUTTONDBLCLK

清单方块中的客户区鼠标。这使用户可以取消选择如果鼠标按钮是列表框外的客户区释放。

WM_LBUTTONDOWN

曲目清单方块中的客户区鼠标。这使用户可以取消选择如果鼠标按钮是列表框外的客户区释放。

WM_LBUTTONUP
曲目清单方块中的客户区鼠标。这使用户可以取消选择如果鼠标按钮是列表框外的客户区释放。

WM_MOUSEMOVE
消息曲目清单方块中的客户区鼠标。这使用户可以取消选择如果鼠标按钮是列表框外的客户区释放。
执行通过使用列表框的句柄设备上下文(DC)的子类的绘制操作。

WM_SETFOCUS 打开的插入符号并发送一个通知消息LBN_SETFOCUS到列表框的所有者。

WM_SETFONT 设置一个列表框的新字体。

WM_SETREDRAW 设置或清除重绘标志的基础上,wParam的值。
的WM_SIZE调整为列表框的项目的整数倍。

WM_VSCROLL 垂直滚动列表框。

程序实例

建立一个listbox,然后点击列表选择目标,弹出提示框显示选中项

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    static HWND hList;
    static HFONT hFont;
    static HWND hBtn;
    static HWND hStatic;
    static TCHAR szBuffer[128];
    
    static HWND    hListBox;
    static int     value;
    //int    i;
    int          iIndex, iLength;
     TCHAR * pVarName;

  
    switch (message) 
    {
    case  WM_CREATE:
        hListBox = CreateWindow(TEXT("LISTBOX"), TEXT("我是个BOX"),
             hListBox = CreateWindow(TEXT("LISTBOX"), TEXT("我是个BOX"),
            WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LBS_HASSTRINGS| LBS_NOTIFY,
           /* 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  列表框会拥有一个垂直滚动条 ,在列表框不能够显示所有项时显示。*/
            10, 10, 200, 150, 
            hWnd, (HMENU)30, 
            hInst, NULL);
        
        ShowWindow(hListBox,SW_SHOW);  
        SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("你好"));
        SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("我好"));
        SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("他好"));
        SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("都不好"));
        SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("狗好"));
        SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("猫好"));
        SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)TEXT("兔子好"));

    
    
        //创建逻辑字体
        hFont = CreateFont(
            -18/*高度*/, -9/*宽度*/, 0, 0, 400 /*一般这个值设为400*/,
            FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,
            DEFAULT_CHARSET,  //使用默认字符集
            OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,  //这行参数不用管
            DEFAULT_QUALITY,  //默认输出质量
            FF_DONTCARE,  //不指定字体族*/
            TEXT("微软雅黑")  //字体名
        );
       
        SendMessage(hListBox, WM_SETFONT, (WPARAM)hFont, 0);//设置字体
        
        break;
    case WM_COMMAND:
        //if (LOWORD(wParam) == 30 && HIWORD(wParam) == LBN_SELCHANGE)
        //{
        //    // Get current selection.
        //    iIndex = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
        //    iLength = SendMessage(hListBox, LB_GETTEXTLEN, iIndex, 0) + 1;
        //    pVarName = calloc(iLength, sizeof(TCHAR));
        //    SendMessage(hListBox, LB_GETTEXT, iIndex, (LPARAM)pVarName);
        //    MessageBox(hWnd, pVarName, TEXT("提示信息"), MB_ICONINFORMATION);
        //    free(pVarName);

        //}
        wmId = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        switch (wmId) {
      
        case 30:
            if (wmEvent == LBN_SELCHANGE)
            {

                // Get current selection.
                iIndex = SendMessage(hListBox, LB_GETCURSEL, 0, 0);
                iLength = SendMessage(hListBox, LB_GETTEXTLEN, iIndex, 0) + 1;
                pVarName = calloc(iLength, sizeof(TCHAR));
                //memset(pVarName, 0, sizeof(pVarName));
                SendMessage(hListBox, LB_GETTEXT, iIndex, (LPARAM)pVarName);
                MessageBox(hWnd, pVarName, TEXT("提示信息"), MB_ICONINFORMATION);
                free(pVarName);
            }
            break;
        default:
            //不处理的消息一定要交给 DefWindowProc 处理。
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
       
       
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO:  在此添加任意绘图代码...
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        //请做好善后工作
        DeleteObject(hFont);
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

在这里插入图片描述
点击对应项,弹出提示框
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页
评论

打赏作者

卖身买镜头

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值