zoukankan      html  css  js  c++  java
  • Win32 SDK:ListBox 为什么不整个 LB_SETTEXT

    Win32 & SDK: ListBox 有个 LB_GETTEXT,为什么没有 LB_SETTEXT,想修改指定Item的Text,还真不容易。

    自已写了一个,支持单选和多选模式,部分代码:

    void updateListBoxItem(HWND hwnd_listbox, const int index, const char *text)
    {
        BOOL indexIsSelected = FALSE; //当前的 index 是否被选中
    
        int focusedIndex = SendMessage(hwnd_listbox, LB_GETCARETINDEX, 0, 0); // 返回在多选状态下,具有焦点的条目的索引。该条目既可以被选中,也可以是没被选中。
        //printf("focusedIndex:%d
    ", focusedIndex);
    
        int selectedCount = SendMessage(hwnd_listbox, LB_GETSELCOUNT, 0, 0);
        if(selectedCount == LB_ERR) //单选列表框
        {
            int selectedIndex = SendMessage(hwnd_listbox, LB_GETCURSEL, 0, 0);
    
            if(selectedIndex == index)
            {
                indexIsSelected = TRUE;
            }
        }
        else
        {
            int selectedIndexs[selectedCount];
            SendMessage(hwnd_listbox, LB_GETSELITEMS, (WPARAM)selectedCount, (LPARAM)selectedIndexs); //选回值是选中的数量
    
            int i;
            for(i = 0; i < selectedCount; i++)
            {
                //printf("index:%d
    ", selectedIndexs[i]);
    
                if(selectedIndexs[i] == index)
                {
                    indexIsSelected = TRUE;
                    break;
                }
            }
        }
    
        insertListBoxItem(hwnd_listbox, index, text); //插入
        removeListBoxItem(hwnd_listbox, index + 1); //删除
    
        if(indexIsSelected)
        {
            setListBoxSelectedIndex(hwnd_listbox, index); //设置选中
        }
    
        //设置焦点index
        if(focusedIndex > -1)
        {
            SendMessage(hwnd_listbox, LB_SETCARETINDEX, focusedIndex,  MAKELONG(TRUE, 0));
        }
    }
    

      

    下面是ListBox部分操作指南,来源于互联网:

    //获取列表框中的字符串的数目

     //返回值:列表框中的字符串的数目

     //----------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_GETCOUNT, 0, 0);

    //----------------------------------------------------------------

     //获取列表框的可水平滚动宽度(以像素pixel为单位)

    //返回值:列表框的水平滚动宽度

    //----------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_GETHORIZONTALEXTENT,0, 0);

    //----------------------------------------------------------------

    //设置列表框的可水平滚动宽度(以像素pixel为单位)

     //cxExtent:水平滚动宽度!

     //返回值:无

     //----------------------------------------------------------------

    int cxExtent

    SendMessage(listbox1.hWnd, LB_SETHORIZONTALEXTENT, cxExtent, 0);

     //----------------------------------------------------------------

    //取得列表框中第一个(顶部)可见项的索引(以0为基数)

    //在开始时,项0在列表框顶部,但如果列表框可滚动,则会有另一项滚功到顶部

    //返回值:成功,返回列表框中第一个(顶部)可见项的索引.失败,返回LB_ERR.

     //----------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_GETTOPINDEX, 0, 0);

     //----------------------------------------------------------------

    //设置列表框中第一个(顶部)可见项的索引(以0为基数)

    //控件保证这个项可见,系统滚动列表框,直到它出现在顶部或最大移动范围

     //返回值:成功,返回0.失败,返回LB_ERR.

     //----------------------------------------------------------------

    int nIndex

     SendMessage(listbox1.hWnd, LB_SETTOPINDEX, nIndex, 0);

     //----------------------------------------------------------------

     //获取列表框中的列表串的locale标识符(LCID)

     //locale用于确定有序列表框中列表串的排列顺序

    //返回值:列表框中的列表串的locale标识符(LCID)

    //----------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_GETLOCALE, 0, 0);

     //----------------------------------------------------------------

     //设置列表框中的locale标识符(LCID)

    //locale标识符用于确定有序列表框中列表串的排列顺序

     //nNewLocale:新的locale标识符(LCID)

    //返回值:列表框中原本的locale标识符(LCID)

    //----------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_SETLOCALE, (WPARAM)nNewLocale, 0);

    //---------------------------------------------------------------

    //为列表框的项和字符串预先分配内存,在要增加大量的列表项之前调用

    //nItems:要增加的项数

     //nBytes:为项的字符串分配的内存的字节大小

    //返回值:成功,在分配之前可储存的最大项数 ( int )

    //---------------------------------------------------------------

    int nItems, UINT nBytes

    SendMessage(listbox1.hWnd, LB_INITSTORAGE, (WPARAM)nItems, nBytes);

    //---------------------------------------------------------------

    //确定与pt指定的点最近的列表框项!此函数可用于确定光标所在的的项

     //pt:一个POINT结构,相对去列表框客户区的左上角.

     //bOutside:如果pt在客户区外,则为TRUE,如果pt在客户区内,则为FALSE.

    //返回值:与pt点最近的项索引.

    //---------------------------------------------------------------

     SendMessage(listbox1.hWnd, LB_ITEMFROMPOINT, 0, MAKELPARAM(pt.x, pt.y));

    //---------------------------------------------------------------

    //获取列表框的选择项的索引

    //如果无当前选择项或列表框是多选框时,否则返回LB_ERR.

    //返回值:选择项的索引. (int)

     //---------------------------------------------------------------

    SendMessage(m_hWnd, LB_GETCURSEL, 0, 0);

     //---------------------------------------------------------------

     //设置列表框的当前选择项

    //只能对单选列表框调用此函数,否则返回LB_ERR.

    //nSelect:项索引(以0为基数),若为-1,则设列表框为无选则壮态

    //返回值:成功,原本的选择项索引.若失败,则返回LB_ERR. (int)

    //---------------------------------------------------------------

    int nSelect

    SendMessage(listbox1.hWnd, LB_SETCURSEL, nSelect, 0);

    //---------------------------------------------------------------

    //获取列表框中某项的选择状态,可用于单选列表框或多选列表框.

     //nIndex:项的索引(以0为基数)

     //返回值:若指定的项被选择,则返回正数,否则返回0.出错,返回LB_ERR.

    //---------------------------------------------------------------

     int nIndex

     SendMessage(listbox1.hWnd, LB_GETSEL, nIndex, 0);

    //---------------------------------------------------------------

     //选择多项列表框中的某一项,只适用于多选列表框

    //nIndex:要选则的索引号(以0为基数),如果为-1,将所有项选择或删除.

    //取却于bSelect.

    //bSelect:指定如何选择.

    //bSelect为TRUE,项被选择并高亮显示.(默认值)

     //bSelect为FALSE,项不被选择,去掉高亮显示.

     //返回值:如果出错,则返回LB_ERR.

     //---------------------------------------------------------------

     int nIndex, BOOL bSelect

    SendMessage(listbox1.hWnd, LB_SETSEL, bSelect, nIndex);

     //---------------------------------------------------------------

    //获取多选列表框中的选择项总数!

    //返回值:多选列表框中的选择项总数,如果为单选列表框,则返回LB_ERR!

    //---------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_GETSELCOUNT, 0, 0);

    //---------------------------------------------------------------

    //将多项选择框中选择项的索引序列填充缓冲区

     //nMaxItems:要放入缓冲区列表索引的最大总数!

    //rgIndex:指向缓冲区!

    //返回值:返回放入缓和区中的项索引总数!

     //---------------------------------------------------------------

     int nMaxItems, LPINT rgIndex

    SendMessage(listbox1.hWnd, LB_GETSELITEMS, nMaxItems, (LPARAM)rgIndex);

    //---------------------------------------------------------------

    //在多选列表框中设置锚点来连续选择项.

    //锚点是连续选择项中的第一项或最后一项!

    //nIndex:锚点,项索引.(以0为基数)

    //返回值:无!

     //---------------------------------------------------------------

     int nIndex

     SendMessage(listbox1.hWnd, LB_SETANCHORINDEX, nIndex, 0);

    //---------------------------------------------------------------

    //获取多选列表框中的锚点索引.(以0为基数!)

    //锚点是连续选择项中的第一项或最后一项!

     //返回值:成功,当前锚点索引.失败,LB_ERR.

     //---------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_GETANCHORINDEX, 0, 0);

    //---------------------------------------------------------------

    //获取指定项的DWORD值数据.(一个自已放入的DWORD值数据)

     //nIndex:项索引.(以0为基数)

    //返回值:成功,指定项的DWORD值数据.失败,返回LB_ERR.

     //---------------------------------------------------------------

     int nIndex

    SendMessage(listbox1.hWnd, LB_GETITEMDATA, nIndex, 0);

     //---------------------------------------------------------------

     //设置指定项的DWORD值数据.(自已保存起DWORD值数据)

     //nIndex:项索引.(以0为基数)

    //dwItemData:DWORD值数据

     //返回值:失败,返回LB_ERR.

     //---------------------------------------------------------------

     int nIndex, DWORD dwItemData

     SendMessage(listbox1.hWnd, LB_SETITEMDATA, nIndex, (LPARAM)dwItemData);

    //---------------------------------------------------------------

    //获取指定项的指向数据的指针.(指针指向某一数据)

    //nIndex:项索引.(以0为基数)

     //返回值:成功,指向某一数据的指针.失败,返回-1.

     //---------------------------------------------------------------

     int nIndex

     SendMessage(Listbox1.hWnd, LB_GETITEMDATA, nIndex, 0);

    //---------------------------------------------------------------

     //获取列表框中的某一项的矩型区域!

    //nIndex:项索引(以0为基数)

     //lpRect:用于保存项的矩型区域!

    //返回值:如果出错,返回LB_ERR.

    //---------------------------------------------------------------

     int nIndex, LPRECT lpRect

    SendMessage(Listbox1.hWnd, LB_GETITEMRECT, nIndex, (LPARAM)lpRect);

    //---------------------------------------------------------------

    //获取指定项的字符串!

    //nIndex:项的索引.

     //lpszBuffer:指向缓冲区,用于接收字符串!

    //返回值:字符串的长度,不包括空终止符,如果nIndex无效,则返回LB_ERR.

    //---------------------------------------------------------------

    int nIndex, LPTSTR lpszBuffer

     SendMessage(Listbox1.hWnd, LB_GETTEXT, nIndex, (LPARAM)lpszBuffer);

    //---------------------------------------------------------------

    //取得列表框中某一项的字符串长度!

     //nIndex:字符串长度!

     //返回值:字符串的长度,不包括空终止符,如果nIndex无效,则返回LB_ERR.

     //---------------------------------------------------------------

    int nIndex

    SendMessage(Listbox1.hWnd, LB_GETTEXTLEN, nIndex, 0);

    //---------------------------------------------------------------

     //设置多列"列表框"的中所有的列的宽度.(像素为单位)

    //多列"列表框"具有LBS_MULTICOLUMN风格!

    //cxWidth:列的宽度.(像素为单位)

    //返回值:无!

    //---------------------------------------------------------------

    int cxWidth

    SendMessage(Listbox1.hWnd, LB_SETCOLUMNWIDTH, cxWidth, 0);

     //---------------------------------------------------------------

    //设置列表框Tab的停止位!

    //nTabStops:Tab的停止位的个数!

    //rgTabStops:指向Tab的停止位的数组!

    //返回值:成功,返回TRUE,失败,返回FALSE.

    //---------------------------------------------------------------

    int nTabStops, LPINT rgTabStops

     SendMessage(listbox1.hWnd, LB_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);

     //---------------------------------------------------------------

    //设置列表框Tab的停止位!(默认两个单位)

    //返回值:成功,返回TRUE,失败,返回FALSE.

    //---------------------------------------------------------------

    SendMessage(Listbox1.hWnd, LB_SETTABSTOPS, 0, 0);

     //---------------------------------------------------------------

    //设置列表框Tab的停止位!

     //cxEachStop:每隔cxEachStop个对话单位设置一个Tab的停止位!

     //返回值:成功,返回TRUE,失败,返回FALSE.

     //---------------------------------------------------------------

    int& cxEachStop

     SendMessage(Listbox1.hWnd, LB_SETTABSTOPS, 1, (LPARAM)(LPINT) &cxEachStop);

    //---------------------------------------------------------------

     //设置项的高度!

    //如果列表框具有LBS_OWNERDRAWVARIABLE风格.则设置指定索引的高度!

    //否则,设置所有项的高度!

    //返回值:如果索引或高度无效,用像素表示! (int)

    //---------------------------------------------------------------

    int nIndex, UINT cyItemHeight

    SendMessage(listbox1.hWnd, LB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0));

     //---------------------------------------------------------------

     //获取项的高度!

    //如果列表框具有LBS_OWNERDRAWVARIABLE风格.则返回指定索引的高度!

    //nIndex:指定项的索引.(以0为基数).

    //只适用于具有LBS_OWNERDRAWVARIABLE风格地对话框.否认,应设为0.

    //返回值:项的高度!

    //---------------------------------------------------------------

    nt nIndex

    SendMessage(listbox1.hWnd, LB_GETITEMHEIGHT, nIndex, 0L);

     //---------------------------------------------------------------

    //查找指定字符串的索引.

     //nIndexStart:从那一项开始查找的上一项索引.设为-1,则从头查找!

    //如果列表框具有LBS_HASSTRINGS风格,则匹配lpszFind的DWORD值

     //lpszFind:要查找的字符串!

    //返回值:成功,项的索引.失败,返回LB_ERR. (int)

    //---------------------------------------------------------------

    int nIndexStart, LPCTSTR lpszFind

    SendMessage(listbox1.hWnd, LB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind);

     //---------------------------------------------------------------

     //确定多选框中具有焦点的项索引.项可以是已选择的或未选择的!

     //返回值:具有焦点的项索引.如果是单选框,是选择项的索引.(以0为基数) (int)::

    //---------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_GETCARETINDEX, 0, 0L);

    //---------------------------------------------------------------

    //设置多选框中具有焦点.如过项不可见的,则滚动进入视图!

    //nIndex:项的索引.

     //bScroll:如果值为FALSE,项滚动到完全可见.

    //若为FALSE,则至于滚动到部分可见.

    //返回值:具有焦点的项索引.如果是单选框,是选择项的索引.(以0为基数) (int)::

    //---------------------------------------------------------------

     int nIndex, BOOL bScroll

    SendMessage(listbox1.hWnd, LB_SETCARETINDEX, nIndex, MAKELONG(bScroll, 0);

    //---------------------------------------------------------------

    //添加一个字符串(即增加一个新项)

    //若列表框具有LBS_SORT风格,则调用COMPAREITME函数进行排序.

    //若列表框具有LBS_HASSTRINGS风格,则加入到表尾.

    //lpszItem:指向字符串.

    //返回值:项的索引(以0为基数).

     //出错返回LB_ERR.没有足够内存,返回LB_ERRSPACE. (int)::

     //---------------------------------------------------------------

    LPCTSTR lpszItem

    SendMessage(listbox1.hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem);

     //---------------------------------------------------------------

    //从列表框中删除指定的项

    //nIndex:项的索引(以0为基数).

     //返回值:留在列表框中项的总数.

    //如果nIndex比总数大时,则返回LB_ERR. (int)

    //---------------------------------------------------------------

    UINT nIndex

    SendMessage(listbox1.hWnd, LB_DELETESTRING, nIndex, 0);

     //---------------------------------------------------------------

    //将字符串插入到指定的项中.(即增加一个新项)

    //nIndex:项的索引(以0为基数).

     //lpszItem:指向字符串.

    //返回值:插入位置的索引(以0为基数).

     //出错返回LB_ERR.没有足够内存,返回LB_ERRSPACE. (int)::

    //---------------------------------------------------------------

    int nIndex, LPCTSTR lpszItem

    SendMessage(m_hWnd, LB_INSERTSTRING, nIndex, (LPARAM)lpszItem);

     //---------------------------------------------------------------

     //删除列表框中的所有项

    //返回值:无!

    //---------------------------------------------------------------

    SendMessage(listbox1.hWnd, LB_RESETCONTENT, 0, 0);

     //---------------------------------------------------------------

    //添加文件名列表或驱动器列表到列表框中.

    //attr:参数!

    //0x0000:可读取或写入的文件

     //0x0001:可读取但不可写入的文件

    //0x0002:忍藏文件,不在列表框中出现.

     //0x0004:系统文件.

     //0x0010:由lpszWildCard指定明称,指定一个目录.

     //0x0020:以归档的文件

     //0x4000:包含所有和lpszWildCard匹配的名字驱动器.

     //0x8000:排除标志.若设置了.则只列出指定的类型文件.

     //lpszWildCard:文件名

    //返回值:添加列表框中最后一项的索引号

    //出错返回LB_ERR.没有足够内存,返回LB_ERRSPACE. (int)::

    //---------------------------------------------------------------

     UINT attr, LPCTSTR lpszWildCard

    SendMessage(listbox1.hWnd, LB_DIR, attr, (LPARAM)lpszWildCard);

     //---------------------------------------------------------------

     //查找列表框中包含指定前睿的第一个字符串,而不该列表框的选择项.

     //nStartAfter:从nStartAfter索引的前一项开始查找.

    //lpszItem:要查找的字符串.(大小写敏感)

     //返回值:成功,项的索引.失败,返回LB_ERR (int)::

    //---------------------------------------------------------------

    int nStartAfter, LPCTSTR lpszItem

    SendMessage(listbox1.hWnd, LB_FINDSTRING, nStartAfter, (LPARAM)lpszItem);

     //---------------------------------------------------------------

    //查找列表框,匹配指定的字符串.若查找成功,则选择该项.

    //如果需要,滚动列表框进入视图.

     //不能用去具有LBS_MULTIPESEL风格的列表框.

     //返回值:成功,所选项项的索引.失败,返回LB_ERR,选项项不变. (int)::

     //---------------------------------------------------------------

    int nStartAfter, LPCTSTR lpszItem

    SendMessage(listbox1.hWnd, LB_SELECTSTRING,nStartAfter, (LPARAM)lpszItem);

     //---------------------------------------------------------------

    //在多选列表框中选择多个连续的项.(只能多选列表框中)

     //bSelect:选择设置.

     //若bSelect为TRUE,则字符串被选择并高亮显示.

     //nFirstItem:第一的索引(基于0)

    //nLastItem:最后一项的索引(基于0)

    //失败,返回LB_ERR.

     //---------------------------------------------------------------

    BOOL bSelect, int nFirstItem, int nLastItem

    SendMessage(listbox1.hWnd, LB_SELITEMRANGEEX, nFirstItem, nLastItem) :

    SendMessage(listbox1.hWnd, LB_SELITEMRANGEEX, nLastItem, nFirstItem);

    //----------------------------------------------------------------

  • 相关阅读:
    Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
    SVN使用教程总结
    实践SQLServer Tuning
    SQL性能优化:如何定位网络性能问题
    windows7下修改hosts文件无效解决办法
    jQuery Event.stopPropagation() 函数详解
    引用js或css后加?v= 版本号的用法
    JS实现点击跳转登陆邮箱
    DWZ (JUI) 教程 navTab 刷新分析
    CPU与内存的关系
  • 原文地址:https://www.cnblogs.com/personnel/p/7071527.html
Copyright © 2011-2022 走看看