MFC视图窗口:CView类 显示数据/画面
我们之前的绘图消息,都是在框架类上画出来的
视图窗口就覆盖在框架窗口上
视图窗口本质上也是窗口,只是和框架窗口风格不同
CView类也继承于CWnd类
CView也能处理消息,因为它继承于CWnd类
试图窗口没有边框等
视图窗口是框架窗口的子类 WS_CHILD
在框架窗口创建的时候,创建视图窗口
class CMyView:public CView{
virtual void OnDraw(CDC* pDC){
}
}
MyView m_View;
//我们发现不能定义对象:
C++:抽象类不能定义对象,就说明:CView是一个纯虚类(抽象类)
我们返回去重写纯虚函数
重写了OnDraw函数之后,我们就可以定义对象了
然后我们在我们自己的框架类的Create中:
int CMyFrameWnd::OnCreate(LPCREATESTRUCT)
{
RECT rect;
GetWindowRect(&rect);
m_View.Create(NULL, L"MFCView", WS_CHILD | WS_VISIBLE | WS_BORDER, rect, this, 1);
return 0;
}
这样创建出来视图窗口之后,关闭窗口,会报错
原因:在父类中释放了对象,也就是说,我们的视图类是继承于CWnd类,在释放CWnd类的时候,析构了一次,而在框架类上又要释放一次,导致报错
解决方法:
在框架类Create中:
m_view = new MyView;
通过指针调用
这样只有当delete的时候,才会释放
上面创建视图窗口的时候,需要我们提供ID,这样在窗口分割的时候可以用到,如果无法获取ID,MFC提供了一个宏,可以自动帮我们识别窗口大小:
AFX_IDW_PANE_FIRST
内部调用了MoveWindow
-
OnDrow函数:
调用这个函数画出文档的图像,用于屏幕显示,打印或打印预览。需要提供其实现
在Wind32编程中 只有WM_PAINT消息
class CMyView :public CView { virtual void OnDraw(CDC* pDc) { pDc->TextOutW(50, 50, L"CMyView"); } };
在我们的视图类中,也可以处理WM_PAINT消息用于绘图
如果我们处理了WM_PAINT消息,就不会调用OnDraw函数
如果我们没有处理WM_PAINT消息,就会调用OnDraw函数
视图类继承与框架类,也有一条消息链表
如果我们没有重写处理WM_PAINT消息的话,就不会有消息链表
遍历消息的时候,就去父类的消息链表上去寻找
如果我们重写了处理WM_PAINT消息的话,就会到自己的消息链表上去抓消息,处理完了之后就退出,不会到父类消息链表中去抓消息
那既然视图类有消息链表,那视图类肯定也能够处理消息,我们在视图类中处理菜单消息
我们实现了代码之后,发现菜单变成了灰色,但是我们点击视图窗口的时候,发现又可以点击了
这是因为视图分割,只有当活动试图在我们处理消息的试图上的时候,就可以处理消息
点击就是给框架类窗口一个成员赋值(活动视图是我们处理消息的视图)文章来源:https://www.toymoban.com/news/detail-634368.html
this->m_pViewActive = m_view
文章来源地址https://www.toymoban.com/news/detail-634368.html
- 试图分割
- 机制:动态创建
- RTTI:运行时类信息 代码在运行当中,也能拿到类的信息来判断是否属于哪个类
到了这里,关于【MFC】09.MFC视图-笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!