Windows SDK学习笔记----Combo Box 用法大全(Backer原创)

             Combo Box是windows里的常用控件,一些书本和资料里的中文名称为组合框控件,但是为了避免混淆,就用英文名吧

          平时都是看别人写的blog,昨晚一夜未眠,早上跑完步回家心血来潮就上CSDN学别人写下文章,就当做是个人的学习笔记吧!望大家海涵 下面我我们就开始学习之旅吧!废话不多说,我的语言功底也很烂,多说说不出什么好话。

 

 

         感觉网上一些文章写得比较乱,下面我将combobox一些常用的用法集成一下,如果有错误之类的请大家指出来,我会在第一时间进行改进,谢谢大家!!

Combo Box控件在MSDN中给出了三种风格讲解,请参考如下:

Combo box type Style constant Description
Simple CBS_SIMPLE Displays the list at all times, and shows the selected item in an edit control.
Drop-down CBS_DROPDOWN Displays the list when the icon is clicked, and shows the selected item in an edit control.
Drop-down list (drop list) CBS_DROPDOWNLIST Displays the list when the icon is clicked, and shows the selected item in a static control.

出处 :  http://msdn.microsoft.com/en-us/library/bb775791(v=VS.85).aspx

          在windows当中很多功能都是可以通过SendMessage来完成,该函数功能强大,大家一定要用好(我也一定要用好),函数原型如下:

LRESULT WINAPI SendMessage(
  __in  HWND hWnd,
  __in  UINT Msg,
  __in  WPARAM wParam,
  __in  LPARAM lParam
);

那么这个函数和Combo Box有什么关系呢?当然有关系啦!因为很多有关于Combobox的函数都是可以或者准确来说是用SendMessage来实现的,当然前面我说得Combobox的函数是不准确的,应该是宏吧,但是当它是函数也没关系。但是我介意在学习或者编程是尽量有SendMessage,因为该函数不仅可以对Combobox进行操作,同时也能对其他控件进行操作,用好这个相当于用好里其他控件,一通百通,原理都一样的,而且重要的是不用去记那些大量的宏,这些宏是微软为了方便编程变成才定义的,而本质上是调用SendMessage的,用好这个API有助于理解windows的消息机制。

下面我就将一些关于Combobox控件通过SendMessage的方式的一些实现写下来方便大家参考,同时我也会给出相应的宏给大家,遇到一些比较难理解的我会给出说

明,当然我也有一些不理解的也会向大家提问,大家相互学习:

 

一 . CB_ADDSTRING

SendMessage(hwnd_cbb,CB_ADDSTRING,0,(LPARAM)szBuff)   

ComboBox_AddString(hwnd_cbb, szBuff)

如果combobox的风格没有CBS_SORT的话,上面两个函数的功能是按顺序在combobox的尾巴添加选项,

如:

for(int i = 3 ; i >= 0 ; i --)

{

        wsprintf(szBuff,"%d",i);

        ComboBox_AddString(hwnd_cbb, szBuff);
}

执行完后所得的顺序为 3    2    1   0 ;

如果定义的风格有CBS_SORT的话则为:0   1   2   3

PS:对于初学SDK的朋友 , CBS_SORT是在CreateWindows中定义的风格

 

二.CB_INSERTSTRING

SendMessage(hwnd_cbb , CB_INSERTSTRING ,index , (LPARAM)szBuff)

ComboBox_InsertString(hwnd_cbb,index,szBuff)

插入选项,插入的方式和C++的STL中的insert一样 比如有选项 0 1 2 3

当index = 0 szBuff = “x”时  ------->    0 x 1 2 3

当index = 3 szBuff = “x”时  ------->    0 1 2 x 3

如果index = -1 的话所插入的选项都是在尾部插入

 

三.CB_FINDSTRING

int idx = SendMessage(hwnd_cbb,CB_FINDSTRING,indexstart,szBuff)

int idx = ComboBox_FindString(hwnd_cbb,indexstart ,szBuff

功能是从indexstar开始查找combobox中匹配szBuff的字符串,记住不包括indexstar,

如果从indexstar到尾部没有合适的字符串将会从下标 0 开始查找,

查找原则是只要匹配完szBuff便结束,返回对应下标,比如:

combobox中有:"insert"   "insert1"  "yes"

 szBuff = “insert”

 int idx =   SendMessage(hwnd_cbb,CB_FINDSTRING,indexstar,(LPARAM)szBuff);

如果indexstar = 0   则idx 为  1 ;

如果indexstar =1   则idx 为  0 ;

如果查找没有相匹配的则返回CB_ERR

 这里有一个查找完全匹配准确字符串的宏即ComboBox_FindStringExact , 对应的消息为CB_FINDSTRINGEXACT,功能与上述的有点差别就是szBuff必须与

combobox选项里的某一项完全相同才回返回正确的下标,否则返回CB_ERR ,相当于if(strcmp(sz1,sz2)&& (strlen(sz1)== strlen(sz2)),不好意

思不知道这样表述清楚不,呵呵!

 

四.CB_SELECTSTRING

int idx = SendMessage(hwnd_cbb,CB_SELETSTRING,indexstart,szBuff)

int idx = ComboBox_SelectString (hwnd_cbb,indexstart ,szBuff)

用法与功能和上面的相同,只是它同时会将当前得选项设置为idx ; 如果找不到则返回CB_ERR,当前选项不会发生改变

 

五.CB_GETCURSEL

int idx = SendMessage(hwnd_cbb,CB_GETCURSEL,0,0)

int idx = ComboBox_GetCurSel (hwnd_cbbf)

这个功能我想不用我解释了吧,SendMessage中的  wPara 和  lParam 没有用到 被设置为0,

如果当前没有任何选项被选,即combobox为空时返回CB_ERR

 

六. CB_DELETESTRING

int idx = SendMessage(hwnd_cbb,CB_DELETESTRING ,index ,0)

int ComboBox_DeleteString(hwnd_cbb,index)

执行删除下标为index选项功能,删除成功返回剩余的总数 , 如果index不存在则返回CB_ERR

(PS:个人困惑,MSDN里面有下面的描述我不大清楚,希望有大牛能帮我解释下

Remarks

If you create the combo box with an owner-drawn style but without the CBS_HASSTRINGS style, the system sends a WM_DELETEITEM message to the owner of the combo box so the application can free any additional data associated with the item. )

 

七.CB_GETCOUNT

int   count   =  SendMessage(hwnd_cbb , CB_GETCOUNT , 0 ,0)

int    count     =     ComboBox_GetCount (hwnd_cbb

这个不解释,看名字还不懂的话我无话可说

 

 八.CB_GETDROPPEDCONTROLRECT

RECT  rect;

SendMessage(hwnd_cbb,CB_GETDROPPEDCONTROLRECT ,0,(LPARAM)rect)

ComboBox_GetDroppedControlRect (hwnd_cbb , &rect)

 获取combobox的客户区, 是相当整个屏幕的哦

 

 

 

九.CB_SHOWDROPDOWN

SendMessage(hwnd_cbb, CB_SHOWDROPDOWN  ,flag,0);

ComboBox_ShowDropdown(hwnd_cbb,flag)

当flag == true 时  combobox会展开,否则就隐藏 ,函数总是返回 true

 

十.CB_GETDROPPEDSTATE

bool flag   =  SendMessage(hwnd_cbb , CB_GETDROPPEDSTATE  , 0 ,0)

bool   flag   =   ComboBox_GetDroppedState (hwnd_cbb

返回显示当前的状态,true为展开,false为闭合

 

联合【九】与【十】可以编写测试代码,当按键盘时展开与闭合,代码如下:

    case WM_KEYDOWN:
    {

        if (SendMessage(hwnd_cbb,CB_GETDROPPEDSTATE ,0,0))
         {SendMessage(hwnd_cbb, CB_SHOWDROPDOWN  ,0,0);
           SetDlgItemText(hwnd,ID_BNT_FUCK,"hide");
         }
        else

        {

            SendMessage(hwnd_cbb, CB_SHOWDROPDOWN  ,1,0);
            SetDlgItemText(hwnd,ID_BNT_FUCK,"show");
                    }
    }
     break;

好了,写了那么多暂时这样吧!有时间在修改下,欢迎大家批评与指正,我会在第一时间回复大家,好累啊,去睡觉了,一夜都没睡好,语言表达不是很好对不起

你可能感兴趣的:(编程,windows,list,application,insert,winapi)