长春火车站防疫政策,不受国家管理的浏览器,企业邮箱腾讯登录入口,网站有多少个MFC视图窗口#xff1a;CView类 显示数据/画面
我们之前的绘图消息#xff0c;都是在框架类上画出来的
视图窗口就覆盖在框架窗口上
视图窗口本质上也是窗口#xff0c;只是和框架窗口风格不同
CView类也继承于CWnd类
CView也能处理消息#xff0c;因为它继承于CWnd类…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, LMFCView, WS_CHILD | WS_VISIBLE | WS_BORDER, rect, this, 1);return 0;
}这样创建出来视图窗口之后关闭窗口会报错
原因在父类中释放了对象也就是说我们的视图类是继承于CWnd类在释放CWnd类的时候析构了一次而在框架类上又要释放一次导致报错
解决方法
在框架类Create中
m_view new MyView;
通过指针调用
这样只有当delete的时候才会释放上面创建视图窗口的时候需要我们提供ID这样在窗口分割的时候可以用到如果无法获取IDMFC提供了一个宏可以自动帮我们识别窗口大小
AFX_IDW_PANE_FIRST
内部调用了MoveWindow OnDrow函数 调用这个函数画出文档的图像用于屏幕显示打印或打印预览。需要提供其实现 在Wind32编程中 只有WM_PAINT消息 class CMyView :public CView {virtual void OnDraw(CDC* pDc) {pDc-TextOutW(50, 50, LCMyView);}
};在我们的视图类中也可以处理WM_PAINT消息用于绘图 如果我们处理了WM_PAINT消息就不会调用OnDraw函数 如果我们没有处理WM_PAINT消息就会调用OnDraw函数 视图类继承与框架类也有一条消息链表 如果我们没有重写处理WM_PAINT消息的话就不会有消息链表 遍历消息的时候就去父类的消息链表上去寻找 如果我们重写了处理WM_PAINT消息的话就会到自己的消息链表上去抓消息处理完了之后就退出不会到父类消息链表中去抓消息
那既然视图类有消息链表那视图类肯定也能够处理消息我们在视图类中处理菜单消息
我们实现了代码之后发现菜单变成了灰色但是我们点击视图窗口的时候发现又可以点击了
这是因为视图分割只有当活动试图在我们处理消息的试图上的时候就可以处理消息
点击就是给框架类窗口一个成员赋值活动视图是我们处理消息的视图
this-m_pViewActive m_view
试图分割机制动态创建RTTI运行时类信息 代码在运行当中也能拿到类的信息来判断是否属于哪个类