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

目录

一、鼠标自动隐藏显示

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;
};
相关推荐
沙振宇1 个月前
【Web】使用 Vue3+PlayCanvas 开发 3D 游戏(五)3D 模型鼠标交互控制
3d·vue3·鼠标·playcanvas
深念Y1 个月前
鼠标键盘按键失灵维修 微动和滚轮
计算机外设·键盘·鼠标·电子·维修·电子维修·
王伟19821 个月前
人机交互的6个阶段
人机交互·键盘·鼠标·触摸屏·语音交互
闲人编程2 个月前
时序数据库InfluxDB应用
数据库·struts·时序数据库·innodb·时间戳·存储引擎·时间维度
企鹅侠客2 个月前
鼠标键盘按键统计工具
计算机外设·键盘·鼠标
木梯子2 个月前
罗技G系列游戏外设全解析及G304X入门游戏鼠标推荐
计算机外设·鼠标
goodmao2 个月前
【macOS】【mouse】设置鼠标大小
macos·计算机外设·鼠标·mouse
2501_947031002 个月前
欧盟商标专利注册选哪家
鼠标
雪碧聊技术3 个月前
9.大模型如何实现会话记忆隔离?
大模型·时间戳·会话记忆隔离·会话id
一点都不方女士3 个月前
无线鼠标怎么跟电脑连接?蓝牙、2.4G无线鼠标连接步骤+驱动工具
计算机外设·电脑·鼠标·驱动下载·鼠标驱动·无线鼠标驱动·硬件连接