当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 多功能标签CLabelEx

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 多功能标签CLabelEx


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 58 ::
收藏到网摘: n/a

多功能标签CLabelEx


作者:北方工业大学 阙荣文(querw)

下载源代码

引言
  做用户界面的时候经常要用到一些静态文本控件,显示一些文字信息,但是 MFC 提供的 CStatic类的功能过于简单,无法满足高级需求。为此我从 CStatic 派生了一个类 CLabelEx,扩展了CStatic。第一次投稿,水平不足请大家见谅。我从 vckbase.com 学到了很多很多东西 ,该是我回报的时候了。

一、功能简介

新增的功能主要有:

  • 1、设置背景图片SetBGBitmap();设置鼠标经过时的背景图片SetMouseOverBGBitmap();设置鼠标单击后的背景图片SetClickedBGBitmap();
  • 2、设置标签图片,SetLabelBitmap();设置鼠标经过时的标签图片SetMouseOverLabelBitmap();设置鼠标单击时的标签图片
  • 3、文字功能
    • (1)设置字体颜色,下划线等就不说了.
    • (2)感应鼠标经过时自动加上下划线,自动把文字变蓝(就像一个超链接一样)
  • 4、边框和背景
    可以设置/取消边框,指定边框颜色;设置背景色,并填充整个标签
二、实现原理

1、其实就是在OnPaint()里画出各种效果:
void CLabelEx::OnPaint() {	CPaintDC dc(this); // device context for painting	dc.SetTextColor(m_crText);	dc.SetBkMode(TRANSPARENT);	dc.SelectObject(this->GetFont());	///准备工作	CRect rect;	CDC MemDC;	CPen BorderPen,*pOldPen,UnderLinePen;	CBrush BGBrush,*pOldBrush;	BITMAP bm;	int nTextLeft=0,nTextTop=0; //文字输出的位置	this->GetClientRect(&rect);	MemDC.CreateCompatibleDC(&dc);	MemDC.SetMapMode(dc.GetMapMode());	///画边框	if(m_bBorder)	{	BorderPen.CreatePen(PS_SOLID,1,m_crBorder);	BGBrush.CreateSolidBrush(m_crBG);	pOldPen=dc.SelectObject(&BorderPen);	pOldBrush=dc.SelectObject(&BGBrush);	dc.Rectangle(&rect);	dc.SelectObject(pOldPen);	dc.SelectObject(pOldBrush);	rect.DeflateRect(1,1);	}	///贴背景图	if(m_bClicked && m_ClickedBGBm.GetSafeHandle()!=NULL)	{	MemDC.SelectObject(m_ClickedBGBm);	dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),	&MemDC,0,0,SRCCOPY);	}	else if(m_bOver && m_MouseOverBGBm.GetSafeHandle()!=NULL)//鼠标经过的时候	{	MemDC.SelectObject(m_MouseOverBGBm);	dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),	&MemDC,0,0,SRCCOPY);	}	else if(m_BGBm.GetSafeHandle()!=NULL)	{	MemDC.SelectObject(m_BGBm);	dc.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),	&MemDC,0,0,SRCCOPY);	}	///贴标签图片	if(m_bClicked && m_ClickedLabelBm.GetSafeHandle()!=NULL)	{	m_ClickedLabelBm.GetBitmap(&bm);	double fScal=bm.bmWidth*1.0/bm.bmHeight;	nTextLeft=int(rect.Height()*fScal)+4;	MemDC.SelectObject(m_ClickedLabelBm);	dc.StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),	&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);	}	else if(m_bOver && m_MouseOverLabelBm.GetSafeHandle()!=NULL)	{	m_MouseOverLabelBm.GetBitmap(&bm);	double fScal=bm.bmWidth*1.0/bm.bmHeight;	nTextLeft=int(rect.Height()*fScal)+4;	MemDC.SelectObject(m_MouseOverLabelBm);	dc.StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),	&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);	}	else if(m_LabelBm.GetSafeHandle()!=NULL)	{	m_LabelBm.GetBitmap(&bm);	double fScal=bm.bmWidth*1.0/bm.bmHeight;	nTextLeft=int(rect.Height()*fScal)+4;	MemDC.SelectObject(m_LabelBm);	dc.StretchBlt(rect.left,rect.top,int(rect.Height()*fScal),rect.Height(),	&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);	}	else	{	nTextLeft=4;	}	///输出文字	TEXTMETRIC tm;	dc.GetTextMetrics(&tm);	CString strText;	this->GetWindowText(strText);	nTextTop=rect.top+(rect.Height()-tm.tmHeight)/2;	if(strText.GetLength()>0)	{	dc.TextOut(nTextLeft,nTextTop,strText);	}	///画下划线	if(m_bUnderLine)	{	nTextLeft-=2;	nTextTop=nTextTop+tm.tmHeight+1;	UnderLinePen.CreatePen(PS_SOLID,1,m_crUnderLine)