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

目录

一、鼠标自动隐藏显示

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 天前
电脑鼠标dpi是什么意思?实用设置教程分享
电脑·鼠标·鼠标dpi
恶猫11 天前
FastGestures v2.2.51 鼠标、触控板、屏手势软件
计算机外设·鼠标·手势·触控板·屏手势·手势操作
骄傲的心别枯萎1 个月前
项目1:FFMPEG推流器讲解(五):FFMPEG时间戳、时间基、时间转换的讲解
ffmpeg·音视频·视频编解码·时间戳·rv1126
pc大老1 个月前
iPhone 用户如何通过鼠标提升操作体验?
计算机外设·iphone·鼠标·鼠标连接iphone
铉铉这波能秀2 个月前
解决Mac电脑连接蓝牙鼠标的延迟问题
macos·计算机外设·鼠标
大白猴3 个月前
大白话解析 Solidity 中的防重放参数
区块链·智能合约·solidity·时间戳·重放攻击·nonce·防重放参数
花落已飘4 个月前
HID协议
usb·鼠标·hid
gis分享者5 个月前
学习threejs,使用TSL计算粒子鼠标特效
threejs·鼠标·粒子·tsl·raycaster
WIZnet5 个月前
第二十八章 RTC——实时时钟
嵌入式硬件·时间戳·wiznet·高性能以太网单片机·w55mh32·rtc实时时钟·时钟分频
shandianchengzi6 个月前
【记录】Windows|竖屏怎么调整分辨率使横竖双屏互动鼠标丝滑
windows·计算机外设·显示器·鼠标·分辨率·双屏