MFC 可以设置背景色、字体、字体颜色、透明背景的 Static 静态文本控件
MFC库里没有符合这个条件的控件,于是我自己写了一个,初步测试有效。
注:可以设置透明背景,但还不能做到透明度设置(如50%透明度)
如果设置了背景色,就不保留透明背景
默认背景色是透明的
- // 设置背景色(若clr为CLR_NONE,则背景透明)
- void SetBackgroundColor(COLORREF clr){m_clrBackground = clr;}
- // 设置文字前景色
- void SetTextColor(COLORREF clr){m_clrText = clr;}
- // 设置文字字体
- void SetFont(CString strFaceName, LONG nHeight);
如何使用:
1.先将RichStatic.h和RichStatic.cpp添加入工程
2.对话框添加Static控件后,增加一个控件变量,类型设置为CRichStatic(或手动添加,在对话框类DoDataExchange中添加DDX_Control)
源码:
- #pragma once
- // CRichStatic
- class CRichStatic : public CStatic
- {
- DECLARE_DYNAMIC(CRichStatic)
- public:
- CRichStatic();
- virtual ~CRichStatic();
- protected:
- afx_msg BOOL OnEraseBkgnd(CDC* pDC);
- afx_msg LRESULT OnSetText(WPARAM,LPARAM);
- DECLARE_MESSAGE_MAP()
- virtual void PreSubclassWindow();
- private:
- COLORREF m_clrText; // 文字前景色
- COLORREF m_clrBackground; // 文字背景色
- CFont *m_pTextFont; // 文字字体
- CBitmap m_Bmp; // 保存背景用的位图对象
- public:
- // 设置背景色(若clr为CLR_NONE,则背景透明)
- void SetBackgroundColor(COLORREF clr){m_clrBackground = clr;}
- // 设置文字前景色
- void SetTextColor(COLORREF clr){m_clrText = clr;}
- // 设置文字字体
- void SetFont(CString strFaceName, LONG nHeight);
- public:
- virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);
- };
- // RichStatic.cpp : 实现文件
- //
- #include "stdafx.h"
- #include "RichStatic.h"
- // CRichStatic
- IMPLEMENT_DYNAMIC(CRichStatic, CStatic)
- CRichStatic::CRichStatic():
- m_clrText(0), m_clrBackground(CLR_NONE), m_hFont(NULL), m_selfCreated(FALSE),
- m_xAlignment(X_LEFT), m_yAlignment(Y_TOP)
- {
- }
- CRichStatic::~CRichStatic()
- {
- if (m_selfCreated && m_hFont != NULL)
- {
- DeleteObject(m_hFont); // 若字体对象为对象自己创建并且不为NULL,则销毁掉以释放内核对象
- }
- }
- BEGIN_MESSAGE_MAP(CRichStatic, CStatic)
- ON_MESSAGE(WM_SETTEXT,OnSetText)
- ON_WM_ERASEBKGND()
- END_MESSAGE_MAP()
- // CRichStatic 消息处理程序
- void CRichStatic::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
- {
- if (m_clrBackground != CLR_NONE) // 若背景色不为CLR_NONE(CLR_NONE表示无背景色),则绘制背景
- {
- RECT rect;
- GetWindowRect(&rect);
- CBrush brush;
- brush.CreateSolidBrush(m_clrBackground);
- ::SelectObject(lpDrawItemStruct->hDC, brush.m_hObject); // 设置画刷颜色
- ::SelectObject(lpDrawItemStruct->hDC, GetStockObject(NULL_PEN)); // 设置笔为空笔(不绘制边界)
- Rectangle(lpDrawItemStruct->hDC, 0, 0,rect.right - rect.left, rect.bottom - rect.top);
- }
- CString strCaption; // 标题文字
- GetWindowText(strCaption);
- if (m_hFont != NULL)
- {
- ::SelectObject(lpDrawItemStruct->hDC, m_hFont);
- }
- // 计算输出字串的横纵坐标
- int x = 0, y = 0;
- if (X_LEFT != m_xAlignment || Y_TOP != m_yAlignment) // 不是左对齐或不是顶对齐
- {
- CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
- CRect crect;
- GetWindowRect(&crect);
- CSize size = pDC->GetTextExtent(strCaption);
- if (X_RIGHT == m_xAlignment) // 右对齐
- {
- x = crect.Width() - size.cx;
- }
- else if (X_CENTER == m_xAlignment) // X居中对齐
- {
- x = (crect.Width()- size.cx) / 2;
- }
- if (Y_BOTTOM == m_yAlignment) // 顶对齐
- {
- y = crect.Height() - size.cy;
- }
- else if (Y_CENTER == m_yAlignment) // Y居中对齐
- {
- y = (crect.Height() - size.cy) / 2;
- }
- }
- // 设置dc字串颜色
- ::SetTextColor(lpDrawItemStruct->hDC, m_clrText);
- TextOut(lpDrawItemStruct->hDC, x, y, strCaption, strCaption.GetLength());
- }
- void CRichStatic::PreSubclassWindow()
- {
- CStatic::PreSubclassWindow();
- ModifyStyle(0, SS_OWNERDRAW);
- }
- void CRichStatic::SetFont(CString strFaceName, LONG nHeight)
- {
- if (m_selfCreated && m_hFont != NULL)
- {
- DeleteObject(m_hFont); // 若字体对象为对象自己创建并且不为NULL,则销毁掉以释放内核对象
- }
- CFont cfont;
- LOGFONT lf;
- memset(&lf, 0, sizeof lf); // 清空LOGFONT结构体,之后对其赋值
- lf.lfHeight = nHeight;
- _tcscpy_s(lf.lfFaceName, strFaceName.GetBuffer()); // 将字体名拷贝到LOGFONT结构体中
- VERIFY(cfont.CreateFontIndirect(&lf)); // 创建新的字体
- m_hFont = (HFONT)cfont.m_hObject;
- m_selfCreated = TRUE; // 标记字体为自己创建的
- }
- void CRichStatic::SetFont(HFONT hFont)
- {
- if (m_selfCreated && m_hFont != NULL)
- {
- DeleteObject(m_hFont); // 若字体对象为对象自己创建并且不为NULL,则销毁掉以释放内核对象
- }
- m_hFont = hFont;
- m_selfCreated = FALSE; // 标记字体非自己创建
- }
- void CRichStatic::SetFont(const CFont *pFont)
- {
- if (m_selfCreated && m_hFont != NULL)
- {
- DeleteObject(m_hFont); // 若字体对象为对象自己创建并且不为NULL,则销毁掉以释放内核对象
- }
- m_hFont = (HFONT)pFont->m_hObject;
- m_selfCreated = FALSE; // 标记字体非自己创建
- }
- BOOL CRichStatic::OnEraseBkgnd(CDC* pDC)
- {
- // 当背景色为透明时,需要保存与拷贝显示主框的显示区域
- if (m_clrBackground == CLR_NONE)
- {
- if (m_Bmp.GetSafeHandle() == NULL)
- {
- CRect Rect;
- GetWindowRect(&Rect);
- CWnd *pParent = GetParent();
- ASSERT(pParent);
- pParent->ScreenToClient(&Rect); // 将坐标转换为与主对话框相对应
- // 拷贝对应区域主框显示的内容
- CDC *pDC = pParent->GetDC();
- CDC MemDC;
- MemDC.CreateCompatibleDC(pDC);
- m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
- CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
- MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY);
- MemDC.SelectObject(pOldBmp);
- MemDC.DeleteDC(); // 删除内存DC,否则内存泄漏
- pParent->ReleaseDC(pDC);
- }
- else // 将主框显示的内容拷贝回去
- {
- CRect Rect;
- GetClientRect(Rect);
- CDC MemDC;
- MemDC.CreateCompatibleDC(pDC);
- CBitmap *pOldBmp = MemDC.SelectObject(&m_Bmp);
- pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);
- MemDC.SelectObject(pOldBmp);
- MemDC.DeleteDC(); // 删除内存DC,否则内存泄漏
- }
- }
- return TRUE;
- }
- LRESULT CRichStatic::OnSetText(WPARAM wParam,LPARAM lParam)
- {
- LRESULT Result = Default();
- Invalidate();
- UpdateWindow();
- return Result;
- }
MFC 可以设置背景色、字体、字体颜色、透明背景的 Static 静态文本控件的更多相关文章
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文: http://blog.csdn.net/supermanking/article/detail ...
- 让图片适合在静态文本控件窗口大小 MFC
1.加入 IDC_STATIC1 静态文本控件. 2.为文本控件添加 STATIC 型变量 3.在OnInitDialog函数中添加以下代码 //设置该静态控件为显示位图的 m_bitmap.Modi ...
- VS2010,MFC动态按钮和窗体背景图片,以及是静态文字控件透明,并避免静态文字刷新出现的重叠问题
1.动态按钮的四种动作 1)正常 2)按下 3)滑过 4)失效 在MFC中,4个动作对应着四种位图bmp, 首先,将代表四种状态的位图加载入资源中,将对应的按钮设置为BitmapButton 第二,在 ...
- ASP.Net ListBox DropdownList 不同条目设置背景色和字体颜色( 转· 载 )
ASP.Net ListBox DropdownList 不同条目设置背景色和字体颜色 2009-09-30 来自:真有意思 [ZU14.CN] 字体大小:[大 中 小] 摘要:在HTML展现页面 ...
- WPF通过不透明蒙板切割显示子控件
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Backspace110/article/ ...
- PNG透明窗体全攻略(控件不透明)
http://blog.csdn.net/riklin/article/details/4417247 看好了,这是XP系统,未装.net.我的Photoshop学的不太好,把玻璃片弄的太透了些,如果 ...
- 一个字体,大小,颜色可定义的自绘静态框控件-XColorStatic 类(比较好看,一共19篇自绘文章)
翻译来源:https://www.codeproject.com/Articles/5242/XColorStatic-a-colorizing-static-control XColor Stati ...
- 窗体透明,但窗体上的控件不透明(简单好用)good
1.在Delphi中,设置窗体的AlphaBlend := true;AlphaBlendValue := 0-255; AlphaBlendValue越小窗体的透明度就越高.这种方法将会使窗体和窗体 ...
- (Winform)控件中添加GIF图片以及运用双缓冲使其不闪烁以及背景是gif时使控件(如panel)变透明
Image img = Image.FromFile(@"C:\Users\joeymary\Desktop\3.gif"); pictureBox1.Image =img.Clo ...
随机推荐
- for之Python vs C#
class test(object): def rangetest(self): for i in range(2,0,-1): print i print i i=2 while i>0: p ...
- 下载PHPDroid: 基于WebView和PHP内置HTTP服务器开发Android应用
基于Android上的PHP(比如我打包的PHPDroid),寥寥几行PHP代码,就能实现一个支持无线局域网用浏览器访问的Android手机的Shell,用于执行命令和PHP代码. 个人在 ...
- 稀疏图(邻接链表),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)
全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...
- C99新特性
c99标准允许使用变长数组,变的意思是可以根据变量的值来指定数组的维数,如根据用户的输入值指定数组的大小,印象中以前是不可以的.现在在gcc中是可以的(PS:ansi c标准是C90标准): ==== ...
- oc对象互相引用内存释放解决方案
1.ARC 一端用strong,一端用weak 2.非ARC 一端用retain,一端用assign
- Oracle EBS-SQL (PO-5):采购订单控制信息查询.sql
select distinct pla.po_header_id, --pha.type_lookup_code, pha.segment1 采购订单号, appf.full_name ...
- C语言入门(16)——C语言的数组
和结构体类似,数组也是一种复合数据类型,它由一系列相同类型的元素组成.C语言支持一维数组和多维数组.如果一个数组的所有元素都不是数组,那么该数组称为一维数组. 一维数组的定义方式 在C语言中使用数组必 ...
- 远程监控 – 应用程序运行状况测量 CSF 博客
在远程监控基础知识和故障排除中,我们探讨了 Windows Azure 平台提供的基础指标.信息源.工具和脚本,介绍了有关监控和应用程序运行状况的基本原则.我们演示了如何利用这些基本原则对在 Wind ...
- Spring、AOP详解
如何配置AOP查看:Spring.Hello AOP 1.对于拦截规则@Pointcut的介绍: @Pointcut("execution (* cn.raffaello.service.. ...
- 关于在用Swift开发iOS时如何隐藏NavigationBar和TabBar
举个例子:如果我有一个页面需要进入时同时隐藏NavigationBar和TabBar,那么我就在那个页面的ViewController的代码里加上下面的代码.就可以实现了.接下来告诉大家每一块要注意的 ...