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

原创 2013年12月05日 23:27:24

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

下面简单的以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);
}






版权声明:欢迎转载交流,转载请注明:http://blog.csdn.net/coffeecato

Android 悬浮窗的简单实现

概述 利用WindowManager(窗口管理器)和WindowManager.LayoutParams(参数属性)来实现一个小悬浮窗。 这是效果图: 布局很简单就略了。下面是代码: java源码...
  • sy755754582
  • sy755754582
  • 2017年01月09日 16:25
  • 284

开源CEGUI编辑器之二(MFC重写的ImagesetEditor)

转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) 最近在整理自己几年前一直在研究的一套代码,使用OGRE+CEGUI开发的客户端引擎框架。当年自己倾心研究的...
  • ycg514230
  • ycg514230
  • 2014年11月29日 00:53
  • 2929

【CEGUI】CEGUI入门篇之创建window(四)

以下内容翻译自http://static.cegui.org.uk/docs/0.8.7/window_tutorial.html这里介绍CEGUI window的创建及如何让window在屏幕上显示...
  • iEearth
  • iEearth
  • 2017年04月13日 13:08
  • 786

在windows中,如何实现一个自己的浏览器

首先,标题是吹牛的,与360安全浏览器相比,我这根本就是不入流,好了,废话就不说了,现在就让我们来看看应该如何实现吧      1. 使用的IDE是VS2013.      2. 建立一个win32项...
  • u014660247
  • u014660247
  • 2016年04月15日 03:49
  • 388

CSS3鼠标放上按钮悬浮框提示效果

* { margin: 0px; padding: 0px; }
  • xyc_csdn
  • xyc_csdn
  • 2017年04月04日 20:53
  • 1523

IntelliJ设置鼠标悬浮提示和修改快捷键

IntelliJ设置鼠标悬浮提示和修改快捷键 设置鼠标悬浮提示 修改快捷键 进入设置菜单 删除原来的快捷键(注:你可以选择保留原来的快捷键,同时使用两个...
  • u010596115
  • u010596115
  • 2016年12月06日 13:35
  • 5056

Android越过悬浮窗权限显示悬浮窗

文/Shawon(简书作者) 原地址 http://www.jianshu.com/p/167fd5f47d5c ,经验证,此方法可以越过大多数手机的悬浮球权限。 但是对MIUI8无效,MIU...
  • u014137988
  • u014137988
  • 2016年09月18日 17:39
  • 1539

简单编程(二十一)计数排序法

实现如下的排序算法:有一种简单的排序方法叫计数排序法,这种排序算法对一个待排序的数组进行排序,并将排序结果放到另一个新的数组中。计数排序算法针对待排序数组中的每个数据,扫描待排序的数组一趟,统计待排序...
  • zzc1510334836
  • zzc1510334836
  • 2014年12月16日 16:34
  • 939

初学CEGUI和OGRE

OGRE 3D教程七:CEGUI和OGRE (Ogre1.7.1版本)(zhuan) 简介  (本篇教程对应Ogre1.7.1 + CEGUI 0.7.1)本文的原文地址:...
  • fyk58
  • fyk58
  • 2013年11月07日 20:03
  • 569

第3 章 CEGUI 基类的实现

这一章介绍CEGUI 最基本的窗口类Window。CEGUI 中所有的窗口都必须派生自Win dow(不管直接还是间接)。在介绍Window 类之前,我认为介绍窗口原理比较重要。所以 第1 节介绍...
  • ylioi
  • ylioi
  • 2013年05月28日 13:02
  • 1541
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:悬浮提示的一种简单实现(CEGUI)
举报原因:
原因补充:

(最多只允许输入30个字)