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

目录

一、鼠标自动隐藏显示

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;
};
相关推荐
骄傲的心别枯萎5 天前
项目1:FFMPEG推流器讲解(五):FFMPEG时间戳、时间基、时间转换的讲解
ffmpeg·音视频·视频编解码·时间戳·rv1126
pc大老17 天前
iPhone 用户如何通过鼠标提升操作体验?
计算机外设·iphone·鼠标·鼠标连接iphone
铉铉这波能秀2 个月前
解决Mac电脑连接蓝牙鼠标的延迟问题
macos·计算机外设·鼠标
大白猴2 个月前
大白话解析 Solidity 中的防重放参数
区块链·智能合约·solidity·时间戳·重放攻击·nonce·防重放参数
花落已飘3 个月前
HID协议
usb·鼠标·hid
gis分享者4 个月前
学习threejs,使用TSL计算粒子鼠标特效
threejs·鼠标·粒子·tsl·raycaster
WIZnet4 个月前
第二十八章 RTC——实时时钟
嵌入式硬件·时间戳·wiznet·高性能以太网单片机·w55mh32·rtc实时时钟·时钟分频
shandianchengzi5 个月前
【记录】Windows|竖屏怎么调整分辨率使横竖双屏互动鼠标丝滑
windows·计算机外设·显示器·鼠标·分辨率·双屏
LIUAWEIO5 个月前
在线时间戳转换工具
时间戳·在线时间戳转换·在线时间戳转换小工具·在线小工具·时间戳转换
SunkingYang6 个月前
QT中怎么隐藏或显示最大化、最小化、关闭按钮
qt·关闭按钮·隐藏·显示·最大化按钮·最小化按钮