MFC基本控件使用——静态文本框(Static)

MFC基本控件使用 专栏收录该内容
2 篇文章 0 订阅

众所周知,在MFC应用程序中,静态文本框的使用可以说是必不可少。但是呢,就MFC提供的Static直接使用起来还是有一些小问题的。比如说:

(1)当对话框有背景图片或其他颜色的时候,静态文本框会有很难看的灰色的背景颜色,所以这里存在一个透明的问题;

(2)如何怎么修改静态文本框中文字的颜色、大小、字体等等;

(3)其实静态文本框也可以像按钮一样,Click、MoveOn等等事件可以触发。

下面就一一讲述下怎么实现的。

第一个问题:对静态文本框的背景实现透明处理:

首先,重载对话框的OnCtlColor()函数,也就是负责控件的颜色绘制

然后,如下所示,指定ID相对应的控件的背景模式为透明

HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性
	int n = pWnd->GetDlgCtrlID();
	if (n == IDC_STATIC_XXX)		//这里的ID就是你自己要设置透明的静态文本框ID
	{
		 pDC->SetBkMode(TRANSPARENT);
		 return HBRUSH(GetStockObject(HOLLOW_BRUSH));
	}
	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}

第二个问题:修改静态文本框中文字的颜色、大小、字体:

如果是要修改文字的颜色,那么就如同第一个问题一样,重载OnCtlColor()函数,并在里面修改文字的颜色

HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);


	// TODO:  在此更改 DC 的任何特性
	int n = pWnd->GetDlgCtrlID();
	if (n == IDC_STATIC_XXX)					//这里的ID就是你自己要设置透明的静态文本框ID
	{
		 pDC->SetTextColor(RGB(255, 0, 0));		//这里的RGB(255, 0, 0)就是你自己要设置的字体颜色
		 return HBRUSH(GetStockObject(HOLLOW_BRUSH));
	}
	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}

如果是要修改文字的大小、字体,那么需要分2步

1.在对话框的头文件中,创建CFont m_font,这是对话框的类成员变量;

2.在OnInitDialog()函数中给m_font创建字体,并用静态文本框的控件设置该创建的字体

XXXDlg对话框头文件:

#pragma once

// CXXXDlg 对话框
class CXXXDlg : public CDialogEx
{
// 构造
public:
	CTestDlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
	enum { IDD = IDD_TEST_DIALOG };
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持

// 实现
protected:
	HICON m_hIcon;
	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CFont m_font;				// 待创建的字体
	CStatic m_static_xxx;		// 为静态文本框控件添加的Control类型的变量(注意:最好统一用ClassWizard来给控件添加变量)
};


XXXDlg对话框源文件的OnInitDialog()函数:

BOOL CXXXDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_font.CreatePointFont(100, _T("楷体"), NULL);		// 100即为文字的大小,_T("楷体")即为文字的字体
	m_static_xxx.SetFont(m_font);						// 设置字体
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

第三个问题:怎么给静态文本框添加事件

其实要给静态文本框添加事件很简单。最简单的,例如:添加一个OnClick()消息事件,然后在这个OnClick函数体内写上一句MessageBoxW(_T("XXX"));但是运行后却会现当点击这个静态文本框时,并不会弹出一个带有"XXX"字样的文本框。

这是因为静态文本框默认是不会给父窗口发送消息的,只有在静态文本框的属性中的Notify(通知)改为TRUE,这样再点击静态文本框就会有消息框弹出啦~

当然,还可以自己写一个继承自CStatic的CStaticEx类,在这个里面可以实现更多的消息事件。


总结:好了,到这里静态文本框的最基本的一些使用方法都说了。不过会发现,虽然以上的这些解决方法确实能够实现想要的效果,但是用起来却并不是这么方便。就比如说我想要设置静态文本框中文字的颜色、大小、字体之类的,这些代码都被分散开来。如果是小的MFC工程,那这点当然没有问题,但是当一个比较大的工程,作为开发人员当然想统一处理这些控件的一些属性。所以我觉得很有必要写一个CStaticEx类,将这些功能在这个扩展类中实现,提供一些接口,使开发人员更直接方便的设置静态文本框的属性。

这里,我写了一个比较简单的CStaticEx,可以支持

(1)背景透明;

(2)设置文字的颜色、大小、字体、粗体、斜体、下划线;

(3)修改文字内容(如用上文方法设置背景透明后,修改文字内容会有重影,而此方法不会有重影);

(4)链接效果(鼠标停在控件上,鼠标变成手的形状,并且文字带有下划线);

(5)手型效果(鼠标停在控件上,鼠标变成手的形状);

(6)flash文字效果(根据设定的2种颜色,定时变换文字的颜色,一闪一闪的效果)。

传1张简单的效果图:

https://img-my.csdn.net/uploads/201404/29/1398758165_5931.gif

CStaticEx类下载地址:

http://download.csdn.net/detail/smallstonesk/7278665

  • 3
    点赞
  • 0
    评论
  • 7
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值