光标闪烁问题的解决办法

在调用Windows API函数SetCursor设置光标时,可能会碰到闪烁的问题:移动鼠标,光标在Class Cursor(即注册窗口类时指定的Cursor)与预设Cursor之间闪烁。

在MSDN上有关SetCursor函数的备注中强调,如果Class Cursor非空,那么每当鼠标移动,系统都会把光标恢复为Class Cursor。为了避免光标闪烁这一问题,必须处理WM_SETCURSOR消息。(MSDN说明)

下面是一个例子:程序在主窗口视图的中间位置绘制RGB条带,当鼠标移动在条带范围就将光标设置成为Cross,此外根据光标的位置,在RGB条带上方30px处显示所处条带的颜色。程序运行起来像这样:

如果在WM_MOUSEMOVE的消息处理中判断光标的位置并设置光标的话,就会碰到所说的光标闪烁问题。WM_MOUSEMOVE的消息处理如下代码所示:

	LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/){POINT ptCursor = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };RECT rect, rectText;get_rects(&rect, &rectText);InvalidateRect(&rectText);UpdateWindow();if (::PtInRect(&rect, ptCursor)) {::SetCursor(m_cursor);int dx = (rect.right - rect.left) / 3;LPTSTR ppsz[] = { _T("Red"), _T("Green"), _T("Blue") };int index;if (ptCursor.x - rect.left < dx)index = 0;else if (ptCursor.x - rect.left < 2 * dx)index = 1;else index = 2;WTL::CString str;str.Format(_T("Cursor on %s part"), ppsz[index]);CClientDC dc(m_hWnd);dc.DrawText(str, -1, &rectText, DT_CENTER | DT_VCENTER);}else ::SetCursor(CCursor().LoadSysCursor(IDC_ARROW));return 0;}

闪烁产生的原因在于每次进入OnMouseMove之前,系统都会先将光标恢复成Arrow,进入OnMouseMove之后,如果光标处在RGB条带范围内则立即被设置成Cross。

解决办法就是将上面的判断逻辑放在WM_SETCURSOR的消息处理中,当然获得光标客户坐标的方式不同,代码如下所示:

	LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/){POINT point;::GetCursorPos(&point);ScreenToClient(&point);set_cursor(point);return 0;}

而代码中的set_cursor私有方法其实就是上面的判断逻辑,即:

	// ptCursor: in client coordinatevoid set_cursor(POINT& ptCursor) throw(){RECT rect, rectText;get_rects(&rect, &rectText);InvalidateRect(&rectText);UpdateWindow();if (::PtInRect(&rect, ptCursor)) {::SetCursor(m_cursor);int dx = (rect.right - rect.left) / 3;LPTSTR ppsz[] = { _T("Red"), _T("Green"), _T("Blue") };int index;if (ptCursor.x - rect.left < dx)index = 0;else if (ptCursor.x - rect.left < 2 * dx)index = 1;else index = 2;WTL::CString str;str.Format(_T("Cursor on %s part"), ppsz[index]);CClientDC dc(m_hWnd);dc.DrawText(str, -1, &rectText, DT_CENTER | DT_VCENTER);}else ::SetCursor(CCursor().LoadSysCursor(IDC_ARROW));}

这样就解决了光标闪烁的问题。本例的工程文件可在这里下载,它是基于WTL的SDI程序。

P.S. 另外一个问题虽然简单但仍值得一提。上面程序的截图显示的结果实际上并不准确,Cross光标的中心已经处于Green条带,但条带上方显示的却是"Cursor on Red part"。造成此问题的原因是自定义光标的热点Hot Spot默认值为(0, 0),而不是以中心+来标识的。解决办法是在VS资源编辑器中使用Hot Spot Tool,如下图所示:

点击Cross光标的中心点,热点坐标将变成你所设置的值,如下图所示:

转载于:https://www.cnblogs.com/dyllove98/p/3172139.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频编解码基础

文章目录前戏编解码技术流程主流视频编码标准视频传输面临的问题视频传输差错控制视频传输Qos质量保证参数人类视觉系统HVS 以及相应编码措施正餐编码层次与码流结构PB帧编码IBBP序列编码结构图像编码结构条带编码结构宏块编码结构块编码结构预测技术码率控制实例H264前戏 编解…

XShell 屏幕锁定的恢复方法(Ctrl+Q)

操作XShell过程中很多时间大家会习惯性的按CtrlS进行保存. CtrlS在XShell的作用是屏幕锁定&#xff0c;很多朋友会无法操作&#xff0c;会直接把窗口关闭。 解决方法: 快捷键 CtrlQ 即能完成解锁!转载于:https://www.cnblogs.com/liangle/p/3173475.html

adb端口被占用

程序不能执行&#xff0c;kill掉任务管理器里面adb服务&#xff0c;重新连接设备仍然有错 查到可能是adb端口被占用 查看adb用的是哪个端口&#xff1a;C:\Users\wanglin>adb nodaemon server 查看谁占用了这个端口&#xff1a;C:\Users\wanglin>netstat -ano | findstr …

实时语音通讯丢包补偿技术

文章目录基于发送端丢包补偿技术原理与媒体无关的前向差错纠正媒体相关前向差错纠正交织技术基于接受端丢包补偿技术基于插入方法基于插值方法基于重构的方法应用建议非交互式交互式拓展阅读参考丢包补偿技术可以分为两类&#xff1a;基于发送端补偿、基于接受端补偿 基于发送…

取得裝置可以顯示頁面的寬度

利用html中的div元素取得<div id"divGetWidth" width100%></div>Jquery:var width$(#divGetWidth).width(); //获取元素宽度 Javascript:var objdocument.getElementById(divGetWidth);var width obj.offsetWidth转载于:https://www.cnblogs.…

Xcode添加静态库以及编译选项配置常见问题

本文转载至 http://www.cnblogs.com/Quains/archive/2013/08/22/3276425.html 一,Xcode编译出现Link错误,出现"duplicate symbols for architecture i386 clang"提示.问题:链接时,项目有重名文件.解决:根据错误提示,做如下检查:1.Taraget->Build Settings->Li…

关于并发概念的一些笔记

目录1、基于锁的并发数据结构1、并发计数器2、懒惰计数器3、并发链表4、并发队列5、并发散列表总结2、条件变量使用&#xff08;POSIX&#xff09;生产者/消费者 &#xff08;有界缓冲区问题&#xff09;覆盖条件扩展3、信号量使用二值信号量&#xff08;锁&#xff09;0值信号…

MYSQL常见出错代码 mysql error number

1016错误&#xff1a;文件无法打开&#xff0c;使用后台修复或者使用phpmyadmin进行修复。1044错误&#xff1a;数据库用户权限不足&#xff0c;请联系空间商解决1045错误&#xff1a;数据库服务器/数据库用户名/数据库名/数据库密码错误&#xff0c;请联系空间商检查帐户。105…

建立apk定时自动打包系统第三篇——代码自动更新、APP自动打包系统

我们的思路是每天下班后团队各成员在指定的时间&#xff08;例如下午18:30&#xff09;之前把各自的代码上传到SVN&#xff0c;然后服务器在指定的时间&#xff08;例如下午18:30&#xff09;更新代码、执行ant 打包命令、最后将apk包存放在指定目录&#xff08;或者上传指定ft…

对于线程并发模型与事件并发模型的思考

这里将以对话的形式进行&#xff1a; A&#xff1a; 普通的线程是可以被其他线程中断掉的&#xff0c;而基于select、epoll的事件处理函数实际上是不可以被其他事件&#xff08;线程&#xff09;中断的。 我这个理解对吗&#xff1f; B&#xff1a; 图片里的应该是对是否…

Cache 总结

这一文&#xff0c;让我们分析一下&#xff0c;《浅谈 Cache》 一文中的奇怪现象&#xff0c;事实上如今来看也并不奇怪了。在什么情况下 r1 和 r2 都为 0 呢&#xff1f;细致看代码&#xff0c;你会发现&#xff0c;两个线程分别被执行在不同的 CPU 核上&#xff0c;而且在线程…

c/c++常见类型转换错误

文章目录char转int 高位符号扩展有符号int与无符号int比较关于一个bit的位域变量的取值范围临时变量溢出size_t死循环char转int 高位符号扩展 int main() {char a 0x9A;int util;util (int)a;cout << a << endl;cout << util << endl;if (util >…

Javascript 装载和执行

一两个月前在淘宝内网里看到一个优化Javascript代码的竞赛&#xff0c;发现有不少的人对Javascript的执行和装载的基础并不懂&#xff0c;所以&#xff0c;从那天起我就想写一篇文章&#xff0c;但一直耽搁了。 首先&#xff0c;我想说一下Javascript的装载和执行。通常来说&am…

java sundry tips

1.关于Arrays 记得binarySearch方法返回的int 类型的数值的含义。 If the array contains multiple elements with the specified value, there is no guarantee which one will be found. 而且当查找数小于数组中任何一个数时返回-1 &#xff0c;当查找数大于数组中任何…

c++常见的10个类对象问题

文章目录1、对象的浅复制2、构造函数中的操作符重载3、拷贝构造函数不能模板化4、析构函数未捕获异常导致coredump5、构造函数抛出异常6、基类析构函数非虚导致内存泄漏7、删除void*指针引发内存泄露8、成员函数尾部缺失const9、使用memset初始化class10、对象向下转换失败1、对…

Ubuntu 14.10 -- 异次元软件世界

Ubuntu 14.10 中文桌面版/服务器正式版下载 - 华丽免费易于入门的 Linux 操作系统 [ 系统工具 - Linux // 2014-10-25 ]一说到 Linux&#xff0c;就不得不提目前最红火的 Ubuntu 发行版了&#xff01;它拥有绚丽的界面&#xff0c;甚至跟以时尚为卖点的 Mac OSX 相比也有过之而…

maven 概念

这里maven倡导约定优于配置&#xff0c;maven的约定就是以下目录结构src/main/java 下存放java类src/main/webapp 下存放页面文件(需要手动创建)src/main/resources 下存放资源文件src/test/java 下存放单元测试代码src/test/resources 下存放测试资源文件 Maven运行的生命周期…

System Design笔记:在线售票系统设计

文章目录何为在线售票系统&#xff1f;系统目标和要求1、功能要求2、非功能性需求3、设计注意事项4、容量估算5、系统API1.SearchMovies2.ReserveSeats6、数据库设计7、高级设计8、细节模块设计9、流程服务器如何跟踪所有尚未预订的active预订&#xff1f;服务器如何跟踪所有等…

Response.Write具体介绍

问题一&#xff1a; Response.Write 后连接Response.Redirect &#xff0c;则Response.Write无法显示&#xff0c;直接跳转入Response.Redirect 的页面。 解决方案&#xff1a; Response.Write("<script langugejavascript>alert(成功改动); window.location.hrefin…

SharePoint通过IP地址访问

问题&#xff1a;SP站点通过计算机名称可以访问&#xff0c;但不能通过IP地址访问 解决方案&#xff1a;打开SharePoint2010管理中心》应用程序管理》配置备用访问映射》编辑公用 URL 备用访问映射集&#xff1a;选择要映射的网站集 默认:http://计算机名 Intranet &#xff1a…