      

          .     
  .      
,        
  .   ,     
   ,        
 . 
      (  ,    )   
  .        
 ,         . 
           
  Windows. 

87


          

     _       
     .     
     .   -,   
      .   Windows 
  ._ ,   : 
.  ,  , ,  , 
 ,     .   
  : 
     * (push button)   ,   "" 
(        [TAB],    
[ENTER]),    - .    
   .  ,  ,     
,   . 
       (check box)   ,    
 ,  .    ,    , 
 .       
 ,        . 
       (radio button)  ,  ,    
.          
     .  ,    
  . 
      (list box)   ,     
.   ,  ,    . 
        (edit box)   ,     
   .  ,  ,  , 
   . 
       (combo box)     
   . 
       ,   , (scroll bar)  
     . 
       (static control)     
  ,     . 
    : Windows 95  Windows NT    
 ,    ,     
.    . 

           ,      
 .  . .              

    88                                     MFC:   

         ,    
 ,     : 
,    .      . 
     ,       
 (   ),     ( 
).     ,    
  .  , ,  
,     .      
   . 

      

     MFC       .  
   ,       .  
,    ,    CWnd.  , 
        ,      
.     . 5.1. 

     5.1.      

                 

    CButton         ,      
    CEdit              
    CListBox          
    CComboBox        
    CScrollBar         
    CStatic            

      MFC       
,     .     
  .      
  .        , 
   .     
   ;     , 
   . ,       . 

         

        :   .  
  .      
    ,     
 . ..     ,    
   

    5.                                                  89 

       .      
 .   ,       
-   ,       
.       ,   
  .      
 . 

        

       ,      
.  ,   ,    
,     .     
      ,    
     ,     ,   
  .       
  .    ,    
      ,      
 .    RC-    ;;  
 ,        .  
. ,         
coo . 
    :         
':'   ,      , 
.::         . 
             DIALOG. 
   : 

    - DIALOG [] X, , Width, Height 

     
    { 
    - 
    } 

     -    .     
       (X,Y),     
^;! Width  Height.  ,    
 :. '.      ,    
.      Win32   . 
    DISCARDABLE.    
   , .    .  ,  
       .  ,  
,     ^ .   -  
  ,    .  
       . 

    90                                     MFC:  


     CDialog 

          CDialog,   
  CWnd.  MFC        
CDialog,     .      
    CDialog,       
.   ,      ,   
    .      
        . 
            
   CDialog.   : 

    ..'Dialog (LPCSTR IpszDialogName, CWnd *0wner = NULL); ^ 
    CDialog(UINT ID, CWnd * Owner = NULL); 
    CDialog (); 

     IpszDialogName       
 .  ID    . ( 
       ,    
 .      .)   
  Owner      , 
   .  Owner  NULL,   
   .    CDialogQ 
     ,    
   . 

         

      CDialog   CWnd,    , 
 ,   (   ).  , 
   ,       
,      .    
           
.         
      . 
              
 .  ,     
,     WM_COMMAND.   
      .  
          
  ON_COMMAND().     
 .    ,     
    . 
          
,    ,     .  
           
.   ,  MFC  ,   
ON_COMMAND(),          . 

    5.                                                 91 


       

              
    CDialog       
 DoModalQ.        
.   DoModalQ : 

    virtual int CDialog::DoModal(); 

       ,    up 
,  -1,      .     
 ,  IDABORT.  DoModalQ    
    . 

       

             
 IDCANCEL,  IDOK.    Windows    ( 
 Cancel  .  CDialog      
,  )  ().     
,         . 
,    ,     
.   ,   . 

         

          .    
 : Red, Green  Cancel.        
,    .     
    Cancel. 
         ,   : Dialog  
Help            
    ,      
  ,     
  . 

         

           ,  
  .    ,     
  ,    .     
 . 

    ; DIALOG.RC 
    ;   ,  ;      
    #include <afxres.h> 
    #include "ids.h" 


    92                                     MFC:   


    IDialogMenu MENU 
    1 
    POPUP "&Dialog" 
    ( 
    MENUITEM "sSample Dialog", IDM_DIALOG 
    MENUITEM "E&xit", IDM_EXIT 
    } 
    MENUITEM "&Help", IDM_HELP 
    } 
    DialogMenu ACCELERATORS 
    { 
    VK_F1, IDM_HELP, VIRTKEY 
    VK_F2, IDM_DIALOG, VIRTKEY 
    VK_F3, IDM_EXIT, VIRTKEY 
    ) 
    SampleDialog DIALOG 18, 18, 142, 92 
    CAPTION "Sample Dialog Box" 
    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 
    ( 
    DEFPUSHBUTTON "Red", IDD_RED, 32, 40, 30, 14, 
    '"      WS_CHILD | WS_VISIBLE | WS_TABSTOP 
    PUSHBUTTON "Green", IDD_GREEN, 74, 40, 30, 14, 
    WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    PUSHBUTTON "Cancel", IDCANCEL, 52, 65, 37, 14, 
    HS_CHILD I WS_VISIBLE | WS_TABSTOP 
    } 

         ,  SampleDialog, 
      (18,18).    142,  
  92 . ,     CAPTION, 
  .  STYLE    
 .     ,  
 ,     ,   . 5.2. 
         , 
   .       
 . 

     5.2.      

	                 
    DS_MODALFRAME        ;    
   ,      
    WS_BORDER              
    WS_CAPTION             
    WS_CHILD               
    WS_HSCROLL              


    5.                                                  93 


    	 

    WSMAXIMIZEBOX	    
    WSMINIMIZEBOX     
    WSPOPUP 	     
    WSSYSMENU 	   
    WSTABSTOP 	        [TAB]
    WSVISIBLE 	   
    WSVSCROLL 	    
     
       SampleDialog     
.        .   
    .     : 

    PUSHBUTTON "", PBID, X, , Width, Height [,] 

           . PBID   
,   .      
 .       (X, Y),   
   Width  Height.     
.        DEFPUSHBUTTON. 
    ,      . 

      IDS.H 

      IDS.H,    ,   
 ,   . 
    
    // IDS.H 
    ^define IDM_DIALOG    100 
    #define IDM_EXIT      101 
    #define IDM_HELP      102 
    ^define IDD_RED       200 
    ^define IDD_GREEN     201 

      . 


       

       ,    , 
    . 

    // DIALOG. 
    //       
    class CMainWin : public CFrameWnd 
    { 
    public: 


    94                                     MFC:   


    CMainWin () ; 
    //    
    afxJ-nsg void OnDialogO; 
    afx msq void OnExit(); 
    afx msg void OnHelpO; 
    DECLARE_MESSAGE_MAP() 
    }; 
    //      
    class CApp : public CWinApp 
    f 
    public: 
    BOOL Initlnstance (); 
    1; 
    //       
    class CSampleDialog : public CDialog 
    i 
    public: 
    CSampleDialog(char *DialogName, CWnd *0wner) : 
    CDialog(DialogName, Owner) (} 
    afx msg void OnRedO; 
    afx msg void OnGreen(); 
    DECLARE__MESSAGE_MAP() 
    l . 

     ,   CSampleDialog()    
  CDialogQ. 

     

       ,     .  
    ,    . 
   Sample Dialog     .   
 -    .   
   . 5.1. 

    //     
    ^include <afxwin.h> 
    #include "dialog.h" 
    #include "ids.h" 
    CMainWin::CMainWin () 
    ( 
    Create(NULL, "Demonstrate Dialog Boxes", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "DialogMenu") ; 


    5.                                                 95 


    //     
    if(!LoadAccelTable("DialogMenu")) 
    MessageBox ("Cannot Load Accelerators", "Error"); 
    } 
    //   BOOL CApp::Initlnstance() { 
    m pMainWnd = new CMainWin; 
    m_pMainWnd->ShowWindow(m_nCmdShow) ; 
    m_pMainWnd->UpdateWindow(); 
    return TRUE; 
    ; 
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_COMMAND(IDM_DIALOG, OnDialoaJ 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    //   IDM_DIALOG 
    afx msg void CMainWin::OnDialog () 
    ( 
    CSampleDialog diagOb("SampleDialog", this); 
    diagOb.DoModal(); //     
    )               "    '       ' 
    //   IDM EXIT 
    afx msg void CMainWin::OnExit() 
    { 
    int response; 
    response = MessageBox("Quit the Program?", "Exit", MB_YESNO) ; 
    if(response == IDYES) 
    SendMessage(WM CLOSE); //   
    //   IDM HELP 
    afx msg void. CMainWin::OnHelp() 
    { 
    MessageBox ("Dialog Demo", "Help"); 
    } 
    //      
    BEGIN_MESSAGEJ4AP(CSampleDialog, CDialog) 
    ON_COMMAND(IDD_RED, OnRed) 
    ON_COMMAND(IDD_GREEN, OnGreen) 
    END_MESSAGE_MAP() 


    96                                      MFC:   


    //   IDD_RED 
    afx_msg void CSampleDialog::OnRed() 
    ( 
    MessageBox("Red", "Color Selected"); 
    II   IDD_GREEN 
    [  afx_msg void CSampleDialog::OnGreen () 
    i   ( 
    MessageBox("Green", "Color Selected"); 
    ) 
    CApp App; //    


    . 5.1.    


        

        -      
   WM_COMMAND.     
 ,    CSampleDialog.    
    ,      
 .     Red,   
IDD_RED,     OnRed().    Green 
  IDD_GREEN    OnGreen(). 
     ,      Cancel.    
,   ",   CDialog    
  : IDCANCEL  IDOK.       
- ),     ().   

    5.                                                  97 

         .     
 ,   Cancel   IDCANCEL.  
,          
1().   1()  () : 

    virtual void CDialog::OnCancel (); 
    virtual void CDialog::OnOK (); 

          .    
     .   
 ,   .  , ,   
  ,       
  
        ,   MFC    CButton. 
 ,   (push buttons).    
  ,         
 ,   ,      
        WM_COMMAND.  
      .     
CButton         . 
            .    
,    Exit.     
,     WM_CLOSE.   , 
        ,   
 .    ,   
SendMessageQ,    CWnd.   : 

    LRESULT CWnd::SendMessage(UINT Message, WPARAM wParam = , 
    LPARAM 1 Pa ram = 0) ; 

           .  
Message   .       
  .        
wParam  IParam.   WPARAM  LPARAM   Windows 
   . 

        

      ,   )  ()   
  .       
  .     
(|log(),     CDialog.   : 

    void CDialog::EndDialog(int Status); 

      Status   ,   DoModaIQ. 

    98                                      MFC:   

    , ,      )   : 

    afx_msg void CSampleDialog::OnCancel () ( 
    int response; 
    response = MessageBox("Are You Sure?", "Cancel", MB_YESNO) ; 
    if (response == IDYES) EndDialog(0); 
    )                                                "~ 

        ,      
    .     , 
      CSampleDialog   DIALOG.H,  
        : 
    
    ON_COMMAND(IDCANCEL, OnCancel) 

        ,     Cancel  
  ,   . 5.2. 

    . 5.2.  ,    Cancel 

     ,   EndDialogO     
  .       . 

       

         ,    
,     ,    .  
     . Windows  
'    WMJGNITDIALOG   .   
^ MFC "   OnInitDiaIogQ,  
  ,    CDiaIog.   
   ,     
 .   : 

    virtual BOOL CDialog::OnInitDialog(); 

        ,     .  
  TRUE,   Windows    (..  

    5.                                                  99 

    )      .   
OnInitDialogQ   ,       
. ; 
       ,     npir 
  OnInitDialogQ.  ,    
[ ,      CDiaIog::OnInitDialog(). .. 
    OnInitDiaIogO,   CDialog. 
            . 

       

       ,      
.         
.  MFC       CListBox. 

         

         ,    
LISTBOX       .    
 : 

    LISTBOX LBID, X, , Width, Height [, } 

      LBID   .    
     (X,Y),      
Width  Height.     . 
             
 DIALOG.RC.     : 

    LISTBOX J:DD__LB1, 2, 10, 47, 32, LBSJMOTIFY I WS_CHILD | 
    WS_VISIBLE I WS_BORDER | WS_VSCROLL I WS_TABSTOP 
         : 
    PUSHBUTTON "Select Fruit", IDD_SELFRUIT, 5, 45, 42, 14, 
    WS_CHILD I WS_VISIBLE I WS_TABSTOP 

     ,   Red  Green    :  
 Red    (56, 45),    Green    (96, 45). 
        : 

    SampleDialog DIALOG 18, 18, 142, 92 
    CAPTION "Sample Dialog Box" 
    STYLE DS_MODALFRAME I WS_POPUP | HS_CAPTION | WS_SYSMENU 
    {                                                                     ' 
    DEFPUSHBUTTON "Red", IDD_RED, 56, 45, 30, 14,                       , 
    WS_CHILD I WS_VISIBLE | WS_TABSTOP                              ! 
    PUSHBUTTON "Green", IDD_GREEN, 96, 45, 30, 14, 
    WS_CHILD I WS_VISIBLE I WS_TABSTOP 
    PUSHBUTTON "Cancel", IDCANCEL, 52, 65, 37, 14, 
    WS_CHILD I WS_VISIBLE I WSJTABSTOP                               ; 
    LISTBOX IDD_LB1, 2, 10, 47, 32, LBS_NOTIFY | WS_CHILD | 

    100                                    MFC:   

    WS_VISIBLE I WS_BORDER i WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Select 
Fruit", IDD_SELFRUIT, 5, 45, 42, 14, WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    } 

           IDS.H: 

    Mefine IDD_SELFRUIT     202 
    ftdefine IDD_LB1          203 

     IDD_LB1  _   . 
 IDD_SELFRUIT    Select Fruit. 

        

       ,   
    . ..    ,   
 .  ,      
.     ,     
 . (_10   .)   
,     ,    
.   ,     
   . 

        

         . ,  
      ,     
 (..    )       
.       
.      WM_COMMAND ,  ,  
  ,   .   , 
       . 
     ,    ,  LBN_DBLCLK.  
,        . ( 
      LBS_NOTIFY,    
  .)   ,   
,    ,   . 
       LBN_DBLCLK      
 .      ON_COMMAND().     
      
.  LBN_DBLCLK    ON_LBN_DBLCLK().   
 : 

    ON_LBN_DBLCLK(ID, HandlerName) 

      ID    ,  
dIerNqme      . 
     ON_LBN_DBLCLK()       
,    ,    
  .      
    ON_LBN. ,  ,    
(. 5.3): 


    5.                                                 101 


     5.3.     

                             

    ON.	.LBN.	.ERRSPACE	He   
    ON.	-LBN.	.KILLFOCUS	    
    ON.	-LBN.	SELCHANGE	    
    ON.	-LBN.	.SETFOCUS	    

       ,   ,    
 ,    . 

       

      Windows-     
 API-,  SendDlgItemMessage().   ,  
  MFC,      . 
      .   
    MFC    
  . 
          .   
CListBox       .      
   : 

    int CListBox::AddString(LPCSTR IpszStr); 
    int CListBox::GetCurSel() const; 
    int CListBox::GetText(int Index, LPCSTR IpszStr) const; 

        : 
      AddStringO     .   
     . (    
  LBS_SORT,       
.)      .    
 .      LB_ERR,  LB_ERRSPACE ( 
  ). 
      GetCurSeIQ     (.. 
)  .    ,   LB_ERR. 
      GetText()  ,    .  
      LB_ERR,      
.     ,   /pszStr. 
        : DeIeteStringO (   
), FindStringO ( ), SetCurSelQ (   
 ), InsertStringO (    )  
GetCoiintQ (    ).    - 
 CListBox    . 

    102                                     MFC:   


        

     - CListBox     CListBox, 
 :      ,     
 ?   . ^   
_ _  GetDlgItemO,    CWnd. 

    CUnd *CWnd::GetDlgItem(int ID) const; 

         ,     
 ID.     ,  NULL.  
,  ,   GetDlgItemO,  
.  ,       .  , 
 ,       . 
    ,   GetDlgItemO,      
,      .    
 ,         CListBox*. 

      

         ,   
  ,      
.        OnInitDialogO,  
     .    OnInitDialogO 
   . 

    //   . 
    BOOL CSainpleDialog : : OnInitDialogO 
    CDialog::OnInitDialog(); //     
    CListBox *lbptr = (CListBox *) GetDlgItem(IDDJLB1); 
    //   
    Ibptr^ddString ("Apple") ; 
    Ibptr-^ddString("Orange") ; 
    Ibptr-^AddString ("Pear") ; 
    lbptr_-Add3tring("Grape") ; 
    return TRUE; 
    
           "Apple" (), "Orange" 
(), "" ()  "Grape" ().     
    AddStringO.  ,    
 GetDlgItemO    ,    
  AddStringO.        
    -  CListBox.   
          . 
           . (  
        

    5.                                                  103 

    .)   ,   ,   , 
      ,   
  . 

         

            ,  
    .      
DIALOG. ,    . 

    // DIALOG. 
    //       
    class CMainWin : public CFrameWnd 
    ( 
    public: 
    CMainWin(); 
    //    
    afx msg void OnDialogO; 
    afx msg void OnExitO; 
    afx_msg void OnHelpO; 
    DECLARE_MESSAGE_MAP() 
    }; 
    //      
    class CApp : public CWinApp 
    { 
    public: 
    BOOL Initlnstance () ; 
    ); 
    //       
    class CSampleDialog : public CDialog 
    < 
    public: 
    CSampleDialog(char *DialogName, CWnd *0wner) : 
    CDialog(DialogName, Owner) {} 
    BOOL OnInitDialog (); 
    afx msg void OnRedO; 
    afx msg void OnGreenO; 
    afx msg void OnSelectO; 
    DECLARE_MESSAGE_MAP() 
    }; 


    104                                    MFC:   

      : 

    //    
    ^include <afxwin.h> 
    tinclude <string.h> 
    tinclude "dialog.h" 
    #inciude "ids.h" 
    CMainWin::CMainWin() 
    ( 
    Create(NULL, "Demonstrate Dialog Boxes", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "DialogMenu"); 
    //     
    if('LoadAccelTable("DialogMenu")) 
    MessageBox("Cannot Load Accelerators", "Error"); 
    ) 
    //   
    BOOL CApp::Initlnstance () 
    ( 
    m pMainWnd = new CMainWin; 
    m pMainWnd->ShowWindow(m nCmdShow) ; 
    m_pMainWnd->UpdateWindow() ; 
    return TRUE; 
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_COMMAND(IDM_DIALOG, OnDialog) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    //   IDM_DIALOG 
    afx msg void CMainWin::OnDialog() 
    { 
    CSampleDialog diagOb("SampleDialog", this); 
    diagOb.DoModal(); //     
    ) 
    //   IDM_EXIT 
    afx msg void CMainWin::OnExit() 
    ( 
    int response; 
    response = MessageBox("Quit the Program?", "Exit", MB_YESNO) ; 


    5.                                                 105 


    if(response == IDYES) 
    SendMessage(WM CLOSE); //   
    ) 
    //   IDM_HELP 
    afx_msg void CMainWin::OnHelp() 
    ( 
    MessageBox("Dialog Demo", "Help"); 
    } 
    //      
    BEGIN_MESSAGE_MAP(CSampleDialog, CDialog) 
    ON_COMMAND(IDD_RED, OnRed) 
    ON_COMMAND(IDD_GREEN, OnGreen) 
    ON_COMMAND(IDD_SELFRUIT, OnSele_ct) 
    ON_LBN_DBLCLK (I DD_LB 1, OnSeTect") 
    END_MESSAGE_MAP () 
    //   . 
    BOOL CSampleDialog::OnInitDialog() 
    ( 
    CDialog::OnInitDialog(); //     
    CListBox *lbptr = (CListBox *) GetDlgItem(IDD_LB1); 
    //   
    lbptr->Add3tring("Apple"); 
    Ibptr->AddString("Orange") ; 
    lbptr->AddString("Pear") ; 
    lbptr->AddString ("Grape") ; 
    return TRUE; 
    ) 
    //   IDD_RED 
    afx msg void CSampleDialog::OnRed() 
    MessageBox("Red", "Color Selected"); 
    ) 
    //   IDD_GREEN 
    afx msg void CSampleDialog::OnGreen() 
    ( 
    MessageBox("Green", "Color Selected") ; 
    ) 
    //   IDD SELFRUIT  LBN DBLCLK 
    afx_msg void CSampleDialog::OnSelect() 
    { 
    CListBox *lbptr = (CListBox *) GetDlgItem(IDD_LB1); 
    char strl[80], str2[80]; 
    int i; 


    106                                     MFC:   


    i = lbptr->GetCurSel (); //    
    if(i==LB_ERR) wsprintf(strl, "No Selection"); 
    else { 
    lbptr->GetText (i, strl); //   
    wsprintf (str2, " at index %d.", i); 
    strcat(strl, str2) ; 
    ) 
    MessageBox(strl, "Selection Made"); 
    } 
    CApp App; //    

            
 DIALOG.RC  1DS.H,  .     
 . 5.3. 

    . 5.3.    

    ,    ^  . -,  
    .     
  LBN_DBLCLK.  ,   
   ,  .   
  ,     (   
     ),     Select Fruit 
( ).     .    
       : OnSelectQ. 

    5.                                                 107 

     OnSelectQ       
 GetCurSelQ.     ,  - ,  
 LB_ERR.         
GetTextQ.            . 

       

      ,      , 
  .     ,    
     .     
,      .   
    DIALOG.RC  : 

    SampleDialog DIALOG 18, 18, 142, 92 
    CAPTION "Sample Dialog Box" 
    STYLE DS_MODALFRAME | WS_POPUP I WS_CAPTION I WS_SYSMENU 
    { 
    DEFPUSHBUTTON "Red", IDD_RED, 56, 45, 30, 14, 
    WS_CHILD I WS_VISIBLE I MS_TABSTOP 
    PUSHBUTTON "Green", IDD_GREEN, 96, 45, 30, 14, 

    WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    PUSHBUTTON "Cancel", IDCANCEL, 52, 65, 37, 14, 
    
    WS_CHILD I MS_VISIBLE | WSJTABSTOP 
    LISTBOX IDD_LB1, 2, 10, 47, 32, LBS_NOTIFY | WS_CHILD | 
    
    WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_TABSTOP 
    PUSHBUTTON "Select Fruit", IDD_SELFRUIT, 5, 45, 42, 14, 
    
    WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    PUSHBUTTON "Edit OK", IDD_EDITOK, 68, 22, 30, 14, 

    WS_CHILD I WS^VISIBLE | HS_TABSTOP 
    EDITTEXT IDD_EB1, 68, 8, 72, 12, ES_LEFT I ES_AUTOHSCROLL | 

    WS_CHILD I WS_VISIBLE | WS_BORDER I WS_TABSTOP 
    } 

          Edit OK,    
    ,     
   .      .  
  IDD_EB1.    Edit OK  IDD_EDITOK. 
       EDITTEXT : 

    EDITTEXT EDID, X, , Width, Height [,] 

      EDID    .   
     (X,Y),      
Width  Height.     .     
 :         . 
        .   
      . 

    108                                     MFC:   

          IDS.H: 

    ftdefine IDD_EB1         204 
    #define IDD_EDITOK      205 

              
 .         .  
  ,       
.       .  
 ,      . 
         ,    , 
  GetWindowTextQ.     CWnd,   
CEdit (,  CEdit   CWnd,)   : 

    int CWnd::GetWindowText(LPSTR IpszStr, int Max) const; 

              
,   Ips^Str.   ,  
  ,   .    
 .   GetWindowTextQ   ,   
    .      
 .       , 
  .    GetWindowText()    
,    . (     
 -  CEdit.) 
          .    
    -  CWnd,  
SetWindowText().       , 
   .   : 

    void CWnd::SetWindowText(LPCSTR JpszStr) ; 

      IpszSfr    ,   
   . 
               
 Edit OK.     DIALOG.H,   
 : 

    // DIALOG.H 
    //       
    class CMainWin : public CFrameWnd 
    ( 
    public: 
    CMainWin () ; 
    //    
    afx msg void OnDialogO; 
    afx__msg void OnExit(); 
    afx msg void OnHelpO; 


    5.                                                 109 


    DECLARE_MESSAGE_MAP() }; 
    //      
    class CApp : public CWinApp 
    ( 
    public: 
    BOOL Initlnstance (); 
    }; 
    //       
    class CSampleDialog : public CDialog 
    ( 
    public: 
    CSampleDialog(char *DialogName, CWnd *0wner) : 
    CDialog(DialogName, Owner) {} 
    BOOL OnInitDialog() ; 
    afx_nisg void OnRedO; 
    afx_msg void OnGreenf); 
    afx msg void OnSelect(); 
    afx msg void OnEditOK(); 
    DECLARE_MESSAGE_MAP() }; 
      ,    : 
    //     
    ^include <afxwin.h> 
    ^include <string.h> 
    ^include "dialog.h" 
    #include "ids.h" 
    CMainWin: .-CMainWin () 
    ( 
    Create(NULL, "Demonstrate Dialog Boxes", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "DialogMenu") ; 
    //     
    if(!LoadAccelTable("DialogMenu")) 
    MessageBox ("Cannot Load Accelerators", "Error"); 
    } 
    //   
    BOOL CApp::Initlnstance() 
    { 
     pMainWnd = new CMainWin; 
    m_pMainWnd->ShowWindow(m_nCmdShow) ; 
    m_pMainWnd->UpdateWindow() ; 


    110                                    MFC:   


    return TRUE; 
    ) 
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_COMMAND(IDM_DIALOG, OnDialog) 
    ON__COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    //   IDM_DIALOG 
    afx msg void CMainWin::OnDialog() 
    ( 
    CSampieDialog diagOb("SampleDialog", this); 
    diagOb.DoModal(); //     
    } 
    //   IDM EXIT 
    afx_msg void CMainWin::OnExit() 
    ( 
    int response; 
    response = MessageBox("Quit the Program?", "Exit", MB_YESNO) ; 
    if (response == IDYES) 
    SendMessage(WM CLOSE); //   
    } 
    //   IDM HELP 
    afx_msg void CMainWin::OnHelp() 
    { 
    MessageBox("Dialog Demo", "Help"); 
    } 
    //      
    BEGIN_MESSAGE_MAP(CSampieDialog, CDialog) 
    ON__COMMAND(IDD_RED, OnRed) 
    ON_COMMAND(IDD_GREEN, OnGreen) 
    ON_COMMAND(IDD_SELFRUIT, OnSelect) 
    ON_COMMAND(IDD_EDITOK, _OnEditOK) 
    ON_LBN_DBLCLK(IDD_LB1, 'OnSelect) 
    END_MESSAGE_MAP() 
    //   . 
    BOOL CSampieDialog::OnInitDialog() 
    { 
    CDialog::OnInitDialog(); //     
    CListBox *lbptr = (CListBox *) GetDlgItem(IDD_LB1); 
    //   
    lbptr->AddString("Apple") ; 
    lbptr->AddString("Orange") ; 
    lbptr->AddString("Pear") ; 


    5.                                                 111 


    lbptr->AddString("Grape") ; 
    //    
    CEdit *ebptr = (CEdit *) GetDlgItem(IDD_EB1); 
    ebptr->SetWindowText("Sample Text") ; 
    return TRUE; 
    ) 
    //   IDD RED 
    afx msg void CSampleDialog::OnRed() 
    ( 
    MessageBox("Red", "Color Selected"); 
    ) 
    //   IDD_GREEN 
    afx msg void CSampleDialog::OnGreen() 
    ( 
    MessageBox("Green", "Color Selected"); 
    ) 
    //   IDD_SELFRUIT  LBN_DBLCLK 
    afx msg void CSampleDialog::OnSelect() 
    ( 
    CListBox *lbptr = (CListBox *) GetDlgItem(IDD_LB1); 
    char strl[80], str2 [80]; 
    int i; 
    i = !bptr->GetCurSel (); //    
    if(i==LB_ERR) wsprintf(strl, "No Selection"); 
    else { 
    lbptr->GetText(i, strl); //   
    wsprintf (str2, " at index %d.", i); 
    strcat(strl, str2) ; 
    ) 
    MessageBox (strl, "Selection Made"); 
    } 
    //   IDD EDITOK 
    afx msg void CSampleDialog::OnEditOK() 
    ( 
    CEdit *ebptr = (CEdit *) GetDlgItem(IDD_EB1); 
    char strl [80] ; 
    int i ; 
    i = ebptr->GetWindowText(str, sizeof str-1); 
    MessageBox (str, "Edit Box Contains"); 
    } 
    CApp App; //    


    712                                     MFC:   

     ,       
OnlnitDialogO.     Edit OK    
   .  . 5.4.    . 

    . 5.4.      


       

       ,     , 
   ,    .  
,        .  
   ,        
.  ,     ,   
 - .  ,   ,    
      .  
        . 
            
. -,   ""   CDialog. ..   
         .   
   ,     CSampleDialog,  
  CreateQ,    CDialog.   
  .' 
            
   CDialog: 

    CDialog() ; 


    5.                                                 113 

     ,      .   
   ,     
.      protected  CDialog.  
,        ,   
CDialog. (..       .)  
,    CDialogO     
   . 
         ,     
      CreateQ,   : 

    BOOL CDialog::Create(LPCSTR IpszDialogName, CWnd *Owner=NULL) ; 
    BOOL CDialog: .-Create (UINT ID, CWnd *Owner=WL,L) ; 

        Ips^DialogName     
   .        
 ID.     Owner     
,    ( ) .  Owner  
NULL,      .   
         .  
  CreateQ     . 
        ,      
     ,    .  
,       ,   
.         
  CDialog.      ,   
 DoModalQ       ,     
 .   CreateQ    
 . 
        ,      
  ,          
 WS_VISIBLE.      ShowWindowQ.   
   WS_VISIBLE  ,    
 . 
           DestroyWindow(), 
  EndDialogO,     .  ,   
       OnCancelQ / 
() (     Cancel  ),    
    EndDialogO.  DestroyWindow()  
  CWnd    : 

    BOOL CWnd::DestroyWindow(); 

              
 . 

    114                                    MFC:   


       

        ,    
,  ,      .  
         DIALOG.RC.  
       ,    
   WS_VISIBLE.       
     , ,   ,   : 

    ;   ,  ;      
    #include <afxres.h> ^include "ids.h" 
    DialogMenu MENU 
    { 
    POPUP "&Dialog" < 
    MENUITEM "sSample Dialog", IDM_DIALOG 
    MENUITEM "E&xit", IDM_EXIT 
    ) 
    MENUITEM "SHelp", IDM_HELP 
    DialogMenu ACCELERATORS 
    ( 
    VK_F1, IDM_HELP, VIRTKEY 
    VK_F2, IDM_DIALOG, VIRTKEY 
    VK_F3, IDM_EXIT, VIRTKEY 
    } 
    SampleDialog DIALOG 18, 18, 142, 92 
    CAPTION "Sample Dialog Box" 
    
    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | 
    WS_SYSMENU I WS_VISIBLE 
    
    DEFPUSHBUTTON "Red", IDD_RED, 56, 45, 30, 14, 
    
    WS_CHILD ] WS_VISIBLE I WS_TABSTOP 
    PUSHBUTTON "Green", IDD_GREEN, 96, 45, 30, 14, 
    
    WS_CHILD | WS_VISIBLE I WS_TABSTOP 
    PUSHBUTTON "Cancel", IDCANCEL, 52, 65, 37, 14, 
    
    WS^CHILD | WS_VISIBLE I WS_TABSTOP 
    LISTBOX IDD_LB1, 2, 10, 47, 32, LBS_NOTIFY | WS_CHILD | 
    
    WS_VISIBLE I WS_BORDER I WS_VSCROLL | WS_TABSTOP 
    PUSHBUTTON "Select Fruit", IDD_SELFRUIT, 5, 45, 42, 14, 
    
    WS_CHILD I WS_VISIBLE I WSJTABSTOP 
    PUSHBUTTON "Edit OK", IDD_EDITOK, 68, 22, 30, 14, 
    
    WS_CHILD | WS_VISIBLE I WSJTABSTOP 
    EDITTEXT IDD_EB1, 68, 8, 72, 12, ES_LEFT | ES_AUTOHSCROLL | 
    
    WS_CHILD | WS_VISIBLE I WS_BORDER | WS_TABSTOP 
    } 
    

    5.                                                 115 

      IDS.H   ,     : 

    // IDS.H 
    #define IDM_DIALOG    100 
    #define IDM_EXIT      101 
    #define IDM_HELP      102 
    tdefine IDD_RED       200 
    #define IDD_GREEN     201 
    #define IDD_SELFRUIT 202 
    #define IDD_LB1       203 
    #define IDD_EB1       204 
    #define IDD_EDITOK    205 

          : 
    1.     CDialog. 
    2.       CreateQ,   DoModalQ. 
    3.   )  ,    
    DestroyWindow().   ,  
  : 

    // DIALOG.H       
    //       
    class CMainWin : public CFrameWnd 
    ( 
    public: 
    CMainWin() ; 
    //    
    afx_msg void OnDialogO; 
    afx msg void OnExitO; 
    afx msg void OnHelpO; 
    DECLARE_MESSAGE_MAP() 
    }; 
    //      
    class CApp : public CWinApp 
    ( 
    public: 
    BOOL Initlnstance(); 
    }; 
    //       
    class CSampleDialog : public CDialog 
    { 
    public: 
    CSampleDialog() : CDialog() (} 


    116                                    MFC:   


    BOOL OnInitDialog(); 
    void OnCancel() ; 
    afx msg void OnRed(); 
    afx msg void OnGreenO; 
    afx msg void OnSelectO; 
    afx msg void OnOK () ; 
    DECLARE_MESSAGE_MAP() 
    }; 

             
,     . 

    //      
    ^include <afxwin.h> 
    ^include <string.h> 
    ftinclude "dialog.h" 
    ftinclude "ids.h" 
    //      
    CSampleDialog diagOb; 
    int DIgActive = 0; //  ,     
    CMainWin::CMainWin() ( 
    Create(NULL, "Demonstrate a Modeless Dialog Boxes", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "DialogMenu"); 
    //     
    if ( 'LoadAccelTable("DialogMenu")) 
    MessageBox ("Cannot Load Accelerators", "Error"); 
    } 
    //   
    BOOL CApp::Initlnstance() 
    ( 
    m_pMainWnd = new CMainWin; 
    m pMainWnd->ShowWindow(m_nCmd3how) ; 
    m_pMainWnd->UpdateWindow() ; 
    return TRUE; 
    > 
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_COMMAND(IDM_DIALOG, OnDialog) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 


    5.                                                 717 


    //   IDM_DIALOG 
    afx_msg void CMainWin::OnDialog() 
    < 
    if(DIgActive) return; //     
    DIgActive = 1; 
    //      
    //    
    diagOb.Create("SampleDialog", this) ; 
    //   IDM__EXIT 
    afx msg void CMainWin::OnExit() 
    ( 
    int response; 
    response = MessageBox("Quit the Program?", "Exit", MB_YESNO) ; 
    if(response == IDYES) 
    SendMessage(WM_CLOSE); //   
    } 
    //   IDM HELP 
    afx msg void CMainWin::OnHelp() 
    { 
    MessageBox("Dialog Demo", "Help"); 
    ) 
    //      
    BEGIN_MESSAGE_MAP(CSampleDialog, CDialog) 
    ON__COMMAND(IDD_RED, OnRed) 
    ON_COMMAND(IDD_GREEN, OnGreen) 
    ON_COMMAND(IDD_SELFRUIT, OnSelect) 
    ON_COMMAND(IDD_EDITOK, OnEditOK) 
    ON_LBN_DBLCLK(IDD_LB1, OnSelect) 
    END_MESSAGE_MAP() 
    //   . 
    BOOL CSampleDialog: .-OnInitDialog () 
    { 
    CDialog::OnInitDialog (); //     
    CListBox *lbptr = (CListBox *) GetDlgItem(IDD_LB1) ; 
    //   
    lbptr->AddString("Apple") ; 
    lbptr->Add3tring("Orange") ; 
    lbptr->AddString("Pear") ; 
    lbptr->AddString("Grape") ; 
    //    
    CEdit *ebptr = (CEdit *) GetDlgItem(IDD_EB1) ; 
    ebptr->SetWindowText("Sample Text") ; 


    118                                    MFC:   


    return TRUE; 
    i 
    //     
    void CSampleDialog::OnCancel() 
    DIgActive = 0; //    
    DestroyWindow(); 
    } 
    //   IDD RED 
    afx msg void CSampleDialog::OnRed() 
    < 
    MessageBox("Red", "Color Selected"); 
    t 
    //   IDD_GREEN 
    afx_msg void CSampleDialog::OnGreen() 
    { 
    MessageBox("Green", "Color Selected"); 
    ) 
    //   IDD_SELFRUIT  LBN_DBLCL'K 
    afx_msg void CSampleDialog::OnSelect() 
    { 
    CListBox *lbptr = (CListBox *) GetDlgItem(IDD_LB1); 
    char strl [80], str2 [80] ; 
    int i; 
    i = !bptr->GetCurSel(); //    
    
    if(i==LB_ERR) wsprintf(strl, "No Selection"); 
    else { 
    lbptr->GetText (i, strl); //   
    wsprintf (str2, " at index %d.", i) ; 
    strcat (strl, str2) ; 
    ) 
    MessageBox(strl, "Selection Made"); 
    //   IDD_EDITOK 
    afx_msg void CSampleDialog::OnEditOK() 
    { 
    CEdit *ebptr = (CEdit *) GetDlgItem(IDD_EB1); 
    char strl [80] ; 
    int i; 
    i = ebptr->GetWindowText (str, sizeof str-1); 
    MessageBox (str, "Edit Box Contains"); 
    } 
    CApp App; //    


    5.                                                  119 

         . 5.5.  ,   
 ,      (  
    Exit). 

    . 5.5.       

      ,  ,      
 DIgActive,     .   
     .   
   - ,    .  
,      CDialog    
 ,          
,  ,   ,      
^  . '""""~"""~ 
               
    .      
.          
     . 

    120                                     MFC:  