由于Duilib的tooltip使用的是系统默认的实现,这里希望他能像普通窗口一样使用xml定制界面,所以决定尝试修改Duilib源码实现这个效果,最终还是做出一个版本。效果图:
1.为CControlUI增加下面4个函数:
virtual void SetUserToolTipXml(LPCTSTR pstrXml);
virtual CDuiString GetUserToolTipXml() const;
virtual void SetToolTipCallBack(IToolTipCallBack* pCallBack);
virtual IToolTipCallBack* GetToolTipCallback() const;
void CControlUI::SetUserToolTipXml(LPCTSTR pstrXml)
{
m_sToolTipXml = pstrXml;
}
CDuiString CControlUI::GetUserToolTipXml() const
{
return m_sToolTipXml;
}
void CControlUI::SetToolTipCallBack(IToolTipCallBack* pCallBack)
{
m_pCallBack = pCallBack;
}
IToolTipCallBack* CControlUI::GetToolTipCallback() const
{
return m_pCallBack;
}
CControlUI::SetAttribute:
else if( _tcscmp(pstrName, _T("usertooltip")) == 0 ) SetUserToolTipXml(pstrValue);
可以对每个控件单独定制tooltip界面,并且使用IToolTipCallBack回调接口实现界面上的文本
2.自绘tooltip类
CustomToolTipWnd.h
#pragma once
namespace DuiLib {
class IToolTipCallBack {
public:
virtual LPCTSTR GetToolTip(CControlUI* pTipOwner, LPCTSTR pstrTipCtrl) = 0;
};
class CCustomToolTipWnd : public CWindowWnd
{
public:
CCustomToolTipWnd(CControlUI* pOwner);
~CCustomToolTipWnd(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;
CControlUI* m_pOwner;
};
}// namespace Duilib
CustomToolTipWnd.cpp