问一个很有深度的问题,关于鼠标指针的绘图区域

FlySoftter 2009-09-10 08:00:47
我做了一个程序,想模拟出一个鼠标指针来显示在右面半个屏幕中,坐标和我左面的实际鼠标一致,于是我使用drawIconEX函数在指定位置画鼠标的指针,却发现鼠标走过的区域没有重绘,造成黑色拖尾,且有些被设置为常驻最表面的窗体也会挡住绘制的鼠标,所以我想问,有没有办法将鼠标的图标画在实际系统鼠标所画的区域呢?
...全文
324 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
副组长 2009-09-15
  • 打赏
  • 举报
回复
将鼠标位置记下来,直接在右屏画不就可以了,擦旧的画新的,就那么一小块,怎么占那么多CPU?
FlySoftter 2009-09-15
  • 打赏
  • 举报
回复
还有一件事,就是我还要在右面桌面上同步写鼠标,我的做法是将鼠标以及桌面先画到一张内存的bmp里面,就是利用CreateCompatibleBitmap创建的bmp内存图,然后再将这张图写到右侧的显示器上,我发现这样做效率慢了很多很多,似乎又回到了原来每一张图都重画的阶段,如果不画鼠标,默认情况下不占用cpu的,画上鼠标,默认情况下都一直会有30%的占用率,头疼啊,唉
FlySoftter 2009-09-15
  • 打赏
  • 举报
回复
能不能再帮我一个忙?我有一个控件,上面画有图案,我想再在上面画鼠标指针,这个鼠标指针是实时跟着我的真实的鼠标指针动的,我用bitblt画过去之后,总是有重影,估计是控件本身没有重画造成,有没有办法解决一下?使鼠标指针显示正常呢?
MoXiaoRab 2009-09-15
  • 打赏
  • 举报
回复
LZ在做什么软件呢?大家来找茬?

那么为什么要涉及到桌面问题呢?
FlySoftter 2009-09-15
  • 打赏
  • 举报
回复
个人感觉是否因为bitblt默认状态下都会判断写过去的图片是否是同一副,如果不是就重绘相关部分,我写鼠标由于不是直接在display1和display2中传递数据,而是由display1设备传递到内存的bitmap,再由内存bitmap传递到display2,这样bitblt内部机制在处理的时候会不一样,很郁闷......
副组长 2009-09-14
  • 打赏
  • 举报
回复
哦?祝贺啦!
直接写在桌面上比写在Form上效率应该还要高才对。用我告诉你那个DC句柄。
FlySoftter 2009-09-14
  • 打赏
  • 举报
回复
恩,好的,谢谢了,我今晚回家试试看双显示器是否能够提高效率,再次谢谢!!!
FlySoftter 2009-09-14
  • 打赏
  • 举报
回复
终于实验通了,确实效率很高,多谢,不过还有一个问题,我的右侧桌面实际上是放了个最大化的Form,我要将左面桌面的图像直接写到这个Form上面,有没有办法让直接写在桌面上和写在Form上效率一样高呢?
副组长 2009-09-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 flysoftter 的回复:]
ok,我先测试一下看看哈,要调API,呵呵,不过不是难题,先谢谢,对了,有什么方法可以判断两幅图像是否重复且只画不重复的部分到B桌面吗?要求效率极高的,呵呵,谢谢啦
[/Quote]
判断两幅图像差异可以用两幅图像逐个像素RGB相减,然后+128,不变的地方都是128,变的地方就是别的值。这在网络传输压缩方面有用。这个在本机上直接的内存传输,有判断那功夫早就传晚了,不但不快反而会变慢。忘了他吧,没用。
FlySoftter 2009-09-14
  • 打赏
  • 举报
回复
ok,我先测试一下看看哈,要调API,呵呵,不过不是难题,先谢谢,对了,有什么方法可以判断两幅图像是否重复且只画不重复的部分到B桌面吗?要求效率极高的,呵呵,谢谢啦
副组长 2009-09-14
  • 打赏
  • 举报
回复
晕死,我可是不懂C#!

速度不用怀疑,扩展桌面有很大开销,直接用桌面DC肯定快很多。用::SetDIBitsToDevice()直接将数据拍上去。

检测重画可是需要自己解决。

DISPLAY_DEVICE结构非常简单的,就几个成员,MSDN有。
FlySoftter 2009-09-14
  • 打赏
  • 举报
回复
另外,这种办法效率确实可以比我原来的快吗?可以自动检测哪些部分不需要画哪些部分需要画吗?
FlySoftter 2009-09-14
  • 打赏
  • 举报
回复
哈,楼上高手,我是用c#进行开发的,不知道您写的那个Display_Device是个什么样子的数据结构啊?如果此问题解决,我绝对不食言,一定给你500分,到时候我开贴你去接分,哈哈
FlySoftter 2009-09-14
  • 打赏
  • 举报
回复
试验过了,使用bitblt进行绘图,效率还是不行,基本没有改善,没有使用您说的SetDIBitsToDevice,请问这个画图api能比bitblt高多少?
副组长 2009-09-13
  • 打赏
  • 举报
回复
哈哈,那我可就笑纳啦~~~~~~~

DISPLAY_DEVICE dd;
dd.cb = sizeof(DISPLAY_DEVICE);

#undef WINVER
#define WINVER 0x0500 //注意版本号500

EnumDisplayDevices(NULL,0,&dd,0); //枚举显示设备的函数
m_hDC = CreateDC(TEXT("DISPLAY"),dd.DeviceName,NULL,NULL);


EnumDisplayDevices()的第二个参数就是显示设备号,0表示主显示设备,1表示第二个...
增加显示卡就增加显示设备,一个卡两个输出接口的也是2个显示设备。。。

m_hDC是桌面的,有了它想怎么画就画吧,效率快多啦!
FlySoftter 2009-09-13
  • 打赏
  • 举报
回复
请问楼上的高手,使用哪个api可以获取第二个显示器的dc呢?有没有一些调用api的例子供我参考下,如果此问题解决了,我给你500分!!!!!
副组长 2009-09-12
  • 打赏
  • 举报
回复
呵呵,没看清你的要求,你是要求同步出现两个鼠标光标,这个在目前是没有解决办法的。还是画吧,这样实现比较方便。
两屏拼一屏你可以不使用屏幕扩展模式,左屏直接抓屏。获得右屏的设备DC,直接覆盖上去。鼠标移动就画光标,屏幕有更新就刷新整个屏幕。使用::SetDIBitsToDevice()能更快一些。
我现在做的是多屏但是多机,一个机器里面就是有多屏也是用一个光标。
FlySoftter 2009-09-12
  • 打赏
  • 举报
回复
楼上的,如何做一个真正的鼠标呢?我目前的要求就是屏幕上要同时在两个区域显示鼠标,左半部份显示真实的鼠标指针,右面半部分显示画出来的鼠标指针,如何做到这个指针不被我其他的写屏操作覆盖掉呢?我目前就是虚拟两个桌面出来,将左面半个屏幕原封不动的复制到有面板个桌面上去,要求带鼠标,且效率要足够高,需要处理双屏3840*1080的分辨率,有高手有很好的解决方法吗?我目前使用bitblt效率还是不够啊
副组长 2009-09-11
  • 打赏
  • 举报
回复
画鼠标的指针? 直接按照你需要的图形做一个真正的鼠标多好,何必费那劲?
dirdirdir3 2009-09-11
  • 打赏
  • 举报
回复
maskblt
加载更多回复(5)

19,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧