ComboBox自由切换属性DropDown和DropList

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

在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时,可以对编辑框进行操作;当取消勾选时,则不可以对编辑框进行操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值