单击下拉菜单时,MFC组合框控件未显示完整的项目列表

时间:2010-03-25 05:27:08

标签: visual-c++ visual-studio-2008 drop-down-menu combobox mfc

我在MSVS 2008中编写了一个应用程序,它有一个ComboBox控件,我通过以下代码进行初始化:

static char*                    OptionString[4] = {"Opt1",
                                                   "Opt2",
                                                   "Opt3",
                                                   "Opt4"};


BOOL CMyAppDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon

    // TODO: Add extra initialization here

    m_Option.AddString(OptionString[0]);
    m_Option.AddString(OptionString[1]);
    m_Option.AddString(OptionString[2]);
    m_Option.AddString(OptionString[3]);
    m_Option.SetCurSel(0);

    return TRUE;  // return TRUE  unless you set the focus to a control
}

在上面的代码中,m_Option是ComboBox控件的Control变量。

现在,当我构建应用程序并单击向下箭头时,下拉框仅显示第一个选项(因为我通过我的代码选择了该选项)。但是,如果我按下键盘上的向下箭头键,它会按照我插入的顺序循环选项,但从不在框中显示超过1个选项。因此,如果用户想要选择option3,他必须循环选项1和2 !!虽然一旦我使用键盘选择任何选项,相应的事件处理程序就会被触发,我对这种行为感到恼火,这是可以理解的。

我也列出了组合框控件的属性 - 只有属性为true(rest设置为false):

  1. 类型 - 下拉列表
  2. 垂直滚动条
  3. Visible Tabstop
  4. 这已经困扰了我好几周了。任何人都可以开导我吗?

5 个答案:

答案 0 :(得分:24)

在对话框布局设计器中,在设计对话框时,单击组合框上的“向下箭头”。然后,您可以向下拖动组合框轮廓的底部以增加其高度。

答案 1 :(得分:9)

您需要增加设计器中组合框下拉列表的高度。

默认情况下,通过设计器可以调整ComboBox宽度。如果要调整下拉列表高度的大小,则需要单击右侧的下拉箭头,然后您将能够调整已删除的控件高度。这似乎很容易,但如果没有人告诉你这不是直觉。

希望你理解我的观点。

答案 2 :(得分:2)

另一种设置组合框下拉高度的方法是手动编辑rc文件。 您可以设置第5个参数,该参数负责下拉的高度(本例中为72)。

COMBOBOX   IDC_COMBOBOX1,17,35,157,72,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP

答案 3 :(得分:1)

我们可以以编程方式修改下拉高度为:

CRect rctCmbCountry, rctDropDownCountry;
m_Cmb_Country.GetClientRect(&rctCmbCountry); 
m_Cmb_Country.GetDroppedControlRect(&rctDropDownCountry); 
itemHeight = m_Cmb_UI_Country.GetItemHeight(-1); 
m_Cmb_UI_Country.GetParent()->ScreenToClient(&rctDropDownCountry); 
rctDropDownCountry.bottom = rctDropDownCountry.top + rctCmbCountry.Height() + itemHeight * iNoOfITemToShowInComboDropDown; 
m_Cmb_UI_Country.MoveWindow(&rctDropDownCountry);

参考:http://codetechnic.blogspot.com/2012/04/vc-mfc-how-to-set-combobox-dropdown.html#:~:text=1)%20Designer%20%2D%20through%20the%20designer,你%20it's%20anything%20but%20intuitive。

答案 4 :(得分:0)

我也遇到了这个问题,最后我找到了MFC应用程序的解决方案。问题是我没有将清单版本6应用于我的应用程序。为了解决这个问题,我添加了代码来标记清单如下:

ifdef _UNICODE
if defined _M_IX86
pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
elif defined _M_X64
pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
else
pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
endif
endif

效果很好。 您可以参考[此处]链接(http://msdn.microsoft.com/en-us/library/windows/desktop/bb773175%28v=vs.85%29.aspx)了解更多详情。 希望它有所帮助。