自定义CStatic,透明显示,多行,居中对齐,改变颜色,大小,加粗,字型等
自定义CStatic
1.开发平台
VS2013 + WIN 7 32 bites
2.自定义CStatic的功能
- 背景透明显示文字
- 可改变文字的颜色、字体大小、字型(字符集)、字体粗细(粗体字,常规字)
- 文字对齐方式:水平左对齐,水平右对齐,水平居中对齐;垂直居中对齐
- 支持文字多行显示
3.运行效果截图
4.程序代码
// StaticEx.cpp :实现文件 //
//
#include “stdafx.h”
#include “T.h”
#include “StaticEx.h”
// CStaticEx
IMPLEMENT_DYNAMIC(CStaticEx, CStatic)
CStaticEx::CStaticEx()
{
nFontWeight = 700;
nFontSize = 12;
fontFaceName = _T(""); ///“楷体_GB2312”
fontColor = RGB(111, 111, 111);
}
CStaticEx::~CStaticEx()
{
}
BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()
// CStaticEx 消息处理程序
void CStaticEx::OnPaint()
{
CPaintDC dc(this); // device context for painting
TODO: 在此处添加消息处理程序代码
不为绘图消息调用CStatic::OnPaint();
CFont mFont, *pFont, *pOldFont;
LOGFONT logfont;
UINT nFontAlign = DT_WORDBREAK | DT_CENTER| DT_VCENTER; // | DT_SINGLELINE
pFont = GetFont();
pFont->GetLogFont(&logfont);
logfont.lfHeight = nFontSize;
logfont.lfWeight = nFontWeight; // bFontBold ? 700 : 400;
if (!fontFaceName.IsEmpty())
lstrcpy(logfont.lfFaceName, fontFaceName);
switch (GetStyle() & 0x3)
{
case SS_LEFT:
nFontAlign = nFontAlign | DT_LEFT;
break;
case SS_RIGHT:
nFontAlign = nFontAlign | DT_RIGHT;
break;
default:
nFontAlign = nFontAlign | DT_CENTER;
break;
}
//logfont.lfHeight = 40; logfont.lfWidth = 0;
//logfont.lfEscapement = 0; logfont.lfOrientation = 0;logfont.lfItalic = 0;
//logfont.lfUnderline = 0; logfont.lfStrikeOut = 0;
//logfont.lfCharSet = DEFAULT_CHARSET; logfont.lfOutPrecision = 1;
//logfont.lfClipPrecision = 1;
//logfont.lfQuality = DEFAULT_QUALITY;
//logfont.lfPitchAndFamily = 0;
//logfont.lfOutPrecision = OUT_TT_ONLY_PRECIS; //OUT_TT_PRECIS;
mFont.CreateFontIndirect(&logfont);
pOldFont = dc.SelectObject(&mFont);
dc.SetTextColor(fontColor);
dc.SetBkMode(TRANSPARENT);
CRect rect, rectCal;
CString strText;
GetClientRect(rect);
GetClientRect(rectCal);
GetWindowText(strText);
int height = DrawText(dc, strText, strText.GetLength(), &rect, DT_CALCRECT | nFontAlign);
if (rectCal.Height() > height) //判断高度是否超出范围,以免出现负数情况
rectCal.top += (rectCal.Height() - height) / 2; //计算空白高度的一半,这里要用+=
DrawText(dc, strText, strText.GetLength(), &rectCal, nFontAlign);
mFont.DeleteObject();
mFont.Detach();
dc.SelectObject(pOldFont);
}
void CStaticEx::Invalidate(BOOL bErase){
CRect rect;
GetClientRect(rect);
ClientToScreen(&rect);
CWnd *pWnd = GetParent();
pWnd->ScreenToClient(&rect);
pWnd->InvalidateRect(&rect);
CStatic::OnPaint();
}
// StaticEx.h //
///
#pragma once
// CStaticEx
class CStaticEx : public CStatic
{
DECLARE_DYNAMIC(CStaticEx)
public:
CStaticEx();
virtual ~CStaticEx();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
public:
void Invalidate(BOOL bErase = 1);
int nFontWeight;
int nFontSize;
CString fontFaceName ;
COLORREF fontColor;
};
// TDlg.cpp : 实现文件 //
#include “stdafx.h”
#include “T.h”
#include “TDlg.h”
#include “afxdialogex.h”
#include “StaticEx.h”
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CTDlg 对话框
-
CTDlg::CTDlg(CWnd* pParent /
=NULL/)
-
CDialogEx(CTDlg::IDD, pParent)
, m_fontFamilty(_T(""))
, m_bFontBold(FALSE)
, m_fontSizeString(_T(“字体大小: 12”))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//m_fontSizeString = _T(“字体大小: 12”);
}
void CTDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC1, m_static);
DDX_Check(pDX, IDC_CHECK1, m_bFontBold);
DDX_Control(pDX, IDC_MFCCOLORBUTTON1, m_fontColorControl);
DDX_Slider(pDX, IDC_SLIDER1, m_nFontSize);
DDX_Control(pDX, IDC_SLIDER1, m_sliderFontSize);
DDX_Text(pDX, IDC_STATIC4, m_fontSizeString);
}
BEGIN_MESSAGE_MAP(CTDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDCANCEL, &CTDlg::OnBnClickedCancel)
ON_BN_CLICKED(IDC_CHECK1, &CTDlg::OnBnClickedCheck1)
ON_BN_CLICKED(IDC_MFCCOLORBUTTON1, &CTDlg::OnBnClickedMfccolorbutton1)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER1, &CTDlg::OnNMReleasedcaptureSlider1)
END_MESSAGE_MAP()
// CTDlg 消息处理程序
BOOL CTDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
m_static.nFontWeight = 700; //700 : 400; bFontBold = false;
m_static.nFontSize = 12;
m_static.fontColor = RGB(255, 0, 0);
m_sliderFontSize.SetRange(9, 72);
m_sliderFontSize.SetPos(12);
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CTDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CRect rect;
CPaintDC dc(this);
GetClientRect(rect);
dc.FillSolidRect(rect, RGB(0, 250, 0));
CDialogEx::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标//显示。
HCURSOR CTDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}
void CTDlg::OnBnClickedCancel()
{
CFontDialog dlg;
if (IDOK != dlg.DoModal())
return;
LOGFONT newLogFont;
dlg.GetCurrentFont(&newLogFont);
m_static.nFontWeight = newLogFont.lfWeight;
m_static.nFontSize = newLogFont.lfHeight;
m_static.fontFaceName = newLogFont.lfFaceName;
m_static.fontColor = dlg.m_cf.rgbColors;
m_static.Invalidate();
}
void CTDlg::OnBnClickedCheck1()
{
UpdateData(true);
m_static.nFontWeight = m_bFontBold ? 700 : 400;
m_static.Invalidate();
}
void CTDlg::OnBnClickedMfccolorbutton1()
{
UpdateData(true);
m_static.fontColor = m_fontColorControl.GetColor();
m_static.Invalidate();
}
void CTDlg::OnNMReleasedcaptureSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
UpdateData(true);
m_static.nFontSize = m_nFontSize;
m_fontSizeString.Format(_T(“字体大小: %d”), m_nFontSize);
UpdateData(false);
m_static.Invalidate();
*pResult = 0;
}
// TDlg.h 文件 //
// TDlg.h : 头文件//
#pragma once
#include “afxwin.h”
#include “StaticEx.h”
#include “afxcolorbutton.h”
#include “afxcmn.h”
// CTDlg 对话框
class CTDlg : public CDialogEx
{
// 构造
public:
CTDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_T_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CStaticEx m_static;
CListBox m_fontFamiltyControl;
CString m_fontFamilty;
afx_msg void OnBnClickedCancel();
afx_msg void OnBnClickedCheck1();
afx_msg void OnBnClickedMfccolorbutton1();
BOOL m_bFontBold;
CMFCColorButton m_fontColorControl;
afx_msg void OnNMReleasedcaptureSlider1(NMHDR *pNMHDR, LRESULT *pResult);
int m_nFontSize;
CSliderCtrl m_sliderFontSize;
CString m_fontSizeString;
};