14combo box组合框
组合框 Combo Box
注意:组合框本质也是窗口。
组合框,我也经常遇到,比如在填写资料,选择性别(男、女),或多个账号登陆等情形。如下图:
本例介绍三种组合框的形式:
第一种CBS_SIMPLE:
没有下拉按钮,直接显示部分选项,并且可以在“选项 0”处输入其他内容。
第二种CBS_DROPDOWN:
有下拉按钮,要点击下拉箭头才显示选项,并且可以在“选项 0”处输入其他内容。
第三种CBS_DROPDOWNLIST:
列表组合框,有下拉按钮,要点击下拉箭头才显示选项,但是不可以在“选项 0”处输入其他内容。
CBS_SIMPLE---CBS--- COMBO STYLE
步骤:
1.创建组合框
hCombo[0]=CreateWindowEx(0,"combobox","0",WS_CHILD|WS_VISIBLE|CBS_SIMPLE,4,4,150,250,hWnd,NULL,hInst,0);
第二参数为"combobox",如前面的按钮、编辑框等控件一样,都是内部已定义。
第四参数可以设置不同的组合框。详情看上面。。。
2.修改菜单,并修改对应的ID
3.捕捉菜单消息。进行消息处理。
(1)添加选项
sprintf_s(str,"选项 %d",i);
//向组合框中添加内容CB_ADDSTRING
SendMessage(hCombo[j],CB_ADDSTRING,0,(LPARAM)str);
//第三个参数wParam=0,是将位置0处设定为初始位置,也可以为其他位置。
SendMessage(hCombo[j],CB_SETCURSEL,0,0);
(2)删除选项
nRel=SendMessage(hCombo[i],CB_GETCURSEL,0,0);
SendMessage(hCombo[i],CB_DELETESTRING,nRel,0);
首先,要获取当前选中的那个选项位置,nRel,通过CB_GETCURSEL来获取。
然后,通过CB_DELETESTRING,并将位置nRel传入。进行删除
(3)查询选项
A.泛型查询
SendMessage(hCombo[0],CB_FINDSTRING,-1,(LPARAM)"选项");
CB_FINDSTRING 代表不精确查询,只要遍历过程中出现“选项”二字,就立即返回。
比如“选项 0不是你要的”。。。。“选项 19是你要的”。 “选项 0不是你要的”遍历到“选项”就返回。
第三参数为-1,代表从头遍历
若返回 -1 ,则不存在。
B.精确查询
dwReturn=SendMessage(hCombo[0],CB_FINDSTRINGEXACT,-1,(LPARAM)"选项 8");
CB_FINDSTRINGEXACT 代表精确查询。遍历过程中,必须遍历内容与"选项 8”一模一样,才返回。否则继续遍历。
第三参数为-1,代表从头遍历
若返回 -1 ,则不存在。
(4)清空选项
SendMessage(hCombo[i],CB_RESETCONTENT,0,0);
CB_RESETCONTENT 代表将当前的组合框的选项内容全部清空。
(5)载入文件目录
SendMessage(hCombo[0],CB_DIR,DDL_ARCHIVE,(LPARAM)"D:*.*"); SendMessage(hCombo[1],CB_DIR,DDL_DIRECTORY|DDL_EXCLUSIVE,(LPARAM)"D:*.*");
第二参数 代表要选中载入文件目录。
第三参数 对载入的目录进行筛选。
第四参数 是要载入目录的绝对路径。
注意:*.* 是必须存在。不可以只放绝对路径。如” D:\VS2010\Program Files”, *.*也代表着载入的格式。
如下图显示:
源代码: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; const int nComboNum=3; static HWND hCombo[nComboNum]; char str[MAX_PATH]; static int nRel=0; static DWORD dwReturn=0; switch (message) { case WM_CREATE: hCombo[0]=CreateWindowEx(0,"combobox","0",WS_CHILD|WS_VISIBLE|CBS_SIMPLE,4,4,150,250,hWnd,NULL,hInst,0); hCombo[1]=CreateWindowEx(0,"combobox","0",WS_CHILD|WS_VISIBLE|CBS_DROPDOWN,155,4,150,250,hWnd,NULL,hInst,0); hCombo[2]=CreateWindowEx(0,"combobox","0",WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST,305,4,150,250,hWnd,NULL,hInst,0); break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ADD: for(int j=0;j<nComboNum;++j) { for(int i=0;i<100;++i) { sprintf_s(str,"选项 %d",i); SendMessage(hCombo[j],CB_ADDSTRING,0,(LPARAM)str); //将第一位置为初始位置 SendMessage(hCombo[j],CB_SETCURSEL,0,0); } } break; case IDM_DEL: for(int i=0;i<nComboNum;++i) { nRel=SendMessage(hCombo[i],CB_GETCURSEL,0,0); SendMessage(hCombo[i],CB_DELETESTRING,nRel,0); } break; case IDM_SEL: dwReturn=CB_ERR; //泛型查找 dwReturn=SendMessage(hCombo[0],CB_FINDSTRING,-1,(LPARAM)"选项"); sprintf_s(str,"所在位置:%d",dwReturn); MessageBox(hWnd,str,"查找位置",MB_OK); //精确查找 dwReturn=SendMessage(hCombo[0],CB_FINDSTRINGEXACT,-1,(LPARAM)"选项 8");