📄 3dtextbtn.cpp
字号:
// 3DTextBtn.cpp : implementation file
//
#include "stdafx.h"
#include "3DText.h"
#include "3DTextBtn.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// C3DTextBtn
BEGIN_MESSAGE_MAP(C3DTextBtn, CButton)
//{{AFX_MSG_MAP(C3DTextBtn)
ON_WM_DRAWITEM()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void C3DTextBtn::PreSubclassWindow()
{
SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
}
///////////////////////////////////////////////////////////////////////////
// C3DTextBtn message handlers
void C3DTextBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
ASSERT_VALID(pDC);
CRect rectClient = lpDrawItemStruct->rcItem;
Draw(pDC,rectClient, lpDrawItemStruct->itemState);
}
void C3DTextBtn::Draw(CDC* pDC, const CRect& rect, UINT state)
{
CString text; GetWindowText(text);
int l = text.GetLength();
CRect rectClient = rect;
// 获取控件字体
CFont* pFont = GetFont();
// 确保该字体具有正确的大小,并将其选入设备环境
LOGFONT logfont;
pFont->GetObject(sizeof(LOGFONT),&logfont);
if (logfont.lfHeight == 0) logfont.lfHeight = 20;
// 将lfWidth设为0,从而使其自动计算
logfont.lfWidth = 0;
logfont.lfWeight = 1000;
logfont.lfEscapement = logfont.lfOrientation = 0;
CFont tryfont;
VERIFY(tryfont.CreateFontIndirect(&logfont));
CFont* pFontOld = pDC->SelectObject(&tryfont);
// 取得测试字体下的文本长度,并据此精确调整字体的大小
if (m_bUse3D) rectClient.DeflateRect(3,3);
CSize textSizeClient = pDC->GetTextExtent(text,l);
if (rectClient.Width()*textSizeClient.cy > rectClient.Height()*textSizeClient.cx)
{
logfont.lfHeight = ::MulDiv(logfont.lfHeight,rectClient.Height(),textSizeClient.cy);
}
else
{
logfont.lfHeight = ::MulDiv(logfont.lfHeight,rectClient.Width(),textSizeClient.cx);
}
logfont.lfHeight--;
if (m_bUse3D) rectClient.InflateRect(3,3);
CFont font;
font.CreateFontIndirect(&logfont);
pDC->SelectObject(&font);
textSizeClient = pDC->GetTextExtent(text,l);
int minx = rectClient.left+(rectClient.Width()-textSizeClient.cx)/2;
int miny = rectClient.top+(rectClient.Height()-textSizeClient.cy)/2;
int oldBkMode = pDC->SetBkMode(TRANSPARENT);
COLORREF textcol = ::GetSysColor((state & ODS_FOCUS) ? COLOR_GRAYTEXT : COLOR_BTNTEXT);
COLORREF oldTextColor = pDC->SetTextColor(textcol);
int cx = minx;
int cy = miny;
if (m_bUse3D)
{
int s = (state & ODS_SELECTED) ? -1 : +1;
cx += 3; cy += 3;
// 绘制3D凸出文本
pDC->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW));
pDC->TextOut(cx-s*2,cy+s*2,text);
pDC->TextOut(cx+s*2,cy-s*2,text);
pDC->TextOut(cx+s*2,cy+s*2,text);
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->TextOut(cx+s*1,cy-s*2,text);
pDC->TextOut(cx-s*2,cy+s*1,text);
pDC->TextOut(cx-s*2,cy-s*2,text);
pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
pDC->TextOut(cx-s*1,cy+s*1,text);
pDC->TextOut(cx+s*1,cy-s*1,text);
pDC->TextOut(cx+s*1,cy+s*1,text);
pDC->SetTextColor(::GetSysColor(COLOR_3DLIGHT));
pDC->TextOut(cx,cy-s*1,text);
pDC->TextOut(cx-s*1,cy,text);
pDC->TextOut(cx-s*1,cy-s*1,text);
pDC->SetTextColor(textcol);
}
// 绘制文本,恢复设备环境
pDC->TextOut(cx,cy,text);
pDC->SetTextColor(oldTextColor);
pDC->SetBkMode(oldBkMode);
pDC->SelectObject(pFontOld);
}
BOOL C3DTextBtn::OnEraseBkgnd(CDC*)
{
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -