MFC Static透明背景色的实现、Static控件自绘、Static字体修改
清泛原创
第一种:pDC->SetBkMode(TRANSPARENT);
第二种:重载DrawItem函数进行自绘,将背景设置成窗口的背景色
自绘时注意点:
1、消息映射中不要有:ON_WM_PAINT、ON_WM_DRAWITEM 消息,否则DrawItem函数不会被调用。
2、DrawItem而非OnDrawItem。OnDrawItem是ON_WM_DRAWITEM消息的处理函数,是处理子控件发送过来的自绘消息的。
afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/);
COLORREF m_crText;
COLORREF m_crBk;
HBRUSH m_hbkbr;
...
BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()
CTransparentStatic::CTransparentStatic()
{
m_crText = RGB(40, 40, 40);
m_crBk = RGB(255,255,255);
m_hbkbr = CreateSolidBrush(m_crBk);
}
...
HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetBkMode(TRANSPARENT); //关键起作用的在这句
HBRUSH hb = (HBRUSH)GetStockObject(NULL_BRUSH);
if(CTLCOLOR_STATIC == nCtlColor)
{
pDC->SetTextColor(m_crText);
pDC->SetBkColor(m_crBk);
hb = m_hbkbr;
}
return hb;
}
这种方式比较简单,仅仅需要背景色透明的话采用这种较为方便。第二种:重载DrawItem函数进行自绘,将背景设置成窗口的背景色
virtual void PreSubclassWindow();
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
...
//添加Owner Draw属性
void CTransparentStatic::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CStatic::PreSubclassWindow();
DWORD dwStyle = GetStyle();
SetWindowLong(GetSafeHwnd(),GWL_STYLE,dwStyle | SS_OWNERDRAW);
}
void CTransparentStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
int nSaveDC = pDC->SaveDC();
pDC->SetBkMode(TRANSPARENT);
// 取得位置
CRect client_rect;
GetClientRect(client_rect);
// 取得文本
CString szText;
GetWindowText(szText);
// 取得字体,并选入设备文件
CFont *pFont, *pOldFont;
pFont = ::GetFont(_T("微软雅黑"), 10);
pOldFont = pDC->SelectObject(pFont);
pDC->TextOut(0, 0, szText);
pDC->SelectObject(pOldFont);
pDC->RestoreDC(nSaveDC);
}
这种采用完全自绘的方式更为灵活,可以改变字体、文本颜色等。自绘时注意点:
1、消息映射中不要有:ON_WM_PAINT、ON_WM_DRAWITEM 消息,否则DrawItem函数不会被调用。
2、DrawItem而非OnDrawItem。OnDrawItem是ON_WM_DRAWITEM消息的处理函数,是处理子控件发送过来的自绘消息的。