ShowCursor、MouseHover、MouseLeave使用与MFC框架理解

本文介绍了在MFC应用程序中处理ESC键关闭窗口和自定义鼠标行为的问题。作者在尝试实现隐藏光标并用图片替代时,遇到了响应问题。经过探索,发现WndSplitter的子窗口导致了默认View类不再响应,通过在App的PreTranslateMessage中处理ESC键,解决了关闭窗口的问题。然而,使用ShowCursor函数隐藏鼠标效果并不理想,需要通过MouseHover和MouseLeave消息配合TrackMouseEvent函数来实现预期的鼠标进入离开效果。最后,作者通过实践找到了有效的方法,实现了平滑的鼠标隐藏和显示功能。
摘要由CSDN通过智能技术生成

又是在做计算机图形学大作业时遇到的问题,特此记录备忘~
这次想实现的功能是按下ESC键关闭窗口,以及在渲染窗口里隐藏光标,用图片代替光标位置,窗口其他位置显示默认的光标。

实现效果

这是我目前的工程文件,子窗口就是RenderView那个类。

因为搞不懂MFC默认生成的View类和MainFrame类到底管的是窗口的哪部分,所以我打算把鼠标响应和按键的事件加到这两个类试试。加到MainFrm里,调试发现根本就不响应。加到View类里也是如此。在论坛里提问,有人说

“MainFrame的区域只包括那些边边角角的地方,不包括视图、菜单、工具条、状态条等等……”

,所以不应该在MainFrm里面添加。而View类不响应却没人知道为什么。咨询老师之后,老师说可能是不小心删掉了什么默认生成的代码,所以才不响应。于是我新建了一个MFC,什么都不做,只在View类里添加了KEYDOWN的响应,一运行,成功到达断点位置!我那个奇怪啊,我记得我原来的那个程序根本就没动MFC默认生成的代码啊。但是响应成功就是目的,于是我就打算把原来程序的代码移植到新的“干净的”MFC程序内。但是,移植过来以后发现又不响应了。我思考过后认为,应该是wndSplitter划分子窗口时添加了自定义的RenderView类,因此默认的View类就不再响应,感觉像是被“替换”了。那默认的View类又有什么用呢?我想干脆把RenderView类的代码移到默认View类里,然后在wndSplitter的CreateClient里添加默认View类为右子窗口。但是VC给我报了奇怪的错误,定位在默认View里的GetDocument函数那,天知道为什么在那报错……!咨询老师后,老师说

wndSplitter的RUNTIME_CLASS那里添加的类必须是动态的类,而默认生成的View类是静态类,如果想要添加的话,需要在默认View的头文件里添加一行宏:DECLARE_DYNCREATE(CWorldEditorver10View),这样就把默认View类声明为一个动态类。

不过后来我并没有这么做,还是保留了RenderScene类,毕竟在默认生成的View类里加宏感觉还是虚虚的。ESC按键的问题通过论坛高人指点

可以在 App PreTranslateMessage 中截获消息

解决了,方法是类向导->CWorldEditorver10App->虚函数->PreTranslateMessage,添加后这样写:

BOOL CWorldEditorver10App::PreTranslateMessage(MSG* 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值