解决光标闪烁问题

本文介绍了在软件开发中遇到的光标闪烁问题及其解决方案。通过重载CWnd::PreCreateWindow函数注册特定的窗口类,并定义及加载多种光标资源,最终通过SetCursor函数根据需要切换光标样式来消除闪烁现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:古典小说网 (gudianxiaoshuo.com)

头条:讨厌编程  、 古典古韵古典小说

作品:快乐课堂软件、任性动图软件、古典小说大全




任性动图V9.0版本发布了,之前面试的时候,向面试官演示过这个软件。

面试官看到的往往是不足,果然,没有问我研究的重点,而是其它没有关注的东西,比如光标闪烁,以前没时间解决,现在,核心的都做完了,于是,就着手解决这个问题。


当时面试官,提出这个问题时,我还真没注意过,就说不知道,没研究过,结果被鄙视了,他说他们可以实现。
好吧,我之前没研究过,不知道为什么,面试的都说找熟练的,我无法熟练,只是有了问题,便去解决这个问题。解决完了,过了一段时间就忘了。

今天,就解决下这个光标闪烁的问题。



为什么会闪烁

原因:鼠标移动过程中,会设置为默认的光标,这样你自己设置的光标,和默认光标来回切换,就造成了闪烁


方法:

1、重载CWnd::PreCreateWindow()函数注册自己的要改变鼠标指针的窗口类。
PreCreateWindow(CREATESTRUCT& cs)
{
// 创建自己的窗口类,窗口不设置光标,以便根据需要进行设置 
if (cs.lpszClass == NULL)
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return CScrollView::PreCreateWindow(cs);
}

2 定义所需的光标

	HCURSOR hCursorArrow;
	HCURSOR hCursorXiGuan;
	HCURSOR hCursorXuanzhuan;
	HCURSOR hCursorShensuo;
	HCURSOR hCursorNS;
	HCURSOR hCursorWE;
	HCURSOR hCursorTuceng;
	HCURSOR hCursorMove;

	HCURSOR hCurrentCursor;   //所用的当前光标


加载光标


LoadCursorEx(){

	hCursorArrow =LoadCursor(NULL, IDC_ARROW);
	hCursorXiGuan = AfxGetApp()->LoadCursor(IDC_XIGUAN);
	hCursorXuanzhuan = AfxGetApp()->LoadCursor(IDC_XUANZHUAN);
	hCursorShensuo = AfxGetApp()->LoadCursor(IDC_SHENSUO);
	hCursorNS = LoadCursor(NULL, IDC_SIZENS);
	hCursorWE = LoadCursor(NULL, IDC_SIZEWE);
	hCursorTuceng = AfxGetApp()->LoadCursor(IDC_TUCENG);
	hCursorMove = AfxGetApp()->LoadCursor(IDC_MOVE);//LoadCursor(NULL, IDC_CROSS);//

}


重载 SetCursor
SetCursor(HCURSOR hc){

	if (hc != hCurrentCursor)
		::SetCursor(hc);

	hCurrentCursor = hc;
}

初始化
OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	//bExit = FALSE;
	LoadCursorEx();

	SetCursor(hCursorArrow);  //加载光标,设置当前光标


在合适的地方,设置为其它光标就可以了

比如,移动时,设置为
SetCursor(hCursorMove);

使用时,要注意,你自己设置的光标不要频繁切换,否则,也会出现闪烁现象。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水迎朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值