请问:
    如何让Edit控件不能输入同时不改变它的背景色?
    我已经在网上搜索到一些资料,响应WM_CTLCOLOR,并且写代码:
    HBRUSH CInputEdit::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CEdit::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:  在此更改 DC 的任何属性
   if   (pWnd->GetDlgCtrlID()==IDC_Edit)   
   {   
       pDC->SetBkMode(TRANSPARENT);   
       pDC->SetBkColor(RGB(255,255,255));   
       static   CBrush   m_brushEdit(RGB(255,255,255));   
       hbr   =   m_brushEdit;   
   }      
// TODO:  如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
但是,只要Edit控件的属性设为ReadOnly,这些设置无效,总是灰色。
另外,我尝试过响应=WM_CTLCOLOR消息,写函数:
HBRUSH CInputEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO:  在此更改 DC 的任何属性
HBRUSH hbr;
CBrush Brush;
if(nCtlColor==CTLCOLOR_EDIT)
{   
Brush.CreateSolidBrush(RGB(255,255,255));
pDC->SetTextColor(RGB(0,0,0));
pDC->SetBkColor(RGB(255,255,255));
hbr=(HBRUSH)(Brush.GetSafeHandle());
return hbr;
}
// TODO:  如果不应调用父级的处理程序,则返回非空画笔
return NULL;
}
同样都不行。
请问,应该怎么做?
我是不是缺少了一些步骤?

解决方案 »

  1.   

    在构造函数里:
        m_clrBkgnd = 某些颜色;
        m_brBkgnd.CreateSolidBrush( m_clrBkgnd );
        m_clrText = 某些颜色;
        m_clrBkgnd = 某些颜色;    m_clrDisableText = 某些颜色;
        m_clrDisableBkgnd = 某些颜色;
    HBRUSH CustEdit::CtlColor( CDC* pDC, UINT /*nCtlColor*/ )
    {
    if ( this->IsWindowEnabled() )
    {
    // Text
    pDC->SetTextColor( m_clrText );
    // Text bkgnd
    pDC->SetBkColor( m_clrBkgnd );
    }
    else
    {
    // Text
    pDC->SetTextColor( m_clrDisableText );
    // Text bkgnd
    pDC->SetBkColor( m_clrDisableBkgnd );
    }
    return m_brBkgnd;                // Control bkgnd}
      

  2.   

    set edit control 'read-ony' cause it to be a static text, cannot do it.1)subclasswindow2)process WM_CHAR in dialog wndproc->override PreTranslateMessage()
      

  3.   

    ->override PreTranslateMessage()// make all edit box input read-only
    BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)
    {
        switch(pMsg->message)
        {
        // donot translate WM_CHAR 
        case WM_CHAR:
            return TRUE;
        }    return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    设置 edit 的字符长度为 0
      

  5.   

    搞定了,原來要同时响应WM_ERASEBKGND消息和WM_CTLCOLOR消息,而且Edit的父窗口都要响应WM_CTLCOLOR消息,这样就可以了。