问题:

DuiLib 默认的控件鼠标提示只支持字符串,在实际工作需要中发现,只是字符串并不够用,在鼠标悬停的提示中想要有图片或者动图或者多文本的信息显示,所以需要增加ToolTip的自定义窗口处理。

解决:

1、增加 UICCustomToolTipUI.h 文件

#pragma oncenamespace DuiLib {/** 自定义鼠标提示回调*/class IToolTipCallBack {public:virtual LPCTSTR GetCustomToolTip(CControlUI* pTipOwner, LPCTSTR pstrTipCtrl) = 0;};/** 自定义鼠标提示*/class CCustomToolTipUI : public CWindowWnd{public:CCustomToolTipUI(CControlUI* pOwner);~CCustomToolTipUI(void);void Init(LPCTSTR pstrXml, IToolTipCallBack* callback);protected:LPCTSTR GetWindowClassName() const;UINT GetClassStyle() const;void OnFinalMessage(HWND hWnd);LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);void Walk(CControlUI* pCtrl);private:CPaintManagerUI m_pm;CDuiString m_sXml;                    //!< 触发鼠标提示的部件对象IToolTipCallBack* m_pCallBack;       //!< tooltip  XML 文件路径CControlUI* m_pOwner;              //!< 通常为主窗口对象};}// namespace Duilib

2、增加 UICCustomToolTipUI.cpp 文件

#include "StdAfx.h"
#include "UICustomToolTipUI.h"namespace DuiLib {CCustomToolTipUI::CCustomToolTipUI(CControlUI* pOwner): m_pOwner(pOwner), m_pCallBack(NULL){}CCustomToolTipUI::~CCustomToolTipUI(void){}LPCTSTR CCustomToolTipUI::GetWindowClassName() const{return TOOLTIPS_CLASS;}UINT CCustomToolTipUI::GetClassStyle() const{return 0;}void CCustomToolTipUI::OnFinalMessage(HWND hWnd){//delete this;}void CCustomToolTipUI::Init(LPCTSTR pstrXml, IToolTipCallBack* callback){ASSERT(pstrXml);m_pCallBack = callback;m_pm.Init(m_hWnd);CDialogBuilder builder;CControlUI* pRoot = builder.Create(pstrXml, (UINT)0, NULL, &m_pm);ASSERT(pRoot && "Failed to parse XML");m_pm.AttachDialog(pRoot);if (m_pCallBack){Walk(pRoot);}}LRESULT CCustomToolTipUI::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam){LRESULT lRes = 0;if (uMsg == WM_DESTROY) {}else if (uMsg == WM_WINDOWPOSCHANGING || uMsg == WM_WINDOWPOSCHANGED) {WINDOWPOS* pos = (WINDOWPOS*)lParam;pos->cx = m_pm.GetInitSize().cx;pos->cy = m_pm.GetInitSize().cy;}else if (uMsg == WM_PAINT || uMsg == WM_ERASEBKGND) {return m_pm.MessageHandler(uMsg, wParam, lParam, lRes);}return CWindowWnd::HandleMessage(uMsg, wParam, lParam);}/*遍历窗口部件,在指定的控件上显示文本*/void CCustomToolTipUI::Walk(CControlUI* pCtrl){if (pCtrl == NULL){return;}IContainerUI* pContainer = static_cast<IContainerUI*>(pCtrl->GetInterface(L"IContainer"));if (pContainer != NULL){for (int i = 0; i < pContainer->GetCount(); ++i){CControlUI* pItem = pContainer->GetItemAt(i);Walk(pItem);}}else{bool bFlag = pCtrl->GetDisplayCustomTTFlag();if (bFlag)pCtrl->SetText(m_pCallBack->GetCustomToolTip(m_pOwner, pCtrl->GetName()));}}}//namespace Duilib

3、在 UIControl.h 中 增加自定义鼠标提示相关变量和接口

//...
// 自定义鼠标提示
virtual void SetUserToolTipXml(LPCTSTR pstrXml);
virtual CDuiString GetUserToolTipXml() const;
virtual void SetToolTipCallBack(IToolTipCallBack* pCallBack);
virtual IToolTipCallBack* GetToolTipCallback() const;
virtual void SetDisplayCustomTT(bool bDisplay);
virtual bool GetDisplayCustomTTFlag() const;
//... // 自定义提示窗口变量
CDuiString m_sToolTipXml;                       //!< tooltip  XML 文件路径
bool m_bDisplayCustomTT;                        //!< 是否在该控件上显示提示文字
IToolTipCallBack* m_pTTCallBack;                //!< 通常为主窗口对象

4、在 UIControl.cpp 中 增加自定义鼠标提示接口实现

void CControlUI::SetUserToolTipXml(LPCTSTR pstrXml)
{m_sToolTipXml = pstrXml;
}CDuiString CControlUI::GetUserToolTipXml() const
{return m_sToolTipXml;
}void CControlUI::SetToolTipCallBack(IToolTipCallBack* pCallBack)
{m_pTTCallBack = pCallBack;
}IToolTipCallBack* CControlUI::GetToolTipCallback() const
{return m_pTTCallBack;
}void CControlUI::SetDisplayCustomTT(bool bDisplay)
{m_bDisplayCustomTT = bDisplay;
}bool CControlUI::GetDisplayCustomTTFlag()const
{return m_bDisplayCustomTT;
}

在 SetAttribute 中 增加:

else if (_tcscmp(pstrName, _T("usertooltipxml")) == 0) SetUserToolTipXml(pstrValue);
else if (_tcscmp(pstrName, _T("displayusertt")) == 0) SetDisplayCustomTT(_tcscmp(pstrValue, _T("true")) == 0);

5、在 UIManger.h 中 增加自定义鼠标提示相关变量和接口回调

// 设置自定义鼠标提示回调
void SetToolTipCallback(IToolTipCallBack* pToolTipCallback);// 自定义鼠标提示
CCustomToolTipUI* m_pCustomToolTipWnd;
IToolTipCallBack* m_pCustToolTipCallback;

6、在 UIManger.cpp 中 增加相关接口处理

void CPaintManagerUI::SetToolTipCallback(IToolTipCallBack* pToolTipCallback)
{if (pToolTipCallback == nullptr)return;m_pCustToolTipCallback = pToolTipCallback;
}

在 MessageHandler 接口 中的 WM_MOUSEHOVER 消息处理中增加:

if( m_hwndTooltip == NULL ) {m_hwndTooltip = ::CreateWindowEx(0, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, m_hWndPaint, NULL, m_hInstance, NULL);::SendMessage(m_hwndTooltip, TTM_ADDTOOL, 0, (LPARAM) &m_ToolTip);::SendMessage(m_hwndTooltip,TTM_SETMAXTIPWIDTH,0, pHover->GetToolTipWidth());::SendMessage(m_hwndTooltip, TTM_SETTOOLINFO, 0, (LPARAM)&m_ToolTip);::SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, TRUE, (LPARAM)&m_ToolTip);
}if (m_pCustomToolTipWnd) {m_pCustomToolTipWnd->Unsubclass();
}if (pHover->GetUserToolTipXml() != L"") {delete m_pCustomToolTipWnd;m_pCustomToolTipWnd = new CCustomToolTipUI(pHover);if (m_pCustomToolTipWnd == nullptr) return 0;if (m_pCustToolTipCallback) pHover->SetToolTipCallBack(m_pCustToolTipCallback);m_pCustomToolTipWnd->Subclass(m_hwndTooltip);m_pCustomToolTipWnd->Init(pHover->GetUserToolTipXml(), pHover->GetToolTipCallback());
}
::SendMessage(m_hwndTooltip, TTM_TRACKPOSITION, 0, (LPARAM)(DWORD)MAKELONG(pt.x, pt.y));

7、在 WindowImplBase.h 中 增加自定义鼠标提示支持

class UILIB_API WindowImplBase: public CWindowWnd, public CNotifyPump, public INotifyUI, public IDialogBuilderCallback, public IToolTipCallBack  //!< 新增的基类
{//.../** 获取指定名称控件的提示信息* param [in] pTipOwner 通常为鼠标Hover对象* param [in] pstrTipCtrl 提示窗口部件名称*/virtual LPCTSTR GetCustomToolTip(DuiLib::CControlUI* pTipOwner, LPCTSTR pstrTipCtrl);//...
};

8、在 WindowImplBase.cpp 中增加自定义鼠标提示支持处理

LRESULT WindowImplBase::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{//...// 支持自定义提示窗口m_pm.SetToolTipCallback(this);//...
}   LPCTSTR WindowImplBase::GetCustomToolTip(DuiLib::CControlUI* pTipOwner, LPCTSTR pstrTipCtrl)
{return _T("");
}

9、在UIlib.h中 增加 新增加的UICustonToolTipUI.h 文件

//...
#include "Control/UICustomToolTipUI.h"
//...

10、在对话框实现文件中 增加 UI文件和代码的处理

void CTestDlg::InitWindow()
{// 关闭按钮增加自定义提示窗口显示DuiLib::CButtonUI* pButtonUI = static_cast<DuiLib::CButtonUI*>(m_pm.FindControl(_T("btn_test")));if (pButtonUI){pButtonUI->SetToolTipCallBack(this);pButtonUI->SetUserToolTipXml(_T("testToolTip.xml"));}
}

鼠标提示窗口UI文件:这里以一个动图为例

<?xml version="1.0" encoding="utf-8"?>
<Window size="30,30" mininfo="30,30" caption="0,0,0,0" sizebox="4,4,4,4" bktrans="false"><HorizontalLayout inset="3,3,3,3"><GifAnim width="20" height="20" resourcetext="true" tooltip="tooltip_downloadting" displayusertt="true" autoplay="true" bkimage="download.gif" /></HorizontalLayout>
</Window>

最后效果图:

OK!搞定!

DuiLib 实现tooltip自定义鼠标提示窗口相关推荐

  1. html海南地图插件,Echarts 地图(map)插件之 鼠标HOVER和tooltip自定义数据

    在项目开发中,有需要用到地图的地方,百度的echarts地图插件就是个不错的选择, 这里总结一下地图自定义鼠标HOVER时的事件和自定义tooltip数据: 一.鼠标HOVER时的事件: 参照官方文档 ...

  2. 稳扎稳打Silverlight(29) - 2.0Tip/Trick之Cookie, 自定义字体, 为程序传递参数, 自定义鼠标右键...

    [索引页] [源码下载] 稳扎稳打Silverlight(29) - 2.0Tip/Trick之Cookie, 自定义字体, 为程序传递参数, 自定义鼠标右键, 程序常用配置参数 作者:webabcd ...

  3. [WPF]自定义鼠标指针

    [WPF]自定义鼠标指针 原文:[WPF]自定义鼠标指针 [WPF]自定义鼠标指针 周银辉 看看WPF Cursor类的两个构造函数吧: public Cursor(Stream cursorStre ...

  4. 【AS3代码】隐藏原有鼠标箭头,并自定义鼠标小箭头

    package {     import flash.display.Sprite;     import flash.events.Event;     import flash.ui.Mouse; ...

  5. Silverlight 自定义鼠标

    在现在的Silverlight项目中,客户要求鼠标在可拖动面板上时为手形,拖动时为抓形.无奈Silverlight还不支持这个,只能自动动手做了. 自定义鼠标的思路就是把原始鼠标隐藏,然后做一个图片, ...

  6. [转]C# winForm 自定义鼠标样式的两种方法

    本文转自:http://www.cnblogs.com/hzbzxm/archive/2008/09/15/1291104.html 以前试过在WinForm中自定义鼠标样式,结果显示出来的鼠标变成单 ...

  7. 【动画技巧】在Flash中自定义鼠标外观

    在Flash中实现自定义鼠标外观非常简单,可以直接通过一个MovieClip就实现了,新建一个Flash程序,然后添加一个影片剪辑原件,如下图示. 在这个新建的Flash元件里,可以通过绘图工具绘制或 ...

  8. Arcgis for javascript不同的状态下自定义鼠标样式

    俗话说:爱美之心,人皆有之.是的,没错,即使我只是一个做地图的,我也希望自己的地图看起来好看一点.在本文,给大家讲讲在Arcgis for javascript下如何自定义鼠标样式. 首先,说几个状态 ...

  9. 自定义鼠标指针轨迹_win10鼠标自定义颜色,鼠标属性设置,这样就不眯眼了

    电脑用多了,眼睛受不了,这时候就需要各种护眼模式,把画面放大,指针放大,来解决眼睛盯着电脑累的问题了,一不留神发现鼠标指针变大好处多多,下面设置一下win10系统鼠标指针大小.颜色都是默认设置好的,除 ...

最新文章

  1. 服务器修改mime类型,服务器上设置mime类型
  2. gcc 编译器常用的命令行参数一览
  3. Spring中对于WebApplicationInitializer的理解
  4. python鸢尾花数据集聚类_R语言鸢尾花iris数据集的层次聚类分析
  5. bzero, memset ,setmem 区别【转】
  6. SpringMVC学习笔记(二)常用注解
  7. linux防火墙的复规则,Centos下iptables防火墙规则编辑方法 - YangJunwei
  8. linux下用gtk+写比赛赌博GUI小游戏
  9. (56)FPGA条件选择有优先级(case)
  10. 【干货】从0到1打造企业数字化运营闭环白皮书.pdf(附下载链接)
  11. 使用hexo搭建github个人博客网站
  12. ApacheHttpServer出现启动报错:the requested operation has failed解决办法
  13. HTML iframe标签下 子页面调用父页面js 容易产生的跨域调用问题 Uncaught DOMException
  14. html5查看ies文件,5千+ IES光域网文件 5312 IES Files + IES 预览
  15. 【华为云技术分享】快速搭建网站之云速建站
  16. 银河麒麟高级服务器操作系统 V10 版本安装教程
  17. 自己想要什么 过什么样的生活
  18. MacOS苹果系统下Chrome谷歌浏览器缓存目录
  19. linux mtd 块设备,Linux系统中/dev/mtd与/dev/mtdblock的区别,即MTD字符设备和块设备的区别...
  20. 自然语言处理(5)——语言模型

热门文章

  1. 全球钓鱼网站数量激增,交易、金融证券等行业成“重灾区”
  2. 【lua】Aegisub的核心API解读
  3. 计算机的硬件系统的组成
  4. Python 后台基于 PackerNg 格式动态生成 APK 渠道包
  5. 千万要找一个程序员谈恋爱!
  6. 一种防山火在线监测装置
  7. iOS7最佳实践:一个天气App案例
  8. 「镁客·请讲」脑穿越黄庄:过分乐观和激情之后,行业需要找到VR不可替代之处...
  9. java 工具类命名_16种java工具类
  10. 在股票技术指标里,EMA和SMA 的区别