MFC庫裏沒有符合這個條件的控件,因而我本身寫了一個,初步測試有效。app
注:能夠設置透明背景,但還不能作到透明度設置(如50%透明度)oop
若是設置了背景色,就不保留透明背景測試
默認背景色是透明的字體
- // 設置背景色(若clr爲CLR_NONE,則背景透明)
- void SetBackgroundColor(COLORREF clr){m_clrBackground = clr;}
- // 設置文字前景色
- void SetTextColor(COLORREF clr){m_clrText = clr;}
- // 設置文字字體
- void SetFont(CString strFaceName, LONG nHeight);
如何使用:url
1.先將RichStatic.h和RichStatic.cpp添加入工程
2.對話框添加Static控件後,增長一個控件變量,類型設置爲CRichStatic(或手動添加,在對話框類DoDataExchange中添加DDX_Control)
源碼:spa
- #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*/);
- };
- // 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/7545614