而且你看我2楼的图中,那个“青莲 马年快乐”的选项,共有四个,前三个在一块,最后一个和它们是分离的,这也就说明,这个组合框没有sort属性。要是有的话就会排在一起了。我现在怀疑组合框是不是本身就是这个特性,不允许有名字相同的选项?如果有,在打开下拉列表时,就会显示选中的是第一个?

解决方案 »

  1.   

    代码很复杂,无法上全。只上一句。就是比马我选择2楼图中的最后一个“青莲 马年快乐”。再在HIWORD(wParam) == CBN_DROPDOWN消息处理中用如下的语句获取当前项目的序号:int index = SendDlgItemMessage(hDlg, IDC_COMBO1, CB_GETCURSEL, 0, 0);调试发现index值为11,也就是说:在下拉列表以后,虽然显示被选中的是第一个“青莲 马年快乐”,但是用消息获取当前选项序号,却显示是最后一个。好奇怪的毛病,难道组合框就是这个特点吗?就是选项不能同名?
      

  2.   

    “代码很复杂,无法上全。”做个 简单的 针对问题的 combo 看看。
      

  3.   

    请问:组合框是不是本身就具有这样的特点:就是两选项名字相同时,你不管选择哪个,最后打开下拉列表时,显示的都是第一个?如果组合框没有这个特点,那就很奇怪,你看我2楼的图片,组合框中第5,6,7,11都是“青莲 马年快乐”。但是即使我选择了第11个。再次打开下拉列表,被高亮显示的仍然是第5个,不过如果用SendDlgItemMessage(hDlg, IDC_COMBO1, CB_GETCURSEL, 0, 0);获取当前选项的序号,却是正确的值(11)。也就是说,除了显示被选中的选项不正确以外,其他好象都是正确的。
      

  4.   

    好的,我现在认为:组合框的各个选项名字不能相同,相同时,不管选择哪个,最后打开下拉列表,显示被选中的都是第一个。这大概是组合框的一个BUG.没办法,只有修改我的程序了,让各个选项不同名,如果出现同名(皮肤同名也是很常见的),只能在后面添加“(1)“了。
      

  5.   

    我想应该是这样:组合框的这种选择方式感觉就是从下拉列表的第一项开始顺序查找,遇到相同的字符串程序就认为找到了,就把光标停靠在了该项,毕竟程序不是那么很智能。你可以使用 SetCurSel();这个函数看看能不能设置成你需要的
      

  6.   

    “这大概是组合框的一个BUG”
    不要 着急 下 结论。
      

  7.   


    我也觉得是这样:就是组合框在打开下拉列表时,是用编辑框里面的字符串,然后查看,找到第一个,就认为是它了。但这在有同名选项时会出现问题。你说的SetCurSel()好象是MFC里的类成员函数。我用的是sdk方式,好象用不了。我也觉得郁闷,其实组合框中有两种设置当前选项的方式,一种是发送CB_SELECTSTRING消息,这个消息把当前选项设置成某个字符串,要是这个消息出现上述问题,还情有可原。但是还有一个消息,叫CB_SETCURSEL,这个消息是把当前选项设置成某个索引值,这样就算有同名选项,也不应该错。事实上,也没有错,我用CB_GETCURSEL消息获取当前选项的索引值,发现已经设置正确了,就是打开下拉列表时,显示的不正确而已。不知是怎么回事?如果真的组合框在打开下拉列表时,只是根据编辑框里的字符串来找到第一个,就当它是选中的,这个也太了,不科学,会给同名选项带来麻烦。
      

  8.   

    把你实验的代码发上来 case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case IDC_COMBO5:
    if(HIWORD(wParam) == CBN_SELENDOK)//选择了"纵向扩展方式"
    {
    int index = SendDlgItemMessage(hDlg, IDC_COMBO5, CB_GETCURSEL, 0, 0);
    pLay->VerExpandMode = index;
    InvalidateRect(GetDlgItem(hDlg, IDC_BUTTON8), NULL, FALSE);
    UpdateWindow(GetDlgItem(hDlg, IDC_BUTTON8));
    }
    return TRUE;
    }
    case WM_INITDIALOG:
    SendDlgItemMessage(hDlg, IDC_COMBO5, CB_ADDSTRING, 0, (LPARAM)"拉伸");
    SendDlgItemMessage(hDlg, IDC_COMBO5, CB_ADDSTRING, 0, (LPARAM)"平铺");
    SendDlgItemMessage(hDlg, IDC_COMBO5, CB_ADDSTRING, 0, (LPARAM)"固定");
    SendDlgItemMessage(hDlg, IDC_COMBO5, CB_ADDSTRING, 0, (LPARAM)"固定");代码我只选取一部分,还是在我的程序里选的。就是在对话框的初始化部分,加入四个选项“拉伸”,“平铺”,“固定”,“固定”。
    然后就是在选择了一个新选项的时候,修改系统某数据,并刷新一个自绘按钮( IDC_BUTTON8)。结果不管选择哪个“固定”,然后打开下拉列表,发现被选中的都是第一个“固定”。
      

  9.   

    我试了试 好像 ““是组合框的一个BUG””
      

  10.   

    我试了一下, 似乎确实是这样的, 
    从功能上讲, 我不知道LZ为何要实现这种功能? 一般选择后显示在选框中的内容就足够了, 如果是一样的文本, 用户也无法知道选择哪个.
    如果非要有这个现象, 我能想到的只有重绘ComboBox了.
      

  11.   

    我这个是一个输入法的皮肤设置对话框。导入的每个皮肤都有名字。按理说每个皮肤的名字应该不一样,否则用户无法分辩。但是,我希望这样:用户可以先导入皮肤A,然后再次导入A,然后把第二次导入的A进行修改,最后改名保存。这就必然允许同样的皮肤(当然名字也相同)可以重复导入。也就是存在相同的名字,然后再由用户修改。不过既然组合框不允许这样。那我的程序只能修改了。就象搜狗皮肤那样,你如果第二次导入同样的皮肤,会覆盖前一个同名皮肤,而并不是建立一个新的同名皮肤,也许这样更科学?我也这样,如果导入的皮肤与已经皮肤重名,要么不允许导入,要么覆盖之。如果需要由已有皮肤来修改生成新的皮肤,那就是选将其改名。这又涉及到组合框选项的修改问题,当然这个问题比较简单,就是删除旧选项,在原来位置插入新选项,就行了。谢谢!