• 24课时VC之思考>文档与视图结构


                                                                    文档与视图结构

    CObject是MFC类结构的根类。任何代表一个窗口或控件的类是CWnd类的派生类,它处理所有 窗口共同的基本函数。

    CObject和CWnd类使用虚函数,它使程序利用基类指针能够访问通用对象函数。 这样就可以很方便地利用CObject或CWnd派生类的对象与MFC交互。

    ……动态创建支持机制用CRuntimeClass允许时创建对象。

    ……串行化支持机制允许以面向对象方式存储和装载对象。

    文档类对程序的数据负责,视图类处理文档与用户间的交互,框架结构类包含有视图及其他用户 接口数据,如菜单和工具栏,应用类负责启动程序的运行和处理程序与Windows间的数据交互。

    CString strMsg; strMsg.Format("Foo=%d",pFoo);

    @虚拟函数是在运行时决定的函数,当使用虚拟函数时,编译器会建立一个特殊的表,称作虚拟函数表 。这个表用来决定调用该类的哪一个对象的函数。当调用虚拟函数时,虚拟函数表就保证了调用正确 的函数

    class CUser {

    public:

    virtual void ClenrInfo();

    };

    探索Document/View接口

    1.GetDocument CView的一个成员函数,用来检索其文档的指针。

    2.UpdateAllViews CDocument的一个成员函数,用来更新与某文件相连的视图。

    3.OnNewDocument CDocument的一个成员函数,用来初始化文档的成员。

    4.TRACE宏显示一行文本信息。让你的程序没遇到有趣的事件时都显示跟踪信息是 一个好主意。

    5.ASSERT_VALID宏来使指针有效。你可以经常使用该宏来使旧的指针有效。

    6.TEXTMETRICS结构。该结构中成员tnHeight是所有中字体的最高高度,成员 tmExternalLeading是行间距,添加这两个值使得文本的显示有很好的风格。

                                                              

    问题与解答  

    int *pBadInt;

    *pBadInt=42;//错误

    第一,指针变量没有初始化,初始化指针变量为NULL或指向一段动态分配的内存

    int *pInt=NULL; int *pInt=new int;

    第二,指针不会自动地指向闲置内存区,pBadInt位初始化,指向的是一块随机 的内存区。必须使指针变量要么为已存在的变量的地址,要么位一块动态分配 的内存的地址,例如:

    int n;

    int *pInt;

    pInt=&n;

    *pInt=42;


    pInt=new int;

    *pInt=42;

    delete pInt;

    第一部分:CDVTestDoc.h中声明


    public:
     CString GetName(int nIndex) const;
     int AddName(const CString& szName);
     int GetCount() const;
    private:
     CArray<CString,CString> m_arNames;

    第二部分:CDVTestDoc.cpp实现

    CString CDVTestDoc::GetName(int nIndex) const

    {

    ASSERT(nIndex<m_arNames.GetSize());

    return m_arNames[nIndex];

    }

    int CDVTestDoc::AddName(const CString& szName)

    {

    return m_arNames.Add(szName);

    }

    int CDVTestDoc::GetCount() const

    {

    return m_arNames.GetSize();

    }

    第三部分:文档的初始化

    BOOL CDVTestDoc::OnNewDocument()

    {    

    TRACE("CDVTest::OnNewDocument");

     if (!CDocument::OnNewDocument())  

     return FALSE;

     // TODO: add reinitialization code here  

    // (SDI documents will reuse this document)  

    m_arNames.RemoveAll();  

    m_arNames.Add("Curty");  

    m_arNames.Add("Moe");  

    m_arNames.Add("Shemp");

     return TRUE;

    }

    第四部分:视图的更新显示

    void CDVTestView::OnDraw(CDC* pDC)

    {  

    CDVTestDoc* pDoc = GetDocument();  

    ASSERT_VALID(pDoc);

     // TODO: add draw code for native data here

     TEXTMETRIC tm;  

    pDC->GetTextMetrics(&tm);

     int nLineHeight=tm.tmHeight+tm.tmExternalLeading;

     CPoint ptText(0,0);  

    for(int nIndex=0;

    nIndex<pDoc->GetCount();nIndex++)  

    {    

    CString szName=pDoc->GetName(nIndex);    

    pDC->TextOut(ptText.x,ptText.y,szName);

     ptText.y+=nLineHeight;

     }

    }

  • 相关阅读:
    cf492D Vanya and Computer Game
    cf492C Vanya and Exams
    cf492A Vanya and Cubes
    bzoj2038 [2009国家集训队]小Z的袜子(hose)
    bzoj3781 小B的询问
    bzoj1858 [Scoi2010]序列操作
    bzoj1060 [ZJOI2007]时态同步
    算法学习心得
    bzoj1054 [HAOI2008]移动玩具
    bzoj3437 小P的牧场
  • 原文地址:https://www.cnblogs.com/fengbo/p/2630556.html
Copyright © 2020-2023  润新知