【MFC】09.MFC视图-笔记

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消息的话,就会到自己的消息链表上去抓消息,处理完了之后就退出,不会到父类消息链表中去抓消息

那既然视图类有消息链表,那视图类肯定也能够处理消息,我们在视图类中处理菜单消息

我们实现了代码之后,发现菜单变成了灰色,但是我们点击视图窗口的时候,发现又可以点击了

这是因为视图分割,只有当活动试图在我们处理消息的试图上的时候,就可以处理消息

点击就是给框架类窗口一个成员赋值(活动视图是我们处理消息的视图)

this->m_pViewActive = m_view

  • 试图分割
  • 机制:动态创建
  • RTTI:运行时类信息 代码在运行当中,也能拿到类的信息来判断是否属于哪个类

你可能感兴趣的:(MFC,mfc,笔记,c++)