互动直播 之 全屏播放时 鼠标隐藏功能

目录

一、鼠标自动隐藏显示

1、鼠标移动时,记录移到时的时间点,并显示鼠标

2、设置一个重复循环,每秒判断下

3、退出全屏时,结束是否隐藏任务判断


想实现的功能和播放器类似,全屏时,鼠标悬停几秒后,自动隐藏起来。

一、鼠标自动隐藏显示

1、鼠标移动时,记录移到时的时间点,并显示鼠标

cpp 复制代码
		else if (uMsg == WM_MOUSEMOVE)
		{
				if (isFullScreen_)
				{
					mouseKeepStillBeginTime_ = GetCurTimeStamp();
					ShowMyCursor();
					
				}
		}
cpp 复制代码
 int64_t GetCurTimeStamp()
 {
	 timeb time_now;
	 ftime(&time_now); // 秒数
	 int64_t cur_timestamp = time_now.time * 1000 + time_now.millitm; // 毫秒
	 return cur_timestamp;
 }

2、设置一个重复循环,每秒判断下

根据当前的时间和之前移动时记录的时间,判断有无超过指定的秒数,来确定是否隐藏

cpp 复制代码
			mouse_autoHide_timer_.Cancel();
			StdClosure task = [this]() {

				if (pExerciseForm&&IsWindowVisible(pExerciseForm->GetHWND()))
				{
					ShowMyCursor();
				}
				else{
					int64_t now = GetCurTimeStamp();
					int64_t dis = now - mouseKeepStillBeginTime_;

					if (dis > 1000)
					{
						HideMyCursor();
					}
				}

					
			};
			nbase::ThreadManager::PostRepeatedTask(kThreadUI, mouse_autoHide_timer_.ToWeakCallback(task), nbase::TimeDelta::FromMilliseconds(1000));
cpp 复制代码
typedef std::function<void(void)> StdClosure;

3、退出全屏时,结束是否隐藏任务判断

cpp 复制代码
			isFullScreen_ = false;		
			mouse_autoHide_timer_.Cancel();
		
			ShowMyCursor();

如果想了解如何控制的话,可以参考下面代码,我这里直接使用了这种方法

cpp 复制代码
class BASE_EXPORT WeakCallbackFlag final : public SupportWeakCallback
{
public:
	void Cancel()
	{
		m_weakFlag.reset();
	}

	bool HasUsed()
	{
		return m_weakFlag.use_count() != 0;
	}
};
cpp 复制代码
class BASE_EXPORT SupportWeakCallback
{
public:
	virtual ~SupportWeakCallback(){};

	template<typename CallbackType>
	auto ToWeakCallback(const CallbackType& closure)
		->WeakCallback<CallbackType>
	{
		return WeakCallback<CallbackType>(GetWeakFlag(), closure);
	}

	std::weak_ptr<WeakFlag> GetWeakFlag()
	{
		if (m_weakFlag.use_count() == 0) {
			m_weakFlag.reset((WeakFlag*)NULL);
		}
		return m_weakFlag;
	}

private:
	template<typename ReturnValue, typename... Param, typename WeakFlag>
	static std::function<ReturnValue(Param...)> ConvertToWeakCallback(
		const std::function<ReturnValue(Param...)>& callback, std::weak_ptr<WeakFlag> expiredFlag)
	{
		auto weakCallback = [expiredFlag, callback](Param... p) {
			if (!expiredFlag.expired()) {
				return callback(p...);
			}
			return ReturnValue();
		};

		return weakCallback;
	}

protected:
	std::shared_ptr<WeakFlag> m_weakFlag;
};
相关推荐
企鹅侠客16 小时前
鼠标键盘按键统计工具
计算机外设·键盘·鼠标
木梯子4 天前
罗技G系列游戏外设全解析及G304X入门游戏鼠标推荐
计算机外设·鼠标
goodmao6 天前
【macOS】【mouse】设置鼠标大小
macos·计算机外设·鼠标·mouse
2501_947031007 天前
欧盟商标专利注册选哪家
鼠标
雪碧聊技术11 天前
9.大模型如何实现会话记忆隔离?
大模型·时间戳·会话记忆隔离·会话id
一点都不方女士1 个月前
无线鼠标怎么跟电脑连接?蓝牙、2.4G无线鼠标连接步骤+驱动工具
计算机外设·电脑·鼠标·驱动下载·鼠标驱动·无线鼠标驱动·硬件连接
wirepuller_king1 个月前
sweezycursors鼠标光标更换
鼠标
深念Y1 个月前
家电按钮开关失灵,无烙铁更换微动开关
鼠标·家电·维修·微动开关·热水器
zxy28472253012 个月前
解决笔记本电脑进入操作系统黑屏只有鼠标的问题
操作系统·win10·鼠标·黑屏·突然
一个平凡而乐于分享的小比特2 个月前
UCOSIII笔记(十四)时间戳
笔记·时间戳·ucosiii