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");

 

posted @ 2017-09-03 21:51  gd_沐辰  阅读(283)  评论(0编辑  收藏  举报