悬浮提示的一种简单实现(CEGUI)

悬浮提示是一种常见的提示,那么界面中的简单悬浮提示(只有文本的)是如何实现的?

下面简单的以CEGUI中的实现加以分析,下面的代码主要截取与设置悬浮提示相关的部分。悬浮提示其实也是一种特殊的界面,因此也派生自CEGUI各种窗口的基类Window类。

CEGUI中的window类继承自属性集和事件集:

class CEGUIEXPORT Window : public PropertySet, public EventSet
{
	//!< 事件相关

	///< 鼠标进入事件
	virtual void onMouseEnters(MouseEventArgs& e);
	///< 鼠标离开事件
	virtual void onMouseLeaves(MouseEventArgs& e);
	///< 鼠标移动事件
	virtual void onMouseMove(MouseEventArgs& e);

	//!< 成员变量相关

	///< 窗口设置的文本
	String d_text;
	///< 窗口悬浮提示的文本
	String d_tooltipText;
	///< 窗口保存的指向悬浮提示的指针
	Tooltip* d_customTip;
}

Tooltip继承自Window类,这样看起来Tooltip也类似成为了Window的一种属性,而通过Window::d_customTip及Tooltip::d_target可以进行方便地修改,Tooltip内部主要实现了设置关联目标窗口及控制显示的接口。

class CEGUIEXPORT Tooltip : public Window
{
	///< 设置/获取目标窗口
	void setTargetWindow(Window* wnd);
	const Window* getTargetWindow();
	///< 重置显示时间
	void resetTimer(void);
	///< 关联的目标窗口
	const Window* d_target;
}

当鼠标进入窗口的有效范围时,会触发Tooltip类中重新定义的onMouseEnters()接口。

void Tooltip::onMouseEnters(MouseEventArgs& e)
{
	///< 计算位置
	positionSelf();
	Window::onMouseEnters(e);
}
可以看出Tooltip只是计算了自身的位置,然后便调用Window类的接口。

void Window::onMouseEnters(MouseEventArgs& e)
{
	///< 设置鼠标图标
	getGUIContext().getMouseCursor().setImage(getMouseCursor());
	///< 获取Window关联的Tooltip
	Tooltip* const tip = getTooltip();
	///< 判断tip是否为空,且tip不是父窗口
	if (tip && !isAncestor(tip))
		tip->setTargetWindow(this);
	///< 触发事件
	fireEvent(EventMouseEntersSurface, e, EventNamespace);
}
这其中调用了Tooltip的接口setTargetWindow():

void Tooltip::setTargetWindow(Window* wnd)
{
	//...
	///< 保存关联的目标窗口
	d_target = wnd;
	///< 设置Tooltip的窗口文本
	setText(wnd->getTooltipText());
	///< 重置显示时间
	resetTimer();
	//...
}

这里要注意一下,setText(wnd->getTooltipText())设置的是Tooltip的成员d_text,而非wnd的成员d_text。在Tooltip的渲染层,悬浮提示文字的尺寸及内容都是通过Tooltip的d_text来获取的。

Tooltip中并没有重新定义onMouseMove()这个接口,所以当鼠标在窗口上移动时,触发的是Window::onMouseMove

void Window::onMouseMove(MouseEventArgs& e)
{
	///< 重新设置显示时间
	Tooltip* const tip = getTooltip();
	if (tip)
		tip->resetTimer();
}
当鼠标离开窗口区域时,会触发OnMouseLeaves()
void Window::onMouseLeaves(MouseEventArgs& e)
{
	const Window* const mw = getGUIContext().getWindowContainingMouse();
	Tooltip* const tip = getTooltip();
	///< 悬浮提示窗口存在且不为包含鼠标的wnd且不是当前窗口的父窗口时,将关联窗口指针置为空
	if (tip && mw != tip && !(mw && mw->isAncestor(tip)))
		tip->setTargetWindow(0);
	///< 触发事件
	fireEvent(EventMouseLeavesSurface, e, EventNamespace);
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值