通常视图类都有一个OnDraw函数,用于响应重绘消息,如
void CTestUnicodeView::OnDraw(CDC*  pDC)
{
CTestUnicodeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return; // TODO: 在此处为本机数据添加绘制代码}
      今天突然对 CTestUnicodeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;    产生了一些疑问。我想为何要在执行绘制之前判断文档类的有效性呢?这个视图的绘制有什么关系吗?

解决方案 »

  1.   

    产生了一些疑问。我想为何要在执行绘制之前判断文档类的有效性呢?这个视图的绘制有什么关系吗?
    ==============
    按照文档视图的设计模式,视图类中绘图所用的数据应该是存放在文档类中的,所以在OnDraw中有如下的代码:
    CTestUnicodeDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        if (!pDoc)
            return;因为设计时希望绘图数据是放在文档类中的,所以如果pDoc为NULL的话,就应该返回。
      

  2.   


         我也想到了这点。但由此我觉得MFC的设计并不合理,因为现实中并不是所有的绘图数据都是放在文档类中的,因此要不要进行文档类的有效性检查应该由用户来决定。
      

  3.   

    楼主,这个是MFC的一种设计构架,你不喜欢也可以不把数据存放在DOC文件里面的。当初,偶还是个菜鸟的时候(虽然现在也是)就把DOC给删了,所有数据都写在View中,也没报错,结构清晰啊。呵呵。
      

  4.   

    将数据放到doc中,显示放到view中去做是比较好的设计,将数据的存储和数据的显示分开