        

      16         
,      MFC,     
MFC-     .     ,  
 ,       MFC,   
    .    
   MFC-.    
     ,   
    .     
     ,      
  AppWizard  Visual C++,     
     .      
     .  , , 
    ,  -  , 
  . 

    461 

             , 
      .    
   MFC: CArchive.     
   .       
   . 

         

      .    MFC  2.0  
MFC-  ,       .  
     :     . 
        . 
        Windows,  
  MFC.      ,  MFC 
    ,     
  .        
 . 
            
    (   
   ),  ,   ,    
       MFC 
.  ,         
    .  ,     
 ,    .    , 
    .     ,   
         . 
,      ,    
  .    ,     Windows  
     .     
      . 
          .  (.. 
)     (..  ,   
).       ,  
   ,       
 ,     .   
      .    
         
    .  ,   ,  
    CDocument,     
   CView (   ). , ,  
   ,    
   .     . , 
 ,   CView,   , 
  CFrameWnd. 
     ,   ,     
""  " ". 

    462                                    MFC:   


      ? 

        ,    ,   
.  ,   ""    
 ,   , ,  . ,  
 ,    -,   
.  ,     ,   
 . 
             
    SDI (Single Document Interface   
 )  MDI (Multiple Document Interface    
).   Microsoft     
   SDI,      
   . 

       ? 

      ,   (view)   
.  ,     . 
     . , , 
    ,       
    :  12-,  
24-,  12-   24-.    , 
        .  
      .  
,    ,     
   . 

       

       ,   MFC,  
      .    
     (serialization).   
    :    ( 
  )      .  
  ,       
      .     
 CDocument. 
           
 .         
 (  CDocument)       ( 
 CView),           
   ,      . 

       

            .  
,    ,      

    17.                                     463 

    , ..    .   
    ,    
         . 
     : 

    DECLARE_DYNCREATE(_) IMPLEMENTJ3YNCREATE{_, __) 

      _.   ,    
  ,   __  
    MFC. 
     DECLAREJDYNCREATEQ       
,      .  
IMPLEMENT_DYNCREATE()    .    
          RUNTIME_CLASS(): 

    RUNTIME_CLASS(_) 

      _    ,   
    DECLARE_DYNCREATE().  RUNTIME_CLASS()  
    CRuntimeClass,    .  
      . 

       

             
    : 
    1.  ,    ,  
,    . 
    2.        , 
   . 
    3.   ,     , 
   . 
    4.     . 
    5.   ,  CObject::Serialize()  CView::OnDraw(). 
        . 

          

    ,       , 
   ,    .  
   ,        
,      (     
 ).   ,      
CWinApp.        . 

    464                                    MFC:   

          CFrameWnd.     
   , ..     
DECLARE_DYNCREATE().        
 ,    ,     
  .     ,   
CFrameWnd    DECLARE_DYNCREATE(). 

    class CMainWin : public CFrameWnd 
    ( 
    DECLARE_DYNCREATE(CMainWin) 
    //    
    public: 
    CMainWin() ; 
    //    
    DECLARE_MESSAGE_MAP() 
    }; 

      DECLARE_DYNCREATE()     . 
,         ,   
  . 

       

    ,     ,    
CDocument.          
  DECLARE_DYNCREATE().      
,     ,    
   . ,      
 ,  .     , 
   . 
     CDocument   ,     
 ,   , .    
 OnNewDocument(),      .  
 : 

    virtual BOOL CDocument::OnNewDocument(); 

             
 CDocument.        
      . 
     ,      , 
  SerializeO.     CObject   
  . 
       ,     : 


    //    
    class CSampleDoc : public CDocument 
    ( 
    DECLAREJ3YNCREATE(CSampleDoc) 


    17.                                     465 


    //    
    public: 
    CSampleDoc  ; 
    BOOL OnNewDocument(); //     
    void Serialize(CArchive barch); //     
    
    //    
    DECLARE_MESSAGE_MAP() 


        

         .  
   , , ,  
      ,   
  .       
CView    ,   CScrollView ( 
 ).         
  DECLARE_DYNCREATE().      
,     . 
     CView    ,      
       : OnDraw().  
,        ( 
      ).  ,  Draw() 
   OnPaint(),  . 
      OnDrawQ : 

    virtual void CView::OnDraw(CDC *DC) = 0; 

     ,   ,      
    CView .  DC    
 ,     .  , 
     ,     
  OnPaintQ. 
       ,      : 

    class CSampleView : public CView 
    1 
    DECLARE_DYNCREATE(CSampleView) 
    //    
    public: 
    void OnDraw(CDC *DC) ; 
    //    
    DECLARE_MESSAGE_MAP() 
    }; 


    466                                     MFC:   


        

      DECLARE_DYNCREATE()     
   ,   ,   
    .     
     IMPLEMENT_DYNCREATE().   
,       : 
    
    IMPLEMENT_DYNCREATE(CMainWin, CFrameWnd) 
    IMPLEMENT_DYNCREATE( Sample View, CView) 
    IMPLEMENT_DYNCREATE(CSampleDoc, CDocument) 

             
,      . 

       

          ,    
 ,       .  
        .  
     ,    , 
  MD1-  SDI-, .     
     . 
          CSingleDocTemplate. 
  ,    ,    
,   : 

    CSingleDocTemplate:: CSingleDocTemplate(UINT ID, 
   
    CRuntimeClass *Document, 
    CRuntimeClass *FrameWindow, 
    CRuntimeClass *View}; 

      ID    .   
 ,   , ,   , 
  ,   ,  . 
 Document     ,  FrameWindow  
    ,        
.        RUNTIME_CLASS(). 
       . 
        ,  ID   , 
  .     ,  
  : 
      ; 
         (  ,    "Untitled"); 
        ( ,      
  ); 
       ,     "Files of type"; 
           ( ); 
       ,     ; 
       ,     . 


    77.                                     467 

             .  
     " " ('\').  - 
  ,     '\',     
    . 
             
STRINGTABLE.    : 

    STRINGTABLE 
    { 
    string-IDl "" 
    String-102 "" 
    string-ID3 "" 
    string-IDn "" 
    } 

      string-ID   . ,  
      : 

    STRINGTABLE 
    { 
    IDR_FRAMEWIN "Test App\n\n\nDoc Type (*.pnt)\n.pnt\nDVTest\n 
    DV Test" 
    } 

           IDR_FRAMEWIN. 
"Test App"    .      , .. 
      "Untitled".   
   .    "Files of type"  
     "Doc Type (*.pnt)". 
     PNT.     
      "DVTest",   
    "DV Test". 

      

       ,   ,    
   .   
   CWinApp::InitInstance(),    
 .   ,    
  ,   4> Initlnstance(), 
       .  
   : 
    
    //   
    BOOL ::Initlnstance() 
    ( 
    CSingleDocTemplate *DocPtr = new CSingleDocTemplate( 


    468                                    MFC:   


    IDR_FRAMEWIN, 
    RUNTIME_CLASS(CSampleDoc), 
    RUNTIME_CLASS(CMainWin), 
    RUNTIME_CLASS(CSampleView) 
    )- 
    AddDocTemplate(DocPtr) ; 
    
    //       
    EnableShellOpen() ; 
    RegisterShellFileTypes() ; 
    CCommandLineInfo CLInfo; 
    ParseCommandLine(CLInfo) ; 
    if(!ProcessShellCommand(CLInfo)) return FALSE; 
    return TRUE; 
    } 

        .     
 DocPtr,      
CSingleDocTemplateO.     ,  
.        
AddDocTemplate(),        
,  .     : 

    void CWinApp::AddDocTemplate(CDocTemplate *DocTemplate); 

      DocTemplate      . 
        ,   
  EnableShelIOpenQ  RegisterShellFileTypesQ.   : 

    void CWinApp::EnableShellOpen() ; 
    void CWinApp::RegisterShellFileTypes() ; 

     EnableShellOpen()     
       .  
RegisterShelIFileTypesQ        
. ,  ,   ,   
,      . 
             
.  ,       
Windows-    Run    .  
,      ,  
     ,    
.        
CCommandLineInfo.  CWinApp::ParseCommandLine()   
  .  CWinApp::ProcessShellCommand()  
     

    17.                                     469 

    .     ,   InitInstanceO 
  FALSE. (      
  ,     .) 

        

             
  ,         
  .    . -,  
CObject   Serialize(),     
   . -,  MFC   CArchive, 
        .  
 CArchive     -   , 
       ,     
,    MFC.     , 
,   ,     
   . 
     CObject::Serialize()      
.   : 

    virtual void CObject:: Serialize (CArchive SiArchOb) ; 

      ArchOb    CArchive,   
 .  SerializeQ     
.         
 ,   ArchOb. 
      Serialize()    ,    
 ,      .  
   IsStoringO  IsLoading(),   
 CArchive.    : 

    BOOL CArchive::IsLoading() const; 
    BOOL CArchive::IsStoring() const; 

     IsLoading()   ,   
,  ,   .   ,  
IsStoringO      ,    
  . 
           SerializeQ  
    .       (.. 
   )    ArchOb.  
CArchive      .     
    . 

    470                                     MFC:   


         CDocument 

     CDocument    -.  
       ,    
  ,     ,  ,   
 . 

     UpdateAIIViewsQ 

        ,     
UpdateAllViews().      ,   
 ,   ,      
  .  UpdateAllViewsQ   : 

    void CDocument: : UpdateAllViews (CView *SencfeJ-, LPARAM lParam=0, 
CObject *ObPtr=NULL) ; 

      Sender      ,  
     .     NULL, 
      ,   
.  IParam  ObPtr     
   .    ,  
  ( ,   Sender),  
UpdateAllViewsQ   CView::OnUpdate(). (,   
Sender  NULL,      .)  
,  OnUpdateQ  . 

     SetModifiedFlagQ 

        ,     
SetModifiedFlagO.       
  ,       . 
  : 

    void CDocument: : SetModifiedFlag (BOOL JsMod-if-ied=TRUE) ; 

      IsMociified   ,    
 .      . 

       CView 

     CView      .   
     GetDocument().   
    CDocument,    .  
 ,      ,   
     ,   ,   
   .       
CDocument    .   GetDocumentQ : 

    CDocument *CView::GetDocument() const; 

         ,    
   . 

    17.                                     471 


      

     ,        
,    ,   
   ,    ,   MFC 
    ( ),  
       
.        
   (. 17.1): 

     17.1.   

                     

    ID_APP_EXITCWinApp::OnAppExit() 
    ID_FILE_CLOSE               CDocument::OnFileClose() 
    ID_FILE_NEW                 CWinApp::OnFileNew() 
    ID_FILE_OPEN                CWinApp::OnFileOpen() 
    ID_FILE_PRINT                CView::OnFilePrint() 
    ID_FILE_PRINT_PREV1EW      CView::OnFilePrintPreview() 
    ID_FILE_PRINT_SETUP         CWinApp::OnFilePrintSetup() 
    ID_FILE_SAVE                 CDocuinent::OnFileSave() 
    ID_FILE_SAVE_AS__________CDocument::OnFileSaveAs()___________ 

         , 
         .*  
  .   ,    
    (. 17.2): 

     17.2.    

           

    "^.-ICLFILE_NEW 
    ID_F1LE_CLOSE              ID_FILE_OPEN 
    ID_F1LE_SAVE               ID_FILE_PRINT 
    ID_FILE_SAVE_AS            ID_FILE_PRINT_PREVIEW 
    ID_FILE_PRINT_SETUP 

          . 
,       
,   ID_EDIT_CUT, ID_EDIT_PASTE  . 
    *        .    
      ,    
    .     
  ,     15.   
   ,        
.  . . 

    472                                     MFC:   


         

    ,      ,   
 ,        
.   ,       
     . ,   , 
    .      
       .  
      .    
   .      
  .     , 
     .     
 . 17.1. 
         . ,     
 AFXRES.RC,    ,  
    . 

    ; DOCVIEW.RC 
    tinclude <afxres.h> 
    ^include <afxres.rc> 
    ftinclude "ids.h" 
    IDR_FRAMEWIN MENU 
    { 
    POPUP "File" 
    { 
    MENUITEM "&New\tCtrl-N", ID_FILE_NEW 
    MENUITEM "&Open\Ctrl-0", ID_FILE_OPEN 
    MENUITEM "&Save\tCtrl-S", ID_FILE_SAVE 
    MENUITEM "Save &As\tAlt-S", ID_FILE_SAVE_AS 
    MENUITEM "E&xit\tF4", ID_APP_EXIT 
    } 
    
    POPUP "Options" 
    ( 
    MENUITEM "&Undo\tF2", IDM_UNDO 
    MENUITEM "&Reset\tF3", IDM_RESET 
    } 
    MENUITEM "&Help", IDM_HELP 
    } 
    IDR_FRAMEWIN ACCELERATORS 
    ( 
    VK_F2, IDM_UNDO, VIRTKEY 
    VK_F3, IDM_RESET, VIRTKEY 
    VK_F4, ID_APP_EXIT, VIRTKEY 
    VK_F1, IDM_HELP_INDEX, VIRTKEY 
    ""N", ID_FILE_NEW 


    17.                                     473 


    """, ID_JILE_OPEN 
    ""S", ID_FILE_SAVE 
    "S", ID_FILE_SAVE_AS, ALT } 
    STRINGTABLE 
    { 
    IDR_FRAMEWIN "Test App\n\n\nDoc Type (*.pnt)\n.pnt\nDVTest\nDV 
    Test" 
    } 
        IDS.H: 
    // IDS.H 
    #de?ine IDM_UNDO      100 
    #define IDM_RESET     101 
    #define IDM_HELP      102 
    ttdefine IDR_FRAMEWIN 200 
    ftdefine MAXLOC        100 

       DOCVIEW.H,    : 

    // DOCVIEW.H 
    //       
    class CMainWin : public CFrameWnd 
    ( 
    DECLARE_DYNCREATE(CMainWin) 
    public: 
    CMainWin() ; 
    DECLARE_MESSAGE_MAP() 
    
    //    
    class CApp : public CWinApp 
    ( 
    public: 
    BOOL Initlnstance () ; 
    DECLARE_MESSAGE__MAP() 
    //    
    class CSampleDoc : public CDocument 
    ( 
    DECLAREJ3YNCREATE(CSampleDoc) 
    int m_Lodndex; 
    CPoint m_Locations[MAXLOC] ; 
    public: 
    CSampleDoc() ; 


    474                                    MFC:   


    afx msg void OnUndo(); 
    afx msg void OnResetO; 
    afx msg void OnHelpO; 
    BOOL OnNewDocument(); 
    void Serialize(CArchive &arch); 
    DECLARE_MESSAGE_MAP() 
    }; 
    
    //     
    class CSampleView : public CView 
    ( 
    
    DECLARE_DYNCREATE(CSampleView) 
    public: 
    void OnDraw(CDC *DC) ; 
    afx_msg void OnLButtonDown(UINT flags, CPoint loc) ; 
    DECLARE_MESSAGE_MAP() 
    }; 
       : 
    //     
    #include <afxwin.h> 
    #include "ids.h" 
    ^include "docview.h" 
    CApp App; //    
    
    IMPLEMENT_DYNCREATE(CMainWin, CFrameHnd) 
    IMPLEMENT_DYNCREATE(CSampleView, CView) 
    IMPLEMENT_DYNCREATE(CSampleDoc, CDocument) 
    
    //     
    BEGIN_MESSAGE_MAP(CApp, CWinApp) 
    ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) 
    
    ON_COMMAND(ID_FILE_NEW_, CWinApp::OnFileNew) 
    END_MESSAGE_MAP() 
    
    //      
    BEGIN_MESSAGE_MAP(CSampleView, CView) 
    
    ON_WM_LBUTTONDOWN() 
    END_MESSAGE_MAP() 
    
    //     
    BEGIN_MESSAGE_MAP(CSampleDoc, CDocument) 
    ON_COMMAND(IDM_UNDO, OnUndo) 
    ON__COMMAND(IDM_RESET, OnReset) 
    
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 


    77.                                     475 


    //      
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    
    //      
    END_MESSAGE_MAP() 
    //    
    CMainWin::CMainWin() 
    ( 
    //      
    
    //   
    BOOL CApp::Initlnstance () 
    ( 
    
    CSingleDocTemplate *DocPtr = new CSingleDocTemplate( 
    IDR_FRAMEWIN, 
    RUNTIME_CLASS(CSampleDoc), 
    RUNTIME_CLASS(CMainMin), 
    RUNTIME_CLASS(CSampleView) 
    ) ; 
    AddDocTemplate(DocPtr) ; 
    
    //       
    EnableShellOpen() ; 
    
    RegisterShellFileTypes() ; 
    CCommandLineInfo CLInfo; 
    ParseCommandLine(CLInfo) ; 
    if (!ProcessShellCommand(CLInfo)) return FALSE; 
    return TRUE; 
    
    //   
    CSampleDoc::CSampleDoc() 
    ( 
    m Loclndex = 0; 
    } 
    
    //   IDM_HELP 
    afx_msg void CSampleDoc::OnHelp() 
    ( 
    
    App.m_pMainWnd->MessageBox("Document/View Demo", 
    "Placeholder Help"); 
    } 
    //       
    BOOL CSampleDoc::OnNewDocument() 
    { 
    if ( i.CDocument: :OnNewDocument () ) return FALSE; 


    476                                    MFC:   


    m_LocIndex = 0; 
    return TRUE; 
    } 
    
    //     
    void CSampleDoc::Serialize(CArcive &arch) 
    { 
    int i; 
    if(arch.isLoading()) ( 
    arch  m Loclndex; 
    for(i=0; i<m Loclndex; i++) arch  m_Locations[i]; 
    } else ( 
    arch  m_Lodndex; 
    for(i=0; i<m Loclndex; i++) arch  m Locations[i]; 
    } 1 
    
    //    
    afx msg void CSampleDoc::OnUndo() 
    { 
    m Loclndex--; 
    if (m_Lodndex<0) m_LocIndex=0; 
    SetModifiedFlag() ; 
    UpdateAllViews(NULL) ; 
    } 
    //        
    afx_msg void CSampleDoc::OnReset() 
    { 
    m_Lodndex = 0; 
    SetModifiedFlag() ; 
    UpdateAllViews(NULL) ; 
    } 
    //     
    afx_msg void CSampleView::OnLButtonDown(UINT flags, CPoint loc) 
    ( 
    CSampleDoc *DocPtr = (CSampleDoc *) GetDocument() ; 
    DocPtr->m Locations[DocPtr->m Loclndex] = loc; 
    DocPtr->m_LocIndex++; 
    if (DocPtr->m_Lodndex == MAXLOX) ( 
    DocPtr->m_LocIndex = MAXLOX; 
    App.m_pMainWnd->MessageBox("Too Many Points", "Error"); 
    ) 
    DocPtr->SetModifiedFlag() ; 
    DocPtr->UpdateAllViews(NULL) ; 
    ) 


    17.                                     477 


    //   
    void CSampleView::OnDraw(CDC *DC) 
    ( 
    CSampleDoc *DocPtr = (CSampleDoc *) GetDocument() ; 
    int i; 
    
    for(i=0; i<DocPtr->m_Lodndex; i++) 
    DC->LineTo(DocPtr->m_Locations[i] ) ; 
    ) 


        

             
,    .   ,  
,    m_Locations,    
CSampleDoc.      MAXLOC ( 
 100).   ,    m_Locations, 
   m_LocIndex.  ,    
   ,       
m_Locations    m_Lodndex .   
     ,    Options 
 Undo.          
 m Loclndex. 

    . 17.1.     


    478 MFC:   

        ,    Serialize().  
        
mJLodndex, a    m_Locations.    
    m_Lodndex,    
 ,      ni_Locations.  
      ,   
CArchive       . 

         

            
   AppWizard  Visual C++.       
   .  ,     
 .  ,      . 
 ,      ,   
   "File Open". ,     
  MFC.  ,   
   ,     .  
 ,     ,   
 ,  ,   .  
   ,      
 .        
       . 

      

            ,    
  MFC-!    :    
   .    Windows, MFC      
   .   ,     
     .      
,         
    ,     ,     OLE 
(       .)    OLE 
    Windows.     
,          . 
        . 

    17.                                     479