首页 > 编程语言 >透明信息提示框CFyToolTip设计及源码 适用于各类绘图的实时信息展示

透明信息提示框CFyToolTip设计及源码 适用于各类绘图的实时信息展示

时间:2023-07-09 10:35:13浏览次数:43  
标签:int void CString dc 源码 CFyToolTip 提示框


在图形绘制领域,经常需要用到透明的信息提示窗口,比如当鼠标移动到一个图元上,显示该图元对象的实时数据(如设备名称、状态、实测数据等),当鼠标移开,及时隐藏该提示框;比如在曲线控件绘图时,随着鼠标移动,实时展示曲线对应的横纵坐标值等

透明信息提示框CFyToolTip设计及源码 适用于各类绘图的实时信息展示

 

各种通用开发库里,也有类似的控件,如C# WinForm的ToolTip,1>风格比较厚实,透明度不好,遮挡住了底部的图形;2>Tip窗口显示和隐藏不灵敏,感觉顿挫。浮云绘图将在本文详细设计和实现透明信息提示框CFyToolTip类。

 

一、透明提示框的需求描述

1. 需支持显示和隐藏功能;

2. 需支持设定指定显示位置功能;

3. 需支持设置或动态计算提示框的窗口大小尺寸;

4. 需支持提示框背景色和边框颜色;

5. 需支持提示框文本字体类型和字号设置;

6. 需支持多行信息提示;

7. 需支持每行设置不同的文本内容和字体颜色。

 

二、透明提示框的定义(C++)

根据上文的开发需求和上图的展示效果,相应属性定义如下代码。

显示Tip框方法有4个:

void ShowTips(CPoint& point, CRect& parentRect, CString* vals, int* colors, int count)用于实现上图实时测量多行文本多颜色字体的信息提示,当然也可以用于所有情形信息提示。

void ShowXTips(int xCenter, int yTop, CString strTipsContent)用于实现上图X轴上的居中显示的信息提示框。
void ShowY1Tips(int xRight, int yCenter, CString strTipsContent)用于显示左侧Y轴的信息提示。
void ShowY2Tips(int xLeft, int yCenter, CString strTipsContent)用于显示右侧Y轴的信息提示。

 1 // 作者:浮云绘图,专业付费定制图形编辑器、工控曲线、报表等各类绘图软件
 2 // QQ:316868127
 3 
 4 class CFyToolTip : public CWnd
 5 {
 6 private:
 7     CPoint  m_ptOrg;            //左上角坐标
 8     CSize   m_TipSize;          
 9     CString m_strTips;
10     COLORREF m_clrBack = 0xE0E0E0;
11     COLORREF m_clrText = 0x000000;
12     COLORREF m_clrFrameColor;
13 
14     bool m_bMultLineTip = false;        //多行不同颜色文字Tip模式标记
15     CString* m_values = NULL;           //多行文本
16     int* m_colors = NULL;               //多行字体颜色
17     int m_lineCount = 0;
18 
19     CString m_fontName = "微软雅黑";
20     int m_fontSize = 8;
21 
22     // Construction
23 public:
24     CFyToolTip();
25     virtual ~CFyToolTip();
26 
27 public:
28     BOOL Create(CWnd* pWnd, BYTE bAlpha, DWORD dwStyle= WS_POPUP);    
29 
30     void SetToolTipSize(CSize szSize);
31 
32     void ShowTips(int nX, int nY, CString strTipsContent);
33 
34     void HideTips();
35 
36     void SetBkColor(COLORREF clrBack);
37 
38     void SetTipTextColor(COLORREF clrText);
39 
40     void SetFrameColor(COLORREF clrFrame);
41 
42     void ShowTips(CPoint& point, CRect& parentRect, CString* vals, int* colors, int count);
43 
44     void ShowXTips(int xCenter, int yTop, CString strTipsContent);
45     void ShowY1Tips(int xRight, int yCenter, CString strTipsContent);
46     void ShowY2Tips(int xLeft, int yCenter, CString strTipsContent);
47 
48     int GetTipsTextHeight();
49 
50     void DrawTransparentRect(CDC* dc, CRect* rect);
51 
52 protected:
53     //{{AFX_MSG(CFyToolTip)
54     afx_msg void OnPaint();
55     afx_msg BOOL OnEraseBkgnd(CDC* pDC);
56     //}}AFX_MSG
57     DECLARE_MESSAGE_MAP()
58 };

 

三、透明提示框的实现

请看OnPaint函数,先重绘客户区背景和边框 --> 再画各行文本(文字、字体和颜色)。

每当调用ShowTips函数时,根据传入的显示起点和显示内容,重新计算Tip窗口的大小位置,再调用OnPaint完成重绘。

  1 BOOL CFyToolTip::Create(CWnd* pWnd, BYTE bAlpha, DWORD dwStyle)
  2 {
  3     LPCTSTR lpszClassName = AfxRegisterWndClass(NULL);
  4     BOOL bRet = CreateEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, lpszClassName, _T(""),        //WS_EX_TOOLWINDOW  WS_EX_TOPMOST
  5         dwStyle, 0, 0, 1, 1, pWnd->GetSafeHwnd(), NULL);                                // WS_POPUP WS_CHILD
  6     if (bRet)
  7     {
  8         CSize sz(30,20);
  9         MoveWindow(CRect(m_ptOrg, sz));
 10         m_TipSize = sz;
 11     }
 12 
 13     LONG para = GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE);
 14     para |= WS_EX_LAYERED;
 15     SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, para);
 16     SetLayeredWindowAttributes(RGB(0, 0, 0), bAlpha, LWA_ALPHA);    //LWA_ALPHA 
 17 
 18     m_parent = pWnd;
 19     return bRet;
 20 }
 21 
 22 void CFyToolTip::OnPaint()
 23 {
 24     CPaintDC dc(this); // device context for painting
 25 
 26     // TODO: Add your message handler code here
 27     CRect rtWin;
 28     GetClientRect(rtWin);
 29     dc.FillSolidRect(rtWin, m_clrBack);
 30     dc.SetBkMode(TRANSPARENT);
 31     dc.Draw3dRect(rtWin, m_clrFrameColor, m_clrFrameColor);
 32     
 33     CFont font;
 34     font.CreatePointFont(m_fontSize * 10, m_fontName, NULL);
 35     CFont* pOldFont = dc.SelectObject(&font);
 36 
 37     CRect curLineRect;
 38     if (!m_bMultLineTip)
 39     {
 40         CSize txtSize = dc.GetTextExtent(m_strTips);      // 字串的长度像素
 41         curLineRect.SetRect(rtWin.left + 0, 1, rtWin.right, txtSize.cy);
 42         dc.SetTextColor(m_clrText);
 43         dc.DrawText(m_strTips, rtWin, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
 44     }
 45     else
 46     {
 47         int offsetY = 1;
 48         for (int i = 0; i < m_lineCount; i++)
 49         {
 50             CSize txtSize = dc.GetTextExtent(m_values[i]);      // 字串的长度像素
 51 
 52             dc.SetTextColor(m_colors[i]);
 53             curLineRect.SetRect(rtWin.left + 4, offsetY, rtWin.right, offsetY + txtSize.cy);
 54             dc.DrawText(m_values[i], curLineRect, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
 55 
 56             offsetY += txtSize.cy + 1;
 57         }
 58     }
 59     dc.SelectObject(pOldFont);
 60 }
 61 
 62 
 63 
 64 void CFyToolTip::ShowTips(int nX, int nY, CString strTipsContent)
 65 {
 66     m_bMultLineTip = false;
 67 
 68     
 69     m_strTips = strTipsContent;
 70 
 71     //计算字符串长宽
 72     HDC hDC = ::GetDC(this->m_hWnd);
 73     CDC dc;
 74     dc.Attach(hDC);
 75 
 76     CFont font;
 77     font.CreatePointFont(m_fontSize * 10, m_fontName, NULL);
 78     CFont* pOldFont = dc.SelectObject(&font);
 79     CSize txtSize = dc.GetTextExtent(m_strTips);      // 字串的长度像素
 80     dc.SelectObject(pOldFont);
 81 
 82     //设置窗口位置大小
 83     m_ptOrg = CPoint(nX, nY);
 84     m_TipSize= txtSize;
 85     MoveWindow(nX, nY, m_TipSize.cx, m_TipSize.cy, TRUE);
 86     if (!IsWindowVisible())
 87     {
 88         ShowWindow(SW_SHOW);
 89     }
 90     Invalidate(TRUE);
 91 }
 92 
 93 void CFyToolTip::ShowXTips(int xCenter, int yTop, CString strTipsContent)
 94 {
 95     m_bMultLineTip = false;
 96 
 97     m_strTips = strTipsContent;
 98 
 99     //计算字符串长宽
100     HDC hDC = ::GetDC(this->m_hWnd);
101     CDC dc;
102     dc.Attach(hDC);
103 
104     CFont font;
105     font.CreatePointFont(m_fontSize * 10, m_fontName, NULL);
106     CFont* pOldFont = dc.SelectObject(&font);
107     CSize txtSize = dc.GetTextExtent(m_strTips);      // 字串的长度像素
108     dc.SelectObject(pOldFont);
109 
110     //设置窗口位置大小
111     int nX = xCenter - txtSize.cx / 2;
112     m_ptOrg = CPoint(nX, yTop);
113     m_TipSize = txtSize;
114     MoveWindow(nX, yTop, m_TipSize.cx + 2, m_TipSize.cy, TRUE);
115     if (!IsWindowVisible())
116     {
117         ShowWindow(SW_SHOW);
118     }
119     Invalidate(TRUE);
120 }
121 
122 void CFyToolTip::ShowY1Tips(int xRight, int yCenter, CString strTipsContent)
123 {
124     ......
125 }
126 
127 void CFyToolTip::ShowY2Tips(int xLeft, int yCenter, CString strTipsContent)
128 {
129     ......
130 }
131 
132 void CFyToolTip::ShowTips(CPoint& point, CRect& parentRect, CString* vals, int* colors, int count)
133 {
134     ......
135 }
136 
137 void CFyToolTip::HideTips()
138 {
139     if (IsWindow(m_hWnd))
140     {
141         ShowWindow(SW_HIDE);
142     }
143 }
144 
145 
146 void CFyToolTip::SetBkColor(COLORREF clrBack)
147 {
148     m_clrBack = clrBack;
149 }
150 
151 void CFyToolTip::SetFrameColor(COLORREF clrFrame)
152 {
153     m_clrFrameColor = clrFrame;
154 }
155 
156 void CFyToolTip::SetTipTextColor(COLORREF clrText)
157 {
158     m_clrText = clrText;
159 }
160 .....

 

本文完整了实现了上图展示的3中透明信息提示框,可以满足绝大多数对透明窗口信息提示框的功能要求。如果在某些特性场景下,还需要支持FyTipTool提示框支持鼠标 点击、移动等事件,可以继续扩展。需增加以下事件支持:

	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void onm ouseMove(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void onm ouseLeave();

 

四、CFyToolTip使用示例

 1 //1声明变量,Y轴上左Tip
 2 CFyToolTip* m_y1ToolTip;        
 3 
 4 
 5 //2构造变量,透明度200/255
 6 m_y1ToolTip = new CFyToolTip();
 7 m_y1ToolTip->Create(this, 200);
 8 
 9 
10 //3显示、隐藏提示框
11 if (GetPointInArea(point))
12 {
13     CString syTip = GetYToolTip(point);
14     int y1Right;
15     GetYAxesTipXPos(virpoint, y1Right, y2Left);
16     if (y1Right > 0)
17     {
18         CPoint tmpPt(y1Right, point.y);
19         ClientToScreen(&tmpPt);
20         m_y1ToolTip->ShowY1Tips(tmpPt.x, tmpPt.y, syTip);
21     }
22 }
23 else
24 {
25     m_y1ToolTip->HideTips();
26 }

 


标签:int,void,CString,dc,源码,CFyToolTip,提示框
From: https://www.cnblogs.com/fydraw/p/17538387.html

相关文章

  • 多子曲线的曲线组件源码定制之详细功能需求,适用工控、军工、金融等数据分析领域 浮云E
    ​ 前文已经详细介绍了通用曲线控件源码定制开发从需求到编码实现,具体可参阅 通用曲线控件源码定制之设计实现篇 和 通用曲线控件定制之重点难点篇(附源码),本文由浮云E绘图开启大项目多曲线海量数据的曲线组件分析和实现之路。 一、需求背景在一些工业控制领域,有大量设备采......
  • 通用曲线控件定制之重点难点篇(附源码,功能丰富灵活) 浮云E绘图
    ​ 上篇已经介绍通用曲线控件源码定制之设计实现,详细描述了通用曲线控件的功能部件及其结构关系,并且实现了核心类的源码,本文由浮云E绘图继续介绍通用曲线控件定制开发的重点和难点,并附完整源码。 一.曲线控件源码类使用流程根据上文通用曲线控件源码定制之设计实现篇可知曲......
  • python 下载element源码
    #encoding:utf-8frombs4importBeautifulSoupimportrequests,re,os,socketfromurllibimportrequest#指定要下载的版本element_ui_version="2.15.13"#指定文件要存放的位置element_ui_dir="D:/tmp"save_ui_dir=os.path.join(element_ui_dir,"elem......
  • 分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
    分布式ID的使用场景基于MySql的初步方案第一次优化:Leaf-segment数据库方案第二次优化:Leaf-segment双buffer优化源码解析双buffer优化方案 背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产......
  • 我用numpy实现了GPT-2,GPT-2源码,GPT-2模型加速推理,并且可以在树莓派上运行,读了不少hung
     之前分别用numpy实现了mlp,cnn,lstm和bert模型,这周顺带搞一下GPT-2,纯numpy实现,最重要的是可在树莓派上或其他不能安装pytorch的板子上运行,生成数据gpt-2的mask-multi-headed-self-attention我现在才彻底的明白它是真的牛逼,比bert的multi-headed-self-attention牛的不是一点半点,......
  • 【开源分享】在线客服系统源码,支持发送文本表情,上传图片附件附详细搭建教程
    源码介绍golang开发的单用户在线客服系统,功能非常的简洁实用,没有多余的功能。golang语言可编译为二进制程序,自带守护进程功能,相比于流传最广的PHP客服系统要稳定环境配置服务器:linux或者windows都可以golang运行环境MySQLNginx配置Golang环境Windows系统首先下载golang......
  • Nacos服务发现与注册源码剖析
    为什么要看源码:1、提升技术功底:学习源码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提升自己的技术功底2、深度掌握技术框架:源码看多了,对于一个新技术或框架的掌握速度会有大幅提升,看下框架demo大致就能知道底层的实现,技术框架更新再快也不怕3、快速......
  • 手把手教你自定义自己SpringBoot Starter组件源码剖析
    我们知道SpringBootStarter也就是启动器。是SpringBoot组件化的一大优点。基于这个思想,基于这个思想SpringBoot才变得非常强大,官方给我们提供很多开箱即用的启动器。SpringBootStarter是SpringBoot的一个重要特性,它有以下优点:依赖管理:Starter自动处理项目的依赖关系,......
  • 源码分析 | MySQL测试框架 MTR 系列教程(三):源码篇
    作者:卢文双资深数据库内核研发序言:以前对MySQL测试框架MTR的使用,主要集中于SQL正确性验证。近期由于工作需要,深入了解了MTR的方方面面,发现MTR的能力不仅限于此,还支持单元测试、压力测试、代码覆盖率测试、内存错误检测、线程竞争与死锁等功能,因此,本着分享的精神,将其......
  • 在centos8中源码部署LAMP
    源码部署LAMP一、安装httpd在官网下载安装包http://archive.apache.org/[root@localhost~]#wgethttp://archive.apache.org/dist/apr/apr-1.7.4.tar.gz[root@localhost~]#wgethttp://archive.apache.org/dist/apr/apr-util-1.6.3.tar.gz[root@localhost~]#wgethttp:......