// TransparentStatic2.cpp : implementation file // #include "stdafx.h" #include "TransparentStatic.h" // CTransparentStatic IMPLEMENT_DYNAMIC(CTransparentStatic, CStatic) CTransparentStatic::CTransparentStatic() { } CTransparentStatic::~CTransparentStatic() { } BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic) ON_MESSAGE(WM_SETTEXT,OnSetText) ON_WM_CTLCOLOR_REFLECT() ON_WM_ERASEBKGND() END_MESSAGE_MAP() // CTransparentStatic message handlers LRESULT CTransparentStatic::OnSetText(WPARAM wParam,LPARAM lParam) { LRESULT Result = Default(); Invalidate(); UpdateWindow(); return Result; } HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT /*nCtlColor*/) { pDC->SetTextColor(m_crText); pDC->SelectObject(&m_font); pDC->SetBkMode(TRANSPARENT); return (HBRUSH)GetStockObject(NULL_BRUSH); } BOOL CTransparentStatic::OnEraseBkgnd(CDC* pDC) { if (m_Bmp.GetSafeHandle() == NULL) { CRect Rect; GetWindowRect(&Rect); CWnd *pParent = GetParent(); ASSERT(pParent); pParent->ScreenToClient(&Rect); //convert our corrdinates to our parents //copy what's on the parents at this point CDC *pDC = pParent->GetDC(); CDC MemDC; MemDC.CreateCompatibleDC(pDC); m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height()); CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp); MemDC.SetTextColor(m_crText); MemDC.SelectObject(&m_font); MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY); MemDC.SelectObject(pOldBmp); pParent->ReleaseDC(pDC); } else //copy what we copied off the parent the first time back onto the parent { CRect Rect; GetClientRect(Rect); CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp); MemDC.SetTextColor(m_crText); MemDC.SelectObject(&m_font); pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBmp); } return TRUE; } /************************************************************* *add at : 2014-08-11 by唐太闲 *describe: 设置CStatic的文本 *************************************************************/ CTransparentStatic& CTransparentStatic::SetText(const CString& strText) { if(IsWindow(this->GetSafeHwnd())) { SetWindowText(strText); } return *this; } /************************************************************* *add at : 2014-08-11 by唐太闲 *describe: 设置字体和大小CreatePointFont的第一个参数要求很大, 乘了个7,7是随便定的 *************************************************************/ CTransparentStatic& CTransparentStatic::SetMyFont(int nSize,const CString& strFont) { /*VERIFY(m_font.CreateFont(nSize,//tc:这个数字是字体大小 0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,strFont)); SetFont(&m_font);*/ m_font.CreatePointFont(nSize*7,strFont); Update(); //tc:设置完成后需要立即刷新 return *this; } /************************************************************* *add at : 2014-08-11 by唐太闲 *describe: 设置文本颜色,m_crText在函数CtlColor中会用来进行设置 *************************************************************/ CTransparentStatic& CTransparentStatic::SetTextColor(COLORREF crText) { m_crText = crText; Update();//tc:设置完成后需要立即刷新 return *this; } /************************************************************* *add at : 2014-08-11 by唐太闲 *describe: 通过父窗口强制刷新区域 *************************************************************/ void CTransparentStatic::Update() { CRect (rc); GetWindowRect(rc); RedrawWindow(); GetParent()->ScreenToClient(rc); GetParent()->InvalidateRect(rc,TRUE); GetParent()->UpdateWindow(); }