在ComboBox属性为DropDown情况下,自由切换控件可编辑和不可编辑功能。
原理如下:重写CComboBox,然后新增不可编辑功能即可。方法如下:
1.新增类,CMyComboBox,选择继承自CComboBox;
2.在CMyComboBox.cpp,重载ON_WM_CTLCOLOR;
3.在CMyComboBox.h中,增加变量CEdit m_edit ; bool bDropDown;
4.在重载的OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 添加代码
HBRUSH CMyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if (true==bDropDown)//当需要对编辑框操作是,将其至为true
{
if (m_edit.GetSafeHwnd() == NULL)
m_edit.SubclassWindow(pWnd->GetSafeHwnd());
if (nCtlColor == CTLCOLOR_STATIC)
{
m_edit.SetReadOnly(FALSE);
}
return hbr;
}
else if (nCtlColor == CTLCOLOR_EDIT)
{
if (m_edit.GetSafeHwnd() == NULL)
m_edit.SubclassWindow(pWnd->GetSafeHwnd());
m_edit.SetReadOnly();
}
else if (nCtlColor == CTLCOLOR_STATIC)
{
CBrush m_brush;
m_brush.CreateSolidBrush(RGB(0,255,255));
pDC->SetBkColor(RGB(255,255,255));
return (HBRUSH)m_brush.GetSafeHandle();
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
5.使用demo
1)新建MFC对话框工程CMyDemo
2)添加ComboBox控件,并增加成员变量m_MyCom
3)在CMyDemoDlg.h中增加 #include "CMyComboBox.h"
4)将成员变量m_MyCom前的ComboBox更改为CMyComboBox
5)增加Check box控件IDC_CHECK1
6)双击Check box控件,为其增加响应函数
if (((CButton *)GetDlgItem(IDC_CHECK1))->GetCheck()==1)
{
m_MyCom.bDropDown=true;
}
else
{
m_MyCom.bDropDown=false;
}
7)当勾选Check box时,可以对编辑框进行操作;当取消勾选时,则不可以对编辑框进行操作。

本文介绍在MFC框架下,如何通过重写CComboBox类实现ComboBox在DropDown模式下的编辑功能自由切换。通过新增CMyComboBox类并重载ON_WM_CTLCOLOR,结合Checkbox控件,实现在运行时动态改变ComboBox的可编辑状态。
753

被折叠的 条评论
为什么被折叠?



