MFC 可以設置背景色、字體、字體顏色、透明背景的 Static 靜態文本控件 2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀 睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接 MFC庫里沒有符合這個條件的控件,于是我自己寫了一個,初步測試有效。注:可以設置透明背景,但還不能做到透明度設置(如50%透明度) 如果設置了背景色,就不保留透明背景 默認背景色是透明的[cpp] view plaincopy// 設置背景色(若clr為CLR_NONE,則背景透明) void SetBackgroundColor(COLORREF clr){m_clrBackground = clr;} // 設置文字前景色 void SetTextColor(COLORREF clr){m_clrText = clr;} // 設置文字字體 void SetFont(CString strFaceName, LONG nHeight); 如何使用: 1.先將RichStatic.h和RichStatic.cpp添加入工程 2.對話框添加Static控件后,增加一個控件變量,類型設置為CRichStatic(或手動添加,在對話框類DoDataExchange中添加DDX_Control)源碼:[cpp] view plaincopy#pragma once // CRichStatic class CRichStatic : public CStatic { DECLARE_DYNAMIC(CRichStatic) public: CRichStatic(); virtual ~CRichStatic(); protected: afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg LRESULT OnSetText(WPARAM,LPARAM); DECLARE_MESSAGE_MAP() virtual void PreSubclassWindow(); private: COLORREF m_clrText; // 文字前景色 COLORREF m_clrBackground; // 文字背景色 CFont *m_pTextFont; // 文字字體 CBitmap m_Bmp; // 保存背景用的位圖對象 public: // 設置背景色(若clr為CLR_NONE,則背景透明) void SetBackgroundColor(COLORREF clr){m_clrBackground = clr;} // 設置文字前景色 void SetTextColor(COLORREF clr){m_clrText = clr;} // 設置文字字體 void SetFont(CString strFaceName, LONG nHeight); public: virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/); }; [cpp] view plaincopy// RichStatic.cpp : 實現文件 // #include "stdafx.h" #include "RichStatic.h" // CRichStatic IMPLEMENT_DYNAMIC(CRichStatic, CStatic) CRichStatic::CRichStatic(): m_clrText(0), m_clrBackground(CLR_NONE), m_hFont(NULL), m_selfCreated(FALSE), m_xAlignment(X_LEFT), m_yAlignment(Y_TOP) { } CRichStatic::~CRichStatic() { if (m_selfCreated && m_hFont != NULL) { DeleteObject(m_hFont); // 若字體對象為對象自己創建并且不為NULL,則銷毀掉以釋放內核對象 } } BEGIN_MESSAGE_MAP(CRichStatic, CStatic) ON_MESSAGE(WM_SETTEXT,OnSetText) ON_WM_ERASEBKGND() END_MESSAGE_MAP() // CRichStatic 消息處理程序 void CRichStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if (m_clrBackground != CLR_NONE) // 若背景色不為CLR_NONE(CLR_NONE表示無背景色),則繪制背景 { RECT rect; GetWindowRect(&rect); CBrush brush; brush.CreateSolidBrush(m_clrBackground); ::SelectObject(lpDrawItemStruct->hDC, brush.m_hObject); // 設置畫刷顏色 ::SelectObject(lpDrawItemStruct->hDC, GetStockObject(NULL_PEN)); // 設置筆為空筆(不繪制邊界) Rectangle(lpDrawItemStruct->hDC, 0, 0,rect.right - rect.left, rect.bottom - rect.top); } CString strCaption; // 標題文字 GetWindowText(strCaption); if (m_hFont != NULL) { ::SelectObject(lpDrawItemStruct->hDC, m_hFont); } // 計算輸出字串的橫縱坐標 int x = 0, y = 0; if (X_LEFT != m_xAlignment || Y_TOP != m_yAlignment) // 不是左對齊或不是頂對齊 { CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect crect; GetWindowRect(&crect); CSize size = pDC->GetTextExtent(strCaption); if (X_RIGHT == m_xAlignment) // 右對齊 { x = crect.Width() - size.cx; } else if (X_CENTER == m_xAlignment) // X居中對齊 { x = (crect.Width()- size.cx) / 2; } if (Y_BOTTOM == m_yAlignment) // 頂對齊 { y = crect.Height() - size.cy; } else if (Y_CENTER == m_yAlignment) // Y居中對齊 { y = (crect.Height() - size.cy) / 2; } } // 設置dc字串顏色 ::SetTextColor(lpDrawItemStruct->hDC, m_clrText); TextOut(lpDrawItemStruct->hDC, x, y, strCaption, strCaption.GetLength()); } void CRichStatic::PreSubclassWindow() { CStatic::PreSubclassWindow(); ModifyStyle(0, SS_OWNERDRAW); } void CRichStatic::SetFont(CString strFaceName, LONG nHeight) { if (m_selfCreated && m_hFont != NULL) { DeleteObject(m_hFont); // 若字體對象為對象自己創建并且不為NULL,則銷毀掉以釋放內核對象 } CFont cfont; LOGFONT lf; memset(&lf, 0, sizeof lf); // 清空LOGFONT結構體,之后對其賦值 lf.lfHeight = nHeight; _tcscpy_s(lf.lfFaceName, strFaceName.GetBuffer()); // 將字體名拷貝到LOGFONT結構體中 VERIFY(cfont.CreateFontIndirect(&lf)); // 創建新的字體 m_hFont = (HFONT)cfont.m_hObject; m_selfCreated = TRUE; // 標記字體為自己創建的 } void CRichStatic::SetFont(HFONT hFont) { if (m_selfCreated && m_hFont != NULL) { DeleteObject(m_hFont); // 若字體對象為對象自己創建并且不為NULL,則銷毀掉以釋放內核對象 } m_hFont = hFont; m_selfCreated = FALSE; // 標記字體非自己創建 } void CRichStatic::SetFont(const CFont *pFont) { if (m_selfCreated && m_hFont != NULL) { DeleteObject(m_hFont); // 若字體對象為對象自己創建并且不為NULL,則銷毀掉以釋放內核對象 } m_hFont = (HFONT)pFont->m_hObject; m_selfCreated = FALSE; // 標記字體非自己創建 } BOOL CRichStatic::OnEraseBkgnd(CDC* pDC) { // 當背景色為透明時,需要保存與拷貝顯示主框的顯示區域 if (m_clrBackground == CLR_NONE) { if (m_Bmp.GetSafeHandle() == NULL) { CRect Rect; GetWindowRect(&Rect); CWnd *pParent = GetParent(); ASSERT(pParent); pParent->ScreenToClient(&Rect); // 將坐標轉換為與主對話框相對應 // 拷貝對應區域主框顯示的內容 CDC *pDC = pParent->GetDC(); CDC MemDC; MemDC.CreateCompatibleDC(pDC); m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height()); CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp); MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY); MemDC.SelectObject(pOldBmp); MemDC.DeleteDC(); // 刪除內存DC,否則內存泄漏 pParent->ReleaseDC(pDC); } else // 將主框顯示的內容拷貝回去 { CRect Rect; GetClientRect(Rect); CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp); pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBmp); MemDC.DeleteDC(); // 刪除內存DC,否則內存泄漏 } } return TRUE; } LRESULT CRichStatic::OnSetText(WPARAM wParam,LPARAM lParam) { LRESULT Result = Default(); Invalidate(); UpdateWindow(); return Result; } from:http://blog.csdn.net/cashey1991/article/details/7545614RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成