编辑框文本背景控制 本帖最后由 ppkele 于 2011-09-15 15:29:08 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 怎么控制这个白色背景:OnCtlColor如果想显示这个按钮,光靠控制背景还不够,建议重载CEdit,在画背景的时候,去掉按钮的位置。 你好,我是重载了CEdit类,具体的能给点代码吗? 现在越来越喜欢重载了。想怎么样就怎么样。下面的就是重载 CEdit 做的。 之前写过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);} 我知道你是想做一个没有黑色三角的下拉列表控件,你的方向不对。如果响应重载 CEdit::OnPaint() 那会牵涉到很多功能的修改。即使你技术没有问题,要做的话代码量是很大的,比如用户选择几个字符,被选字符的前景背景都要重画等等。 调用cpaicom.dll数据签名 为什么Attribute的value的值总是失败?name用的是0 MFC 窗口显示的几个问题,大家帮忙看看。 如何将找到的句柄显示出来 关于HDC的问题 MDI问题 MFC生成的stdafx.cpp文件是做什么用的? 怎样将IE设为只能上一个网站呀 请问如何在工具栏中显示真彩色的图标? VC调用webservice超时问题 如何实现对其他应用程序的调用 xtreme toolkit pro引用XT_LOGFONT 总是出错,不知何故 多线程与双核CPU的问题
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);
}