⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3dtextbtn.cpp

📁 不可多得的例程资源
💻 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 + -