多功能标签CLabelEx

AA雅华士尚品

AA雅华士尚品

2016-01-29 12:07

多功能标签CLabelEx,多功能标签CLabelEx

多功能标签CLabelEx


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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

下载源代码

引言
  做用户界面的时候经常要用到一些静态文本控件,显示一些文字信息,但是 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 paintingdc.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)      
展开更多 50%)
分享

猜你喜欢

多功能标签CLabelEx

C语言教程 C语言函数
多功能标签CLabelEx

VC多功能标签CLabelEx

编程语言 网络编程
VC多功能标签CLabelEx

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

什么是多功能护理床?多功能护理床的功能

收纳技巧 生活常识
什么是多功能护理床?多功能护理床的功能

多功能概念长椅

平面设计 海报设计 广告设计 画报设计 签名设计 服装设计 名片设计 画册设计 版式设计 商标设计
多功能概念长椅

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

多功能懒人小沙发

创意手工
多功能懒人小沙发

多功能书桌的需求

电脑网络
多功能书桌的需求

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

如何使用JSP+MySQL创建留言本(二)

如何使用JSP+MySQL创建留言本(二)

JSP单页面网站文件管理器

JSP单页面网站文件管理器
下拉加载更多内容 ↓