如何继承CStatic类使界面文本显示不再单调
在VC中仅提供了基本的静态文本显示控件Static,它使用父窗口默认的字体风格显示,在许多应用中显得过于单调,如何使Static能够按照自己需要的风格显示,我这里给大家提供一种方法,大家可以自己试试。
1.建立VC工程,在工程中基于基类CStaitc,派生出自己的CStaitcEx类,加该类到你的工程中,当然你使用类生成向导,文件自然会加入到你的工程中。一般来说生成的文件为StaticEx.cpp和StaticEx.h。
2.编写CStaticEx类
在StaticEx类中加入逻辑字体变量、颜色变量、字符串变量:
LOGFONT m_LogFont;
COLORREF m_TextColor;
CString m_WindowsText;
然后增加函数(public属性)
void SetTextSize(int size = 15)//参数为逻辑字体大小
{
m_LogFont.lfHeight = -size;
}
void SetTextFont(CString FontName)//参数为逻辑字体名
{
strcpy(m_LogFont.lfFaceName, FontName);
}
void SetTextWeight(int weight) // 参数为逻辑字体粗细 (value from 0 to 1000 and step is 100)
{
m_LogFont.lfWeight = weight;
}
void SetTextColor(COLORREF crColor)
{
m_TextColor = crColor;
}
增加CStaticEx类的WM_PAINT消息映射(可以用Classwizard),然后在OnPaint里添加代码
CRect nRect;
CFont NewFont, *OldFont;
NewFont.CreateFontIndirect(&m_LogFont);
OldFont = dc.SelectObject(&NewFont);
dc.SetBkMode(TRANSPARENT); //OPAQUE Background is filled TRANSPARENT
dc.SetTextColor(m_TextColor);
GetWindowText(m_WindowText);
GetClientRect(&nRect);
dc.TextOut((nRect.right/2), 0, m_WindowText);
dc.SelectObject(OldFont);
另外,构造函数中加入下列初始化代码 (这段代码在实际使用中发现,不用加,加了反而影响字体设置)
CStaticEx::CStaticEx()
{
memset(&m_LogFont, 0, sizeof(LOGFONT));
m_LogFont.lfHeight = -15;
m_LogFont.lfCharSet = GB2312_CHARSET;
strcpy((LPSTR)&(m_LogFont.lfFaceName), "宋体");
m_AlignFlag = TA_CENTER;
m_TextColor = RGB(0,0,0);
}
完成上述代码,我们就可以在工程中使用该类实现任意大小、颜色和字体的文本显示了。
3.使用你的CStaticEx类
在你的工程中,向以前一样拖一个Staic到你的界面上,然后手动添加变量:
CStaticEx m_StaticEx;建议添在如下处,因为添加后在类向导的变量映射表中可以显示出来。
// Dialog Data
//{{AFX_DATA(CVoiceBasic)
enum { IDD = IDD_DLG};
CStaticEx m_StaticEx;
//}}AFX_DATA
然后重要的一步就是在数据交换中增加你的类和控件之间的关联(假如你Static控件的名称是IDC_MYSTATIC):
void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVoiceBasic)
DDX_Control(pDX, IDC_MYSTATIC, m_StaticEx);
//}}AFX_DATA_MAP
}
最后一步了,在你的工程界面初始化的时候调用你刚才CStaticEx中自己定义的函数,你就会发现你的静态文本由你来控制了,当然依次类推,逻辑字体LONGFONT中所能体现的字体风格你都是可以实现的。
m_StaticEx.SetTextColor(RGB(100, 0, 0));
m_StaticEx.SetTextSize(25);
m_StaticEx.SetTextWeight(700);
m_StaticEx.SetTextFont("隶书");
4.总结
其实VC的基本控件的风格显示基本上都可以按照这种继承方式来实现自定义,自己可以试试。