一个字体,大小,颜色可定义的自绘静态框控件-XColorStatic 类

翻译来源:https://www.codeproject.com/Articles/5242/XColorStatic-a-colorizing-static-control

XColor  Static 是一个简单的基于静态框 的控件,它提供字体更改,文本和背景颜色以及图标显示。

介绍

XColor Static是一种通用控件,允许在对话框中显示漂亮的文本。该演示向您展示了可能的文本和图标显示类型:

截图

XColorstatic API

以下是完整的方法列表CXColorStatic

void SetBackgroundColor(COLORREF rgb, BOOL bRedraw = TRUE);
void SetTextColor(COLORREF rgb, BOOL bRedraw = TRUE);
void SetBold(BOOL bFlag, BOOL bRedraw = TRUE);
void SetFont(LPCTSTR lpszFaceName, int nPointSize, BOOL bRedraw = TRUE);
void SetFont(LOGFONT *pLogFont, BOOL bRedraw = TRUE);
void SetFont(CFont *pFont, BOOL bRedraw = TRUE);
void SetIcon(HICON hIcon, BOOL bRedraw = TRUE);
void SetMargins(int x, int y) { m_nXMargin = x; m_nYMargin = y; }

如何使用

要将XColor Static集成到应用程序中,首先需要将以下文件添加到您的项目中:

  • XColorstatic.cpp
  • XColor static.h
  • FontSize.cpp
  • FontSize.h

然后使用资源编辑器将静态控件添加到对话框中,并使用类向导将成员变量附加到该控件。请注意,添加静态控件时,您必须将其命名为除IDC_STATIC

接下来,包含头文件XColor static .H在对话框的头文件。然后现在你准备开始使用XColor Static 

用法

BOOL CXColorStaticTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	m_Banner.SetTextColor(RGB(0,0,255), FALSE);
	m_Banner.SetBackgroundColor(RGB(155,115,255), FALSE);
	 m_Banner.SetBold(TRUE, FALSE);
	m_Banner.SetFont(_T("Comic Sans MS"), 20, FALSE);
	
	HICON hIcon = AfxGetApp()->LoadIcon(IDI_SHERLOCK);
	m_Icon.SetIcon(hIcon);
	m_Icon.SetBackgroundColor(RGB(201,201,255), FALSE);
	
	m_Text1.SetWindowText(
		_T("To Sherlock Holmes she is always THE woman.  I have seldom heard ")
		_T("him mention her under any other name.  In his eyes she eclipses ")
		_T("and predominates the whole of her sex.  It was not that he felt ")
		_T("any emotion akin to love for Irene Adler."));
	m_Text1.SetMargins(15, 0);
	m_Text1.SetFont((LPCTSTR)NULL, 10, FALSE);

	m_Text2.SetBold(TRUE, FALSE);
	m_Text2.SetFont(_T("Arial"), 14, FALSE);
	m_Text2.SetWindowText(_T("But wait...  There's MORE!!!"));
	m_Text2.SetMargins(15, 0);

	m_Text3.SetFont((LPCTSTR)NULL, 10, FALSE);
	m_Text3.SetWindowText(
		_T("One night -- it was on the twentieth of March, 1888 -- I was ")
		_T("returning from a journey to a patient (for I had now returned to ")
		_T("civil practice), when my way led me through Baker Street.  As I ")
		_T("passed the well-remembered door, which must always be associated ")
		_T("in my mind with my wooing, and with the dark incidents of the ")
		_T("Study in Scarlet, I was seized with a keen desire to see Holmes ")
		_T("again, and to know how he was employing his extraordinary powers."));
	m_Text3.SetMargins(15, 0);
	m_Text3.SetFont((LPCTSTR)NULL, 10, FALSE);

	m_Text4.SetMargins(15, 0);
	LOGFONT lf;
	CFont *pFont = m_Text4.GetFont();
	pFont->GetLogFont(&lf);
	lf.lfItalic = TRUE;
	_tcscpy(lf.lfFaceName, _T("Verdana"));
	m_Text4.SetFont(&lf, FALSE);

	return TRUE;  // return TRUE  unless you set the focus to a control
}


该软件发布到公共领域。您可以随意使用任何您喜欢的方式。如果您修改它或扩展它,请考虑发布新的代码在这里供大家分享。该软件按“原样”提供,没有明示或默示的保证。对于此软件可能导致的任何损坏或业务损失,我不承担任何责任。

修订记录

版本1.0 - 2003年10月17日

  • 首次公开发布。

评论和讨论

一般 全透明背景 会员 wlburgess 20-Oct-05 6:54 
感谢Hans为优秀的静态框控制。

透明度是我在许多演示类型Dialog Apps中的一个目标。

以前的解决方案有效,但在某些情况下需要太多的背景知识。

这是一个简单的解决方案,让文本画在已经存在的背景上。

要打开“静态”控件的“透明度”,请使用“对话框编辑器”将“透明度”的“扩展样式”复选框设置为“true” - 将“关闭”默认为具有完整背景的常规“不透明”文本。

首先在OnPaint中,成员函数的顶部现在将如下所示:
void CXColorStatic :: OnPaint()

CPaintDC dc(this); //设备上下文绘制

dc.SaveDC(); 

dc.SetTextColor(m_rgbText); 
if(!(GetExStyle()&
WS_EX_TRANSPARENT)) { 
dc.SetBkColor(m_rgbBackground); 
dc.SetBkMode(TRANSPARENT); 

else 

dc.SetBkMode(TRANSPARENT); 

dc.SelectObject(m_pBrush); 

CRect rect; 
GetClientRect(RECT); 

...(其余与以前一样)



第二个设置EraseBackground :
BOOL CXColorStatic :: OnEraseBkgnd(CDC * pDC)

if(!(GetExStyle()&WS_EX_TRANSPARENT))

CRect cr; 
GetClientRect(CR); 
pDC-> FillRect(&cr,m_pBrush); 


return TRUE; //的CStatic :: OnEraseBkgnd(PDC); 



Wayne L. Burgess 


译者见解:

实现透明度以上方法在属性框设置 TRANSPARENT=TRUE,这就需要一个一个控件去修改;如果是动态创建,可以增加WS_EX_TRANSPARENT,

void CXColorStatic::PreSubclassWindow() 
{
TRACE(_T("in CXColorStatic::PreSubclassWindow\n"));
  ModifyStyleEx(0, WS_EX_TRANSPARENT);
// get current font


已修改的源码案例:http://download.csdn.net/detail/greless/9898892

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值