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