本帖最后由 ppkele 于 2011-09-15 15:29:08 编辑

解决方案 »

  1.   

    怎么控制这个白色背景:OnCtlColor如果想显示这个按钮,光靠控制背景还不够,建议重载CEdit,在画背景的时候,去掉按钮的位置。
      

  2.   

    你好,我是重载了CEdit类,具体的能给点代码吗?
      

  3.   

    现在越来越喜欢重载了。想怎么样就怎么样。下面的就是重载  CEdit 做的。
      

  4.   

    之前写过ListBox的,编辑框右边有按钮,参照这个改下下吧。。
    void CEditBtnList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX); if(lpDrawItemStruct->itemID >= m_vStrList.size() )
    return; CString strItem = m_vStrList[lpDrawItemStruct->itemID]; RECT rcItem = lpDrawItemStruct->rcItem;
    CRect rcEdit(rcItem), rcBtn(rcItem);
    rcEdit.right -= 32;
    rcBtn.left = rcBtn.right-30; m_BtnRect = rcBtn;

    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC); // 选中后绘制按钮及边框
    if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
    (lpDrawItemStruct->itemState & ODS_SELECTED))
    {
    if( m_iPreSel == lpDrawItemStruct->itemID )
    {
    CBrush br(RGB(0, 0, 0));
    dc.FrameRect(&rcEdit, &br); DrawButton(&dc, rcBtn);
    dc.DrawText( strItem, strItem.GetLength(), &rcEdit, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
    }
    else
    {
    dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
    dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
    dc.FillSolidRect(&lpDrawItemStruct->rcItem, ::GetSysColor(COLOR_HIGHLIGHT)); dc.DrawText( strItem, strItem.GetLength(), &lpDrawItemStruct->rcItem, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
    }
    }
    else
    {
    dc.FillSolidRect(&lpDrawItemStruct->rcItem, dc.GetBkColor());
    dc.DrawText( strItem, strItem.GetLength(), &lpDrawItemStruct->rcItem, DT_LEFT|DT_SINGLELINE|DT_VCENTER);
    } dc.Detach();
    }void CEditBtnList::DrawButton(CDC* pDC, const CRect& rect)
    {
    // 绘制外边框
    DrawBorder(pDC, rect); // 绘制按钮的底色
    DrawBottomColor(pDC, rect);  // 绘制内边框
      DrawInsideBorder(pDC, rect);
     
        // 绘制文字
       if( !m_strBtnText.IsEmpty() )
       DrawButtonText(pDC, rect);
    }// 根据状态绘制按钮底色
    void CEditBtnList::DrawBottomColor(CDC* pDC, const CRect& rect)
    {
    CBrush ActiveBrush, InactiveBrush;
    ActiveBrush.CreateSolidBrush(RGB(240, 240, 235));
    InactiveBrush.CreateSolidBrush(RGB(222, 223, 236)); CRect rc(rect);
    rc.DeflateRect(3, 3); if( m_bMouseInButton )
    {
    pDC->FillRect(&rc, &ActiveBrush);
    }
    else
    {
    pDC->FillRect(&rc, &InactiveBrush);
    }

    ActiveBrush.DeleteObject();
    InactiveBrush.DeleteObject();
    }// 绘制按钮的内边框
    void CEditBtnList::DrawInsideBorder(CDC *pDC, const CRect& rect)
    {
    CPen LeftPenDefault, RightPenDefault, TopPenDefault, BottomPenDefault;
    CPen LeftPenSel, RightPenSel, TopPenSel, BottomPenSel; // 默认选中时的颜色(淡蓝色边框)
    LeftPenDefault.CreatePen(PS_INSIDEFRAME | PS_SOLID, 3, RGB(153, 198, 252)); 
    RightPenDefault.CreatePen(PS_INSIDEFRAME | PS_SOLID, 3, RGB(162, 189, 252));
    TopPenDefault.CreatePen(PS_INSIDEFRAME | PS_SOLID, 2, RGB(162, 201, 255));
    BottomPenDefault.CreatePen(PS_INSIDEFRAME | PS_SOLID, 2, RGB(162, 201, 255)); // 鼠标移动到按钮上的颜色(橙黄色边框)
    LeftPenSel.CreatePen(PS_INSIDEFRAME | PS_SOLID, 3, RGB(250, 196, 88)); 
    RightPenSel.CreatePen(PS_INSIDEFRAME | PS_SOLID, 3, RGB(251, 202, 106));
    TopPenSel.CreatePen(PS_INSIDEFRAME | PS_SOLID, 2, RGB(252, 210, 121));
    BottomPenSel.CreatePen(PS_INSIDEFRAME | PS_SOLID, 2, RGB(229, 151, 0)); CPen* pLeft, *pRight, *pTop, *pBottom;
    if( m_bMouseInButton )
    {
    pLeft = &LeftPenSel;
    pRight = &RightPenSel;
    pTop = &TopPenSel;
    pBottom = &BottomPenSel;
    }
    else
    {
    pLeft = &LeftPenDefault;
    pRight = &RightPenDefault;
    pTop = &TopPenDefault;
    pBottom = &BottomPenDefault;
    } CPoint oldPoint = pDC->MoveTo(rect.left + 2, rect.bottom - 3);
    CPen* pOldPen = pDC->SelectObject(pLeft);
    pDC->LineTo(rect.left + 2, rect.top + 2);
    pDC->SelectObject(pRight);
    pDC->MoveTo(rect.right - 3, rect.bottom - 3);
    pDC->LineTo(rect.right - 3, rect.top + 2);
    pDC->SelectObject(pTop);
    pDC->MoveTo(rect.left + 2, rect.top + 2);
    pDC->LineTo(rect.right - 3, rect.top + 2);
    pDC->SelectObject(pBottom);
    pDC->MoveTo(rect.left + 2, rect.bottom - 2);
    pDC->LineTo(rect.right - 3, rect.bottom - 2);
    pDC->SelectObject(pOldPen);
    pDC->MoveTo(oldPoint); LeftPenSel.DeleteObject();
    RightPenSel.DeleteObject();
    TopPenSel.DeleteObject();
    BottomPenSel.DeleteObject(); LeftPenDefault.DeleteObject();
    RightPenDefault.DeleteObject();
    TopPenDefault.DeleteObject();
    BottomPenDefault.DeleteObject();
    }// 绘制按钮外边框
    void CEditBtnList::DrawBorder(CDC* pDC, const CRect& rect)
    {
    CPen BoundPen, *pOldPen;
    BoundPen.CreatePen(PS_INSIDEFRAME | PS_SOLID, 1, RGB(0, 0, 0)); pOldPen = pDC->SelectObject(&BoundPen); POINT pt;
    pt.x = 5;
    pt.y = 5;
    pDC->RoundRect(&rect, pt); pDC->SelectObject(pOldPen);
    BoundPen.DeleteObject();
    }// 绘制按钮文字
    void CEditBtnList::DrawButtonText(CDC* pDC, const CRect& rect)
    {
    CFont* hFont = GetFont();
    CFont* hOldFont = pDC->SelectObject(hFont);
    CSize szExtent = pDC->GetTextExtent(m_strBtnText, m_strBtnText.GetLength()); CPoint pt( rect.CenterPoint().x - szExtent.cx / 2, rect.CenterPoint().y - szExtent.cy / 2);
    pt.Offset(1, 1);
    int nMode = pDC->SetBkMode(TRANSPARENT); pDC->DrawState(pt, szExtent, m_strBtnText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
    pDC->SelectObject(hOldFont);
    pDC->SetBkMode(nMode);
    }void CEditBtnList::OnMouseMove(UINT nFlags, CPoint point)
    {
    CDC* pDC = GetDC(); if( m_BtnRect.PtInRect(point) )
    {
    if( !m_bMouseInButton )
    {
    InvalidateRect(m_BtnRect);
    m_bMouseInButton = true;
    }
    }
    else
    {
    if( m_bMouseInButton )
    {
    InvalidateRect(m_BtnRect, FALSE);
    m_bMouseInButton = false;
    }
    } CListBox::OnMouseMove(nFlags, point);
    }
      

  5.   

    我知道你是想做一个没有黑色三角的下拉列表控件,你的方向不对。如果响应重载 CEdit::OnPaint() 那会牵涉到很多功能的修改。即使你技术没有问题,要做的话代码量是很大的,比如用户选择几个字符,被选字符的前景背景都要重画等等。