2009-02-18 169 views
2

我需要在运行时在CBS_DROPDOWN和CBS_DROPDOWNLIST样式之间切换。看起来唯一的方法是重新创建控件。动态创建/销毁CComboBox

所以我有以下代码:

CRect rect; 
m_Combo.GetWindowRect(&rect); 
m_Combo.DestroyWindow(); 
m_Combo.Create(CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE, rect, this, IDC_MYCOMBO); 

但所发生的一切是组合中消失。我错过了什么?

编辑:

使用ModifyStyle是不是一种选择,因为这种风格不能在运行时改变。该控件必须重新创建。

编辑2:

好了,所以我就在屏幕坐标,而不是对话坐标。

CRect rect; 
m_Combo.GetWindowRect(&rect); 
ScreenToClient(&rect); // SUPER IMPORTANT :) 
m_Combo.DestroyWindow(); 
m_Combo.Create(CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE, rect, this, IDC_MYCOMBO); 

但现在,位置是正确的,但字体与对话框字体不匹配。

回答

3

将控件字体设置为对话框字体不就足够了吗?也就是说,在重新创建后立即控制

m_Combo.SetFont(GetFont());