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