1.自定义CStatic
2.实现
//
// 静态文字居中CStatic
#pragma once
// CMultilineStatic
class CMultilineStatic : public CStatic
{
DECLARE_DYNAMIC(CMultilineStatic)
public:
CMultilineStatic(COLORREF bgColor, COLORREF textColor, COLORREF m_seprator, CFont* font);
virtual ~CMultilineStatic();
virtual void PreSubclassWindow();
afx_msg void DrawItem(LPDRAWITEMSTRUCT);
COLORREF m_bgColor; //背景艳色
COLORREF m_textColor; //文体颜色
COLORREF m_seprator; //分割线颜色
CFont* m_font; //字体
protected:
DECLARE_MESSAGE_MAP()
};
// MultilineStatic.cpp : 实现文件
// 静态文字居中CStatic
#include "stdafx.h"
#include "MultilineStatic.h"
#include "Resource.h"
// CMultilineStatic
IMPLEMENT_DYNAMIC(CMultilineStatic, CStatic)
CMultilineStatic::CMultilineStatic(COLORREF bgColor, COLORREF textColor, COLORREF seprator, CFont* font)
{
m_bgColor = bgColor;
m_textColor = textColor;
m_seprator = seprator;
m_font = font;
}
CMultilineStatic::~CMultilineStatic()
{
}
void CMultilineStatic::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
DWORD dwStyle = GetStyle();
SetWindowLong(GetSafeHwnd(),GWL_STYLE,dwStyle | SS_OWNERDRAW );
CStatic::PreSubclassWindow();
}
BEGIN_MESSAGE_MAP(CMultilineStatic, CStatic)
END_MESSAGE_MAP()
// CMultilineStatic 消息处理程序
void CMultilineStatic::DrawItem(LPDRAWITEMSTRUCT)
{
CRect temp;
GetWindowRect(&temp);
ScreenToClient(&temp);
CRect rcWnd = temp;
CString strText;
GetWindowText(strText);
CDC *pdc = GetWindowDC();
CDC dcMem;
dcMem.CreateCompatibleDC(pdc);
CBitmap bmpBg;
bmpBg.CreateCompatibleBitmap(pdc,rcWnd.Width(),rcWnd.Height());
dcMem.SelectObject(&bmpBg);
dcMem.SetBkMode(TRANSPARENT);
dcMem.SetTextColor(m_textColor);
CBrush brush(m_bgColor);
dcMem.FillRect(&rcWnd, &brush);
dcMem.SelectObject(m_font);
int height = dcMem.DrawText(strText,temp, DT_WORDBREAK | DT_CALCRECT | DT_EDITCONTROL); // 获得文本高度
rcWnd.OffsetRect(0,(rcWnd.Height()-height)/2);
dcMem.DrawText(strText,rcWnd, DT_CENTER | DT_WORDBREAK | DT_VCENTER);
BLENDFUNCTION bf = {0};
bf.AlphaFormat = AC_SRC_OVER ;
bf.BlendFlags = 0;
bf.BlendOp = AC_SRC_OVER ;
bf.SourceConstantAlpha = 255;
pdc->AlphaBlend(0,0,rcWnd.Width(),rcWnd.Height(),&dcMem,0,0,rcWnd.Width(),rcWnd.Height(),bf);
ReleaseDC(pdc);
}
3.使用(垂直居中则需使用\n)
CMultilineStatic* pCheckStatic = new CMultilineStatic(m_clrStatic, clrBlack, RGB(115,159,220), &m_fontstatic);
pCheckStatic->Create(_T("检\n测\n设\n置"),SS_OWNERDRAW,CRect(0,58,50,58*4+1), this);
pCheckStatic->ShowWindow(SW_SHOW);