原文来自http://users.ugent.be/~skdmeule/Programming/ProgrammingQuestions.html
动态创建一个组合框
向需要使用组合框的类中添加成员CComboBox* m_pComboBox,比如对话框或属性页。在需要时创建它,比如在对话框的OnInitDialog() 函数中,或属性页的OnSetActive()函数中。当不再需要它的时候就销毁掉,如在对话框的PostNcDestroy() 函数或属性页的OnKillActive() 函数中。
示例如下:
声明:
CComboBox* m_pComboBox;
创建组合框:
m_pComboBox = new CComboBox();
m_pComboBox->Create( WS_VISIBLE | WS_CHILD | WS_BORDER
| WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT,
CRect(20,20,100,40), this, ID_SOME_ID );
销毁:
m_pComboBox->DestroyWindow();
delete m_pComboBox;
添加消息函数到这些动态创建的组合框中
现在我们已经动态创建组合框了,接下来就要为其添加一些功能。 下面的例子演示了如何重写CBN_SETFOCUS 消息函数。把下面这段代码加入到对话框的头文件中的消息映射中:
//{{AFX_MSG(C***Dialog)
...
afx_msg void OnSetfocusCombo();
...
//}}AFX_MSG
在实现文件里的消息映射中添加如下代码:
//{{AFX_MSG(C***Dialog)
...
ON_CBN_SETFOCUS(ID_SOME_ID,OnSetfocusCombo)
...
//}}AFX_MSG
添加函数体:
void C***Dialog::OnSetfocusCombo()
{
// 功能代码
}
动态设置组合框的字体
之前创建的组合框的字体都是标准的粗体,下面的例子将把他设置为其他类型的,去掉其粗体的属性。因此,在此添加一个CFont成员m_newFont到对话框所属的容器中。你需要先创建字体并在不需要字体时删除对象内存。
添加字体:
CFont m_newFont;
创建字体:
LOGFONT LogFont;
GetFont()->GetLogFont(&LogFont);
LogFont.lfWeight = 400;
m_newFont.CreateFontIndirect(&LogFont);
m_pComboBox->SetFont(&m_newFont);
删除字体:
m_newFont.DeleteObject();
更改样式
设置组合框是否排序,需要重新创建来使其达到效果。在重建后要重新获取所有的列表项,列表项的数据,当前选中的项,输入的文本等。
设置为只读模式
常规的办法是通过Class Wizard 添加一个CComboBox类的成员m_ctrlComboBox,然后使用下面的代码:
((CEdit*)m_ctrlComboBox.GetWindow(GW_CHILD))->SetReadOnly(TRUE);
不使用界面创建:
((CEdit*)((CComboBox*)GetDlgItem(IDC_COMBO))->GetWindow(GW_CHILD))->SetReadOnly(TRUE);
设置只读模式组合框的颜色
为了美观,你不希望只读模式的组合框是灰色的。下面的例子演示如何给对话框的组合框设置颜色。通常的方法是添加要让组合框颜色不再是灰色就要重写对话框的 WM_CTLCOLOR并在OnCtlColor重实现:
HBRUSH CDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//编辑框部分为 灰色
if ( pWnd->m_hWnd == m_ctrlComboBox.GetWindow(GW_CHILD)->m_hWnd )
{
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkColor(RGB(255,255,255));
hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
}
//静态文本部分为灰色
if ( pWnd->m_hWnd == m_ctrlComboBox.m_hWnd )
{
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkColor(RGB(255,255,255));
hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
}
return hbr;
}
不用Class Wizard添加控件:
HBRUSH CDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// 编辑框部分是灰色的
if ( pWnd->m_hWnd == ((CComboBox*)GetDlgItem(IDC_COMBO))->GetWindow(GW_CHILD)->m_hWnd )
{
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkColor(RGB(255,255,255));
hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
}
// 静态文本部分是灰色的
if ( pWnd->m_hWnd == ((CComboBox*)GetDlgItem(IDC_COMBO))->m_hWnd )
{
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkColor(RGB(255,255,255));
hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
}
return hbr;
}
放大下拉列表
有时,放大下拉列表的尺寸是必要的,尤其是组合框是动态创建的且下拉列表中没有对象。常规方法使用Class Wizard添加一个CComboBox的变量m_ctrlComboBox,通过下面的代码放大之后,你的组合框估计可以放下4个项了。
CRect rect; m_ctrlComboBox.GetClientRect(&rect);
m_ctrlComboBox.SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height() * 5, SWP_NOMOVE);
使用代码实现:
CRect rect; ((CComboBox*)GetDlgItem(IDC_COMBO))->GetClientRect(&rect);
((CComboBox*)GetDlgItem(IDC_COMBO))->SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height() * 5, SWP_NOMOVE);
译者小结
关于MFC中动态创建控件的基本步骤
声明控件的变量
在需要的时候调用Create函数
在不需要的时候消耗delete即可
适当的时候可以通过成员函数实现一些功能
消息机制根据其支持的消息类型添加响应函数
组合框的使用,布布扣,bubuko.com
组合框的使用
原文:http://blog.csdn.net/giantchen547792075/article/details/21809201