//TITLE:
// CText更新至V1.1.0
//AUTHOR:
// norains
//DATE:
// Saturday 28-April-2007
//Environment:
// EVC4.0 + Standard SDK 4.2
// EVC4.0 + Standard SDK 5.0
//========================================================================
版本历史:
v1.0: http://blog.csdn.net/norains/archive/2007/04/17/1568429.aspx
接口和上一版本的差异:
*SetTextHeight()更名为SetPointSize()
修正的bug:
*创建字体时没有lfCharSet变量,在wince5.0中会导致文字无法对准.
增加的函数:
*SetStrikeOut(BOOL bStrikeOut) //文件中划线
*SetUnderline(BOOL bUnderline) //下划线
*SetItalic(BOOL bItalic) //斜体
*SetWeight(int iWeight) //粗细
*重载 "="操作符,下列代码功能能够正常运作:
CText a, b;
a.SetText(TEXT("TEXT"));
a.SetTextColor(RGB(0,0,255));
b = a;
基本的操作可参照版本v1.0的文章
/**///////////////////////////////////////////////////////////////////////
// Text.h: interface for the CText class.
//
//Version:
// 1.1.0
//Data:
// 2007.04.28
/**///////////////////////////////////////////////////////////////////////
#ifndef TEXT_H
#define TEXT_H
//------------------------------------------------------------------
class CText
...{
public:
CText& operator =(const CText &rhs);
void SetStrikeOut(BOOL bStrikeOut);
void SetUnderline(BOOL bUnderline);
void SetItalic(BOOL bItalic);
BOOL SetWeight(int iWeight);
void GetPosition(RECT * prcOut);
void SetPointSize(int iPointSize);
void SetFormat(UINT uFormat);
void SetBkColor(COLORREF crColor);
void SetTextColor(COLORREF crColor);
BOOL SetBkMode(int iMode);
void Draw(HDC hdc);
BOOL SetText(const TCHAR *pszText);
void SetPosition(const RECT *prc);
CText();
virtual ~CText();
protected:
RECT m_rcWndPos;
TCHAR *m_pszText;
ULONG m_ulSizeText;
UINT m_uFormat;
int m_iPointSize;
int m_iBkMode;
COLORREF m_crTextColor;
COLORREF m_crBkColor;
int m_iWeight;
BOOL m_bItalic;
BOOL m_bUnderline;
BOOL m_bStrikeOut;
};
#endif // !defined(AFX_TEXT_H__15E5AD94_9958_4AAC_A6DD_37527FC294CB__INCLUDED_)
/**///////////////////////////////////////////////////////////////////////
// Text.cpp: implementation of the CText class.
//
/**///////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Text.h"
//--------------------------------------------------------------------
//Macro define
#define DEFAULT_BKMODE TRANSPARENT
#define DEFAULT_TEXT_COLOR RGB(0,0,0)
#define DEFAULT_BK_COLOR RGB(255,255,255)
#define DEFAULT_FORMAT (DT_LEFT | DT_SINGLELINE)
#define DEFAULT_POINT_SIZE 0
#define DEFAULT_WEIGHT 0
#define MAX_WEIGHT 1000
#define MIN_WEIGHT 0
//--------------------------------------------------------------------
/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**///////////////////////////////////////////////////////////////////////
CText::CText()
...{
memset(&m_rcWndPos,0,sizeof(m_rcWndPos));
m_pszText = NULL;
m_ulSizeText = 0;
m_iBkMode = DEFAULT_BKMODE;
m_crTextColor = DEFAULT_TEXT_COLOR;
m_crBkColor = DEFAULT_BK_COLOR;
m_uFormat = DEFAULT_FORMAT;
m_iPointSize = DEFAULT_POINT_SIZE;
m_iWeight = 0;
m_bItalic = FALSE;
m_bUnderline = FALSE;
m_bStrikeOut = FALSE;
}
CText::~CText()
...{
if(m_pszText != NULL)
...{
delete [] m_pszText;
m_pszText = NULL;
}
}
//--------------------------------------------------------------------
//Description:
// Set the control position
//
//--------------------------------------------------------------------
void CText::SetPosition(const RECT *prc)
...{
m_rcWndPos = *prc;
}
//--------------------------------------------------------------------
//Description:
// Set the text. If you want to display the text ,you should call the Display()
//
//--------------------------------------------------------------------
BOOL CText::SetText(const TCHAR *pszText)
...{
ULONG ulLen = _tcslen(pszText);
if(m_pszText == NULL)
...{
m_pszText = new TCHAR [ulLen + 1];
if(m_pszText == NULL)
...{
return FALSE;
}
m_ulSizeText = ulLen + 1;
}
else if(ulLen + 1 > m_ulSizeText)
...{
delete [] m_pszText;
m_pszText = new TCHAR [ulLen + 1];
if(m_pszText == NULL)
...{
return FALSE;
}
m_ulSizeText = ulLen + 1;
}
_tcscpy(m_pszText,pszText);
return TRUE;
}
//--------------------------------------------------------------------
//Description:
// Display the text stored.
//
//--------------------------------------------------------------------
void CText::Draw(HDC hdc)
...{
COLORREF crOldTextColor = ::SetTextColor(hdc,m_crTextColor);
COLORREF crOldBkColor = ::SetBkColor(hdc,m_crBkColor);
int iOldMode = ::SetBkMode(hdc,m_iBkMode);
LOGFONT lf = ...{0};
HFONT hFontNew, hFontOld;
lf.lfQuality = CLEARTYPE_QUALITY;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfHeight = -1 * (m_iPointSize * GetDeviceCaps(hdc,LOGPIXELSY) / 72);
lf.lfItalic = m_bItalic;
lf.lfUnderline = m_bUnderline;
lf.lfStrikeOut = m_bStrikeOut;
hFontNew = CreateFontIndirect(&lf);
hFontOld = (HFONT) SelectObject(hdc, hFontNew);
DrawText(hdc,m_pszText,-1,&m_rcWndPos,m_uFormat);
SelectObject(hdc, hFontOld);
DeleteObject(hFontNew);
::SetTextColor(hdc,crOldTextColor);
::SetBkColor(hdc,crOldBkColor);
::SetBkMode(hdc,iOldMode);
}
//--------------------------------------------------------------------
//Description:
// Set the background mode.
//
//Parameters:
// iMode: [in] The value is just like as follow:
// OPAQUE -- Background is filled with the current background color before the text,
// hatched brush, or pen is drawn.
// TRANSPARENT -- Background remains untouched.
//--------------------------------------------------------------------
BOOL CText::SetBkMode(int iMode)
...{
if(iMode == OPAQUE || iMode == TRANSPARENT)
...{
m_iBkMode = iMode;
return TRUE;
}
else
...{
return FALSE;
}
}
//--------------------------------------------------------------------
//Description:
// Set the text color
//
//--------------------------------------------------------------------
void CText::SetTextColor(COLORREF crColor)
...{
m_crTextColor = crColor;
}
//--------------------------------------------------------------------
//Description:
// Set the background color
//
//--------------------------------------------------------------------
void CText::SetBkColor(COLORREF crColor)
...{
m_crBkColor = crColor;
}
//--------------------------------------------------------------------
//Description:
// Set Format.
//
//Parameters:
// The value you should see the uFormat of DrawText()
//--------------------------------------------------------------------
void CText::SetFormat(UINT uFormat)
...{
m_uFormat = uFormat;
}
//--------------------------------------------------------------------
//Description:
// Set the point size of text
//
//---------------------------------------------------------------------
void CText::SetPointSize(int iPointSize)
...{
m_iPointSize = iPointSize;
}
//--------------------------------------------------------------------
//Description:
// Get the position as rect
//
//---------------------------------------------------------------------
void CText::GetPosition(RECT *prcOut)
...{
*prcOut = m_rcWndPos;
}
//--------------------------------------------------------------------
//Description:
// Specifies the weight of the font in the range 0 through 1000. For example,
//400 is normal and 700 is bold. If this value is zero, a default weight is used.
//
//---------------------------------------------------------------------
BOOL CText::SetWeight(int iWeight)
...{
if(iWeight < MIN_WEIGHT || iWeight > MAX_WEIGHT)
...{
return FALSE;
}
m_iWeight = iWeight;
return TRUE;
}
//--------------------------------------------------------------------
//Description:
// Set the italic
//
//---------------------------------------------------------------------
void CText::SetItalic(BOOL bItalic)
...{
m_bItalic = bItalic;
}
//--------------------------------------------------------------------
//Description:
// Set the underline
//
//---------------------------------------------------------------------
void CText::SetUnderline(BOOL bUnderline)
...{
m_bUnderline = bUnderline;
}
//--------------------------------------------------------------------
//Description:
// Set the strikeOut
//
//---------------------------------------------------------------------
void CText::SetStrikeOut(BOOL bStrikeOut)
...{
m_bStrikeOut = bStrikeOut;
}
//--------------------------------------------------------------------
//Description:
// Overload the operator "="
//
//---------------------------------------------------------------------
CText& CText::operator =(const CText &rhs)
...{
if(this == &rhs)
...{
return *this;
}
this->m_bItalic = rhs.m_bItalic;
this->m_bStrikeOut = rhs.m_bStrikeOut;
this->m_bUnderline = rhs.m_bUnderline;
this->m_crBkColor = rhs.m_crBkColor;
this->m_crTextColor = rhs.m_crTextColor;
this->m_iBkMode = rhs.m_iBkMode;
this->m_iPointSize = rhs.m_iPointSize;
this->m_iWeight = rhs.m_iWeight;
this->m_rcWndPos = rhs.m_rcWndPos;
this->m_uFormat = rhs.m_uFormat;
this->m_ulSizeText = rhs.m_ulSizeText;
if(this->m_pszText != NULL)
...{
delete [] this->m_pszText;
}
this->m_pszText = new TCHAR[_tcslen(rhs.m_pszText) + 1];
_tcscpy(this->m_pszText,rhs.m_pszText);
return *this;
}