       

      ,   ,     
  .        , 
   ,  , 
  (     ),   
 .   ,  ,    5, 
   . 

123


       

         ,   
    .     
 ,      .  ,  
       
 .       ,  
,    ( ),      
 ( ).    ,    
.    MFC   CButton. 
            
      .    
 CHECKBOX,    : 

    CHECKBOX "", CBID, X, , Width, Height [,] 

         ,    
   .       
  (X,Y),      Width  Height. 
    .     ,  
      ,    
     [TAB].  ,  
    .      
         . 
   ,     .  
  CHECKBOX   , 
       . (  
,    .)   ,  Windows 
   ,    
.      AUTOCHECKBOX.   
  ,   CHECKBOX.       
 Windows      (  ). 

    :    Windows 3.1  AUTOCHECKBOX   
.         
,   ,      
CONTROL,   BUTTON   BS_AUTOCHECKBOX. 

        ,    
 ,   ,     
.        .  
 . 

    ; DIALOG.RC 
    #include <afxres.h> 
    If-include "ids.h" 
    DialogMenu MENU 


    124                                     MFC:   


    { 
    POPUP "SDialog" 
    { 
    MENUITEM "&Dialog", IDM_DIALOG 
    MENUITEM "SStatus", IDM_STATUS 
    MENUITEM "E&xit", IDM_EXIT 
    } 
    MENUITEM "&Help", IDM_HELP  
    DialogMenu ACCELERATORS 
    ( 
    VK_F1, IDM_HELP, VIRTKEY 
    VK_F2, IDMJ3IALOG, VIRTKEY 
    VK_F3, IDM_STATUS, VIRTKEY 
    VK_F4, IDM_EXIT, VIRTKEY 
    } 
    SampleDialog DIALOG 18, 18, 142, 92 
    CAPTION "Test Dialog Box" 
    STYLE DS_MODALFRAME I WS_POPUP I WS_CAPTION I WS_SYSMENU 
    { 
    PUSHBUTTON "OK", IDOK, 77, 44, 30, 13, 
    WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    
    PUSHBUTTON "Cancel", IDCANCEL, 74, 65, 37, 14, 
    WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    
    CHECKBOX "Checkbox I", IDD_CB1, 4, 10, 52, 12 
    
    AUTOCHECKBOX "Checkbox 2", IDD_CB2, 4, 22, 52, 12 
    ) 

         IDS.H,    
.    ,      
  . 

    // IDS.H 
    #define IDMJ3IALOG    100 
    #define IDM_EXIT      101 
    #define IDM_HELP      102 
    #define IDM_STATUS    103 
    #define IDD_CB1       200 
    #define IDD_CB2       201 
    #define IDD_CT1       300 
    #define IDD_RB1       400 
    #define IDD_RB2       401 
    #define IDD_GB1       500 
    #define IDD_GB2       501 


    6.                                J25 


       

     ,        
(  ,     [SPACEBAR]),   
  WM_COMMAND    BN_CLICKED.  
      ON_BN_CLICKED().   
        : 
   Windows.      , 
   ,    .    
  ON_BN_CLICKED()       
     -,   
   . 

          

          , 
   SetCheckQ,    CButton. 
  : 

    void CButton::SetCheck (int How); 

      SetCheckQ  How    
.     1,     
"",     "".      
     . 
    ,         
    .       
SetCheckQ.         . 
            
 GetCheck().   : 

    int CButton::GetCheck() const; 

      1,   ,  0    . 
       ,      
   .      , 
    ,      
 .    .    
,    . 
       DIALOG.H,    . 
 ,   ()  CDialog    CSampleDialog. 

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


    126                                     MFC:   


    CMainWinO ; 
    //    
    afx_msg void OnDialogO; 
    afx msg void OnStatusO; 
    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) (} 
    afx_msg void OnOK(); 
    afx msg void OnCBl(); 
    DECLARE_MESSAGE_MAP() 
    ); 
      : 
    //     
    tinclude <afxwin.h> 
    #include <string.h> 
    ^include "dialog.h" 
    #include "ids.h" 
    //    
    int cbstatusl=0, cbstatus2=0; 
    CMainWin::CMainWin() 
    { 
    Create(NULL, "Using Check Boxes", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "DialogMenu") ; 
    //     
    if('LoadAccelTable("DialogMenu") ) 


    6.                                127 


    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_STATUS, OnStatus) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    //   IDM_DIALOG 
    afx msg void CMainWin::OnDialog() 
    ( 
    CSampleDialoq diagOb("SampleDialog", this); 
    diagOb.DoModal(); //     
    //   IDM_STATUS 
    afx msq void CMainWin::0n3tatus () 
    ( 
    char str[255] ; 
    if (cbstatusl) 
    wsprintf (str, "Checkbox 1 is checked.\n"); 
    else 
    wsprintf (str, "Checkbox 1 is cleared.\n"); 
    if (cbstatus2) 
    strcatfstr, "Checkbox 2 is checked."); 
    else 
    strcatfstr, "Checkbox 2 is cleared."); 
    MessageBox (str, "Status"); 
    //   IDM_EXIT 
    afx_msg void CMainWin::OnExit() 
    { 
    int response; 


    128                                    MFC:   


    response = MessageBox("Quit the Program?", "Exit", MB YESNO); 
    if(response == IDYES) 
    SendMessage(WM_CLOSE); //   
    ) 
    //   IDM_HELP 
    afx msg void CMainWin::OnHelp() 
    ( 
    MessageBox("More Controls", "Help"); 
    i 
    //      
    BEGIN_MESSAGE_MAP(CSampleDialog, CDialog) 
    ON_BN_CLICKED(IDD_CB1, OnCBl) 
    END_MESSAGE_MAP() 
    //    IDOK 
    afx msg void CSampleDialog::OnOK() 
    ( 
    //     
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CB1); 
    CButton *cb2ptr = (CButton *) GetDlgItem(IDD_CB2); 
    cbstatusl = cblptr->GetCheck() ; 
    cbstatus2 = cb2ptr->GetCheck(); 
    EndDialog(0) ; 
    } 
    //   ON BN_CLICKED    
    afx msg void CSampleDialog::OnCBl() 
    ( 
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CB1); 
    cbipti-->SetCheck(1) ; 
    CApp App; //    

         ,   
,    Dialog  Dialog.   
 ,       Status.   
   . 6.1. 

    6.                                129 


    . 6.1.      

         . -, 
 ,      , cbstatusl  
cbstatus2,      .  
   ()       , 
      Cancel.     
    Windows:    
      ,    
     ,   Cancel. 
    -,  ,      CButton  
       
GetDlgItem().   -  CButton   
 .       5,   
  GetDlgItem(). 
     ,    1()   BN_CLICKED, 
        ( 
 ).        . 

       

     ,  , , ,    
. -,      
   . ..    . 

    130                                     MFC:   

    -,     ,    
 .  ,      , 
   .     ,   
   . 

       

          ,  
  ,     
.  ,       
 ,    Windows.      
 ,    .   
  1()   : 

    //   ON_BN_CLICKED    
    afx msg void CSampleDialoq::OnCBl() 
    { 
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CBl); 
    //   
    if(cblptr->GetCheck() ) cblptr->SetCheck(0) ; 
    else cblptr->SetCheck(l); 


      

      ,      ,  
 ,   ,  (..  ). 
     ,    .  
,       
     . ,  ,  
   ,   . , 
, ,        
  OnInitDialogO.    ,    
        
  .     OnInitDialogO 
      . 

    //    
    BOOL CSampleDialog::OnInitDialog() 
    1 
    CDialog::OnInitDialog (); //     
    //    
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CBl); 
    CButton *cb2ptr = (CButton *) GetDlgItem(IDD_CB2) ; 
    cblptr->SetCheck(cbstatusl) ; 
    cb2ptr->SetCheck(cbstatus2) ; 
    return TRUE; 


    6.                                131 

        ,   
     .  
     .    ,   
 ,    ""  Windows.    
DIALOG.H,      CSampleDialog   OnInitDialogQ: 

    // DIALOG.H 
    //  ,   OnInitDialog() 
    //       
    class CMainWin : public CFrameWnd 
    { 
    public: 
    CMainWin() ; 
    //    
    afx msg void OnDialog(); 
    afx msg void OnStatusO; 
    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) (} 
    afx msg void OnOK () ; 
    BOOL OnInitDialog(); 
    afx msg void OnCBl (); 
    DECLARE_MESSAGE_MAP() }; 
        : 
    //        
    #include <afxwin.h> 
    #include <string.h> 


    132                                     MFC:   


    #include "dialog.h" 
    ^include "ids.h" 
    //    
    int cbstatusl=0, cbstatus2=0; 
    CMainWin::CMainWin() ( 
    Create(NULL, "Using Check Boxes", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "DialogMenu"); 
    //     
    if ( !LoadAccelTable("DialogMenu")) 
    MessageBox("Cannot Load Accelerators", "Error"); 
    ) 
    //   
    BOOL CApp::Initlnstance() 
    ( 
    m pMainWnd = new CMainWin; 
    m pMainWnd->ShowMindow(m nCmdShow) ; 
    m_pMainHnd->UpdateWindow(); 
    return TRUE; 
    \ 
    I 1     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_COMMAND(IDM_DIALOG, OnDialog) 
    ON_COMMAND(IDM_STATUS, OnStatus) 
    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_STATUS 
    afx msg void CMainWin::OnStatus () 
    ( 
    char str[255] ; 
    if(cbstatusl) 
    wsprintf(str, "Checkbox 1 is checked.\n"); 
    else 
    wsprintf(str, "Checkbox 1 is cleared.\n"); 


    6.                                133 


    if(cbstatus2) 
    strcat(str, "Checkbox 2 is checked."); 
    else 
    strcat (str, "Checkbox 2 is cleared."); 
    MessageBox(str, "Status"); 
    } 
    //   IDM EXIT 
    afx msq void CMainWin::OnExit() 
    1 
    int responses
    response = MessageBox("Quit the Program?", "Exit", MB_YESNO); 
    if (response == IDYES) 
    SendMessage(WM_CLOSE); //   
    //   IDM HELP 
    afx msg void CMainWin::OnHelp () 
    { 
    MessageBox ("More Controls", "Help"); 
    } 
    //      
    BEGIN_MESSAGE_MAP(CSampleDialog, CDialog) 
    
    ON_BN__CLICKED(IDD_CB1, OnCBl) 
    END_MESSAGE_MAP() 
    
    //    
    BOOL CSampleDialog::OnInitDialog () { 
    CDialog::OnInitDialog (); //     
    
    //    
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CB1); 
    CButton *cb2ptr = (CButton *) GetDlgItem(IDD_CB2); 
    cblptr->SetCheck(cbstatusl) ; 
    cb2ptr->SetCheck (cbstatus2) ; 
    return TRUE; 
    } 
    //    IDOK 
    afx msg void CSampleDialog::OnOK () 
    1 
    
    //     
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CBl); 
    CButton *cb2ptr = (CButton *) GetDlgItem(IDD_CB2) ; 
    cbstatusl = cblptr->GetCheck(); 


    134                                     MFC:   


    cbstatus2 = cb2ptr->GetCheck() ; 
    EndDialog(0) ; 
    ) 
    //   ON BN CLICKED    
    afx_msg void CSampleDialog::OnCBl() 
    ( 
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CBl) ; 
    //   
    if(cblptr->GetCheck()) cblptr->SetCheck(0) ; 
    else cblptr->SetCheck(1); 
    CApp App; //    


       

      ,       
 . ,  " "  , 
     ,     
 ,       
  .    ,     
 ,        . 
            
    GROUPBOX, . 
        ,     
    .    : 

     "", CTID, X, Y, Width, Height [,] 

         . CTID     
  .     ,   
    (X, Y),     Width  
Height.     .    ,   
       .  , 
     .    ,  . 
     GROUPBOX   .     
       .  
    .    GROUPBOX : 

    GROUPBOX "", GBID, X, , Width, Height [,] 

         . GBID    
.        (,),    
  Width  Height.     , 
,  ,     . 

    6.                                135 

         ,   
       ,   
 : 
    
    GROUPBOX "Checkboxes", IDD_GB1, I, 1, 56, 34 
     "This is text", IDD_CT1, 1, 44, 50, 24 

      ,  ,      
 Dialog  Dialog.    . 6.2. ,   
       ,    
  . 

    . 6.2.     


       

      ,   ,   
.        
 .       
(   )    .   
"" (..     ),  ,      
 .   "" ( ), , , 
 . Windows     : 
  .    (   
 )      , 
   .   

    136                                    MFC:   

        .   
  ,   ,   
    ,     
 .         CButton. 
       ,     
     .    
   AUTORADIOBUTTON,    : 

    AUTORADIOBUTTON "", RBID. X, , Width, Height [,] 

         ,    
  . RBID    .    
 ,    ,    (X,Y),  
          Width  
Height.     .    ,   
     ,      
      [TAB]. 

    :     Windows 3.1  AUTORADIOBUTTON  
 .         
,        CONTROL, 
  BUTTON    BS_AUTORADIOBUTTON. 

       ,       
  .       
  ,  Windows    
  ,     . ,  
 -       . 
,       . 
      (  )    
       CButton::SetCheck().  
        CButton::GetCheck(). 
       ,     . 

    :         
           
 SetCheck)).      Windows ,  
           
          . 

          ,   
         . 
 ,         
. , ,  ,     
  . 
    
    AUTORADIOBUTTON "Radio I", IDD_RB1, 66, 10, 48, 12 
    AUTORADIOBUTTON "Radio 2", IDD_RB2, 66, 22, 48, 12 
    GROUPBOX "Radio Group", IDD_GB2, 64, 1, 51, 34 
    

    6.                                137 

           ,  
  : 

    ; DIALOG.RC 
    #include <afxres.h> 
    #include "ids.h" 
    DialogMenu MENU { 
    POPUP "&Dialog" 
    { 
    MENUITEM "&Dialog", IDM_DIALOG 
    MENUITEM "SStatus", IDM_STATUS 
    MENUITEM "E&xit", IDM_EXIT 
    ) 
    
    MENUITEM "SHelp", IDM_HELP 
    } 
    
    DialogMenu ACCELERATORS 
    { 
    VK_F1, IDM_HELP, VIRTKEY 
    VK_F2, IDM_DIALOG, VIRTKEY 
    VK_F3, IDM_STATUS, VIRTKEY 
    VK_F4, IDM_EXIT, VIRTKEY 
    } 
    SampleDialog DIALOG 18, 18, 142, 92 
    CAPTION "Test Dialog Box" 
    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 
    ( 
    PUSHBUTTON "OK", IDOK, 11, 44, 30, 13, 
    MS_CHILD I WS_VISIBLE | WS_TABSTOP 
    
    PUSHBUTTON "Cancel", IDCANCEL, 74, 65, 37, 14, 
    WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    CHECKBOX "Checkbox I", IDD_CB1, 4, 10, 52, 12 
    AUTOCHECKBOX "Checkbox 2", IDD_CB2, 4, 22, 52, 12 
    
    GROUPBOX "Checkboxes", IDD_GB1, 1, 1, 56, 34 
     "This is text", IDD_CT1, 1, 44, 50, 24 
    
    AUTORADIOBUTTON "Radio I", IDD_RB1, 66, 10, 48, 12 
    AUTORADIOBUTTON "Radio 2", IDD_RB2, 66, 22, 48, 12 
    GROUPBOX "Radio Group", IDD_GB2, 64, 1, 51, 34 
    } 

       ,   ,   
 . ( DIALOG.H   .)  , 
     ,     
 .       
 rbstatusl  rbstatus2.     ()  
  .      

    138                                    MFC:   

          ,    
      Select   Dialog. 

    //     
    ^include <afxwin.h> 
    #include <string.h> 
    ^include "dialog.h" 
    #inrlude "ids.h" 
    //    
    int cbstatusl=0, cbstatus2=0; 
    //    
    int rbstatusl=0, rbstatus2=0; 
    CMainWin::CMainWin() ( 
    Create (NULL, "Using Radio Buttons", 
    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_STATUS, OnStatus) 
    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(); //     
    

    6.                                139 


    //   IDM_STATUS 
    afx_msg void CMainWin::OnStatus() 
    { 
    char str [255] ; 
    if (cbstatusl) 
    wsprintf (str, "Checkbox 1 is checked.\n"); 
    else 
    wsprintf (str, "Checkbox 1 is cleared.\n"); 
    if (cbstatus2) 
    strcat(str, "Checkbox 2 is checked.\n"); 
    else 
    strcattstr, "Checkbox 2 is cleared.\n"); 
    if (rbstatusl) 
    strcattstr, "Radio 1 is checked.\n"); 
    else 
    strcattstr, "Radio 1 is cleared.\n"); 
    if (rbstatus2) 
    strcattstr, "Radio 2 is checked."); 
    else 
    strcat(str, "Radio 2 is cleared."); 
    MessageBox(str, "Status"); 
    } 
    //   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("More Controls", "Help"); 
    ) 
    //      
    BEGIN_MESSAGE_MAP(CSampleDialog, CDialog) 
    
    ON_BN_CLICKED(IDD_CB1, OnCBl) 
    END_MESSAGE_MAP() 
    
    //    
    BOOL CSampleDialog::OnInitDialog() 


    140                                    MFC:   


    { 
    CDialog::OnInitDialog(); //     
    
    //    
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CB1); 
    CButton *cb2ptr = (CButton *) GetDlgItem(IDD_CB2); 
    cblptr->SetCheck(cbstatusl) ; 
    cb2ptr->SetCheck(cbstatus2) ; 
    
    //    
    CButton *rblptr = (CButton *) GetDlgItem(IDD_RB1); 
    CButton *rb2ptr = (CButton *) GetDlgItem(IDD_RB2); 
    rblptr->SetCheck (rbstatusl) ; 
    rb2ptr->SetCheck(rbstatus2) ; 
    return TRUE; 
    } 
    //    IDOK 
    afx msg void CSampleDialog::OnOK() 
    ( 
    
    //     
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CB1); 
    CButton *cb2ptr = (CButton *) GetDlgItem(IDD_CB2); 
    cbstatusl = cblptr->GetCheck(); 
    cbstatus2 = cb2ptr->GetCheck() ; 
    
    //     
    CButton *rblptr = (CButton *) GetDlgItem(IDD_RB1); 
    CButton *rb2ptr = (CButton *) GetDlgItem(IDD_RB2) ; 
    rbstatusl = rblptr->GetCheck() ; 
    rbstatus2 = rb2ptr->GetCheck() ; 
    EndDialog(0) ; 
    i 
    //   ON BN_CLICKED    
    afx msg void CSampleDialog::OnCBl() 
    ( 
    CButton *cblptr = (CButton *) GetDlgItem(IDD_CB1) ; 
    
    //   
    if (cblptr->GetCheck()) cblptr->SetCheck(0) ; 
    else cblptr->SetCheck(l); 
    } 
    CApp App; //    

         . 6.3. 

    6.                                141 

    . 6.3.       


       

      ,      ,  
 .  Windows     .   
     (  ),   
    (, ,   }. 
         
.      CWnd,    
   CScroIlBar.   ,     , 
        .   
     . 
     ,    - ,  
    .   ,    
,         Windows. 

        

     ,      ,  
   .       
,     Create()      
   WS_VSCROLL / WS_HSCROLL.      
        .   

    142                                    MFC:   

       ,  WS_VSCROLL   
 ,   WS_HSCROLL   .    
,      . 

        

           SCROLLBAR, 
   : 

    SCROLLBAR SBID, X, , Width, Height [,] 

      SBID    .   
     (X,Y),      
Width  Height.     .    
 SBS_HORZ, ..  .    
   SBS_VERT.      
    [TAB],    
 WS_TABSTOP.       : 

    SCROLLBAR ID_SB1, 130, 10, 10, 70, SBS_VERT | WS_TABSTOP 


        

         ,     
 WM_COMMAND.       WM_VSCROLL, 
 WM_HSCROLL       
, .     OnVScroll() 
 OnHScroll(),   : 

    afx_msg void CWnd::OnVScroll(UINT SBCode, INT Pos, 
    CScrollBar *SB) ; 
    afx_msg void CWnd::OnHScroll(HINT SBCode, INT Pos, 
    CScrollBar *SB) ; 

     SBCode       . 
    : 

    SB_LINEUP         SB_LINEDOWN    SB_PAGEUP   SB_PAGEDOWN 
    SB_LINELEFT       SB_LINERIGHT   SB_PAGELEFT SB_PAGER1GHT 
    SB_THUMBPOSITION SB_THUMBTRACK 

          ,    
    ( ,    
)       SB_LINEUP.   
        SB_LINEDOWN. 
,      SBJPAGEUP  SBJPAGEDOWN. 
          ,    
         
SB_LINELEFT.          
 SB_LINERIGHT.      
SB_PAGELEFT  SBJPAGERIGHT. 

    6.                                143 

               
  SB_THUMBPOSITION.       
   ,     
SB_THUMBTRACK.     ,    
 .   Pos     . 
         ,   SB 
  NULL.        
,   SB      . 

          

           .  
    ,    
 .         0  100 
.           
 0,      . 
            SetScrollRange(), 
   :    ,   
.      CWnd,    : 

    void CWnd::SetScroliRange(int Which, ink Min, int Max, BOOL Redraw^TRUE); 

      Which ,      
 .    ,   Which  
 SB_VERT,      SB_HORZ.  Min    
  .   Redraw  TRUE,    
    .      . 
            
SetScrollRange(),   CScrollBar.   : 

    void CScrollBar:: SetScroliRange (int Min, int Max, BOOL Redraw=T'WE) ; 

      Min,   Redraw   ,     
.        
.     GetScrolIRangeQ,   
    CWnd  CScrollBar: 

    void CWnd::GetScrollRange(int Which, LPINT IpMin, LPINT IpMax}const; 
    void CScrollBar::GetScrollRange(LPINT IpMin, LPINT IpMax) const; 

         Which    SB_VERT,  
SB_HORZ.          
  ,     IpMin  IpMax, . 

    144                                     MFC:   


         

        .  ,  
      .    
  SetScrollPosQ.      
    CWnd,    : 

    int CHnd: : SetScrollPos (int Which, int Pos, BOOL Redraw=TWE) ; 

      Which ,      
  .    ,   Which 
  SB_VERT,     SB_HORZ.  Pos  
 .        
   .   Redraw  TRUE,   
      .   
   .      . 
             
 SetScrolIPosQ,    CScrolIBar.   : 

    int CScrolIBar :: SetScrollPos (int Pos, BOOL Pedraiv=TRUE) ; 

       Pos  Redraw  ,     .  
     . 
            GetScrollPosQ. 
    CWnd  CScrolIBar    : 

    int CWnd::GetScrollPos(int Which) const; 
    int CScrolIBar::GetScrollPos() const; 

        Which     SB_VERT,  
SB_HORZ.        . 

         

         ,    
  ,       
.      : 

    ; SCROLL.RC 
    ;     
    ^include <afxres.h> 
    #include "scrlids.h" 
    DialoqMenu MENU 
    ( 
    POPUP "SDialog" 
    ( 
    MENUITEM "&Scroll Bar Dialog", IDM_DIALOG 
    MENUITEM "E&xit", IDM_EXIT 
    } 
    MENUITEM "SHelp", IDM__HELP 
    } 
    6.                                145 

    DialogMenu ACCELERATORS 
    ( 
    VK_F1, IDM_HELP, VIRTKEY 
    VK_F2, IDM_DIALOG, VIRTKEY 
    VK_F3, IDM_EXIT, VIRTKEY 
    ) 
    SampleDialog DIALOG 18, 18, 142, 92 
    CAPTION "Using a Scroll Bar Control" 
    STYLE DS_MODALFRAME I WS_POPUP | WS_CAPTION | WS_SYSMENU 
    ( 
    GROUPBOX "Slider Position", IDD_GB1, 15, 5, 60, 30 
    SCROLLBAR IDD__SB1, 130, 10, 10, 70, SBS_VERT I WS_TABSTOP 
    ) 
        SCRLIDS.H: 
    // SCRLIDS.H 
    #define IDM_DIALOG 100 
    #define IDM_EXIT    101 
    ftdefine IDM_HELP    102 
    #define IDD_SB1     200 
    #define IDD_GB1     300 

        SCROLL.,    : 

    // SCROLL.H 
    //       
    class CMainWin : public CFrameWnd 
    { 
    public: 
    CMainWin() ; 
    //    
    afx msg void OnDialogO; 
    afx_msg void OnExitO; 
    afx msg void OnHelpO; 
    afx_msg void OnVScroll(UINT SBCode, UINT Pos, CSrollBar *SB) ; 
    afx_msg void OnHScroll(UINT SBCode, UINT Pos, CSrollBar *SB) ; 
    DECLARE_MESSAGE_MAP() 
    }; 
    //      
    class CApp : public CMinApp 
    { 
    public: 
    BOOL Initlnstance () ; 
    }; 

    146                                    MFC:   

    //       
    class CSampleDialog : public CDialog 
    ( 
    public: 
    CSampleDialog(char *DialogName, CWnd *0wner) : 
    CDialog(DialogName, Owner) () 
    BOOL OnInitDialog(); 
    afx_msg void OnVScroll(UINT SBCode, UINT Pos, CSrollBar *SB) ; 
    DECLARE_MESSAGE_MAP() i . 
       : 
    //     
    ^include <afxwin.h> 
    ^include "scroll.h" 
    ftinclude "scrlids.h" 
    #define RANGEMAX 50 
    int ctlsbpos = 0; 
    int vsbpos = 0; 
    int hsbpos = 0; 
    CMainWin::CMainWin() 
    ( 
    Create(NULL, "Using Scroll Bars", 
    
    WS_OVERLAPPEDWINDOW I WS_VSCROLL I WS_HSCROLL, 
    rectDefault, NULL, "DialogMenu"); 
    
    //     
    if('LoadAccelTable("DialogMenu")) 
    MessageBox("Cannot Load Accelerators", "Error"); 
    SetScrollRange(SB_VERT, 0, RANGEMAX); 
    SetScrollRange(SB_HORZ, 0, RANGEMAX); 
    } 
    
    //   
    BOOL CApp::Initlnstance () 
    { 
    m_pMainWnd = new CMainWin; 
    m pMainHnd->ShowWindow(m nCmdShow) ; 
    m pMainWnd->UpdateWindow(); 
    return TRUE; 
    ) 
    //     


    6.                                147 


    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_COMMAND(IDM_DIALOG, OnDialog) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    ON_WM_VSCROLL() 
    ON_WM_HSCROLL() 
    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("Scroll Bars", "Help"); 
    } 
    
    //   WM_VSCROLL 
    afx_msg void CMainWin::OnVScroll(UINT SBCode, UINT Pos, 
    CSrollBar *SB) 
    ( 
    char str [255] ; 
    
    if(SB) return; // , SB   NULL 
    CClientDC dc(this) ; 
    
    switch(SBCode) ( 
    case SB_LINEDOWN: 
    vsbpos++; 
    if(vsbpos>RANGEMAX) vsbpos = RANGEMAX; 
    break; 
    case SB_LINEUP: 
    vsbpos--; 
    if(vsbpos<0) vsbpos = 0; 
    break; 

    148                                    MFC:   

    case SB_THUMBPOSITION: 
    
    vsbpos = Pos; //    
    break; 
    case SB_THUMBTRACK: 
    
    vsbpos = Pos; //    
    break; 
    case SB_PAGEDOWN: 
    vsbpos +=5; 
    if(vsbpos>RANGEMAX) vsbpos = RANGEMAX; 
    break; 
    case SB_PAGEUP: 
    vsbpos -=5; 
    if(vsbpos<0) vsbpos = 0; 
    break; 
    1 
    SetScrollPos(SB_VERT, vsbpos); 
    wsprintf (str, "Vertical Scroll Bar: %d    ", vsbpos); 
    dc.TextOut (2, 2, str, strlen (str)); 
    
    //   WM_HSCROLL 
    afx_msg void CMainWin::OnHScroll(UINT SBCode, UINT Pos, 
    
    CSrollBar *SB) 
    ( 
    char str[255] ; 
    
    if (SB) return; // , SB   NULL 
    CClientDC dc(this); 
    
    switch(SBCode) ( 
    case SB_LINERIGHT: 
    hsbpos++; 
    if(hsbpos>RANGEMAX) hsbpos = RANGEMAX; 
    break; 
    case SB_LINELEFT: 
    hsbpos--; 
    if(hsbpos<0) hsbpos = 0; 
    break; 
    case SB_THUMBPOSITION: 
    hsbpos = Pos; //    
    break; 
    case SB_THUMBTRACK: 
    hsbpos = Pos; //    
    break; 
    case SB_PAGERIGHT: 
    hsbpos +=5; 
    if(hsbpos>RANGEMAX) hsbpos = RANGEMAX; 
    break; 
    case  SB_PAGELEFT: 
    hsbpos -=5; 
    if(hsbpos<0) hsbpos = 0; 


    6.                                149 


    break; 
    ) 
    SetScrollPos(SB_HORZ, hsbpos); 
    wsprintf(str, "Horizontal Scroll Bar: %d    ", hsbpos); 
    dc.TextOut (200, 2, str, strlen(str)); 
    } 
    
    //      
    BEGIN_MESSAGE_MAP(CSampleDialog, CDialog) 
    
    ON_WM_VSCROLL() 
    END_MESSAGE_MAP() 
    
    //    
    BOOL CSampleDialog::OnInitDialog() 
    { 
    CDialog::OnInitDialog(); //     
    CScrollBar *SB = (CScrollBar *) GetDlgItem(IDD_SBl) ; 
    SB->SetScrollRange(0, RANGEMAX) ; 
    ctlsbpos = 0; //      
    return TRUE; 
    ) 
    
    //   WM_VSCROLL 
    afx_msg void CSampleDialog::OnVScroll(UINT SBCode, UINT Pos, 
    
    CSrollBar *SB) 
    { 
    char str[255] ; 
    if(!SB) return; // , SB    
    //     
    CClientDC dc(this); 
    
    switch(SBCode) { 
    case SB_LINEDOWN: 
    ctlsbpos++; 
    if(ctlsbpos>RANGEMAX) ctlsbpos = RANGEMAX; 
    break; 
    case SB_LINEUP: 
    ctlsbpos--; 
    if(ctlsbpos<0) ctlsbpos = 0; 
    break; 
    case SB_THUMBPOSITION: 
    ctlsbpos = Pos; //    
    break; 
    case SB_THUMBTRACK: 
    ctlsbpos = Pos; //    
    break; 
    case SB_PAGEDOWN: 
    ctlsbpos +=5, 


    150                                    MFC:   


    if(ctlsbpos>RANGEMAX) ctlsbpos = RANGEMAX; 
    break; 
    case SB_PAGEUP: 
    ctlsbpos -=5; 
    if(ctlsbpos<0) ctlsbpos = 0; 
    break; 
    ) 
    SB->SetScrollPos (ctlsbpos) ; 
    wsprintf(str, "%d", ctlsbpos); 
    dc.TextOut (55, 30, "     ", 5); 
    dc.TextOut (55, 30, str, strlen(str)); 
    ) 
    CApp App; //    

            
 .       
.      0  50 .    
      . 
      ,    
     .     
       "Slider Position". 
,      ,   
  .      . 6.4. 

    . 6.4.      


    6.                                   151 

      ,       
       ,     
TextOutQ       ,  - 
       ,    
 .       
 . 

     SetScrolllnfoQ  GetScrolllnfoQ 

       MFC     Windows 95 
       
.  GetScrolIInft>()     
,   SetScrollInfo()     
.      ,     
 . 
      Windows 95  GetScrollInfo()  SetScrollInfo()  
  ,  GetScrolIPosQ  SetScrollRange().   
  32- ,       16-. 
     Windows 95 ,    
 , 32-   . (,  
     ,    ,   
  .)        
GetScroIIInfoO  SetScrollInfo(). 
          SetScroIlInfo(), 
   CWnd.   : 

    BOOL CWnd::SetScrollInfo (int Which, LPSCROLLINFO IpSI, BOOL Redraw=TRUE); 

      Which   ,      
.    ,   Which   SB_VERT. 
    SB_HORZ.  ,   
-   |  ,   IpSI (   
).   Redraw  TRUE,     
   .      . 
      ,   
  . 
      SetScrollInfoO,     
, : 

    BOOL CScrollBar: :SetScrollInfo (LPSCROLLINFO IpSI, BOOL Redraw=TRVE); 

          ,      . 
            
 . 
           
GetScroIIInfoO.   ,    CWnd,  
   .    : 

    BOOL CWnd::GetScrollInfo<int Which, LPSCROLLINFO IpSI, UINT Mas^=SIF_ALL) ; 


    J52                                    MFC:     i 

     Which     SB_VERT,  SB_HORZ. 
,  ,   ,  
 IpSI.        
     .   Mask   ,  
    .     . 
      GetScrollInfoO   CScrollBar : 

    BOOL CScrollBar::GetScrollInf(LPSCROLLINFO IpSI, UINT Mask=SIF_A~L,~L) ; 

          .   
   //^/    SCROLLINFO, 
  : 

    typedef struct tagSCROLLINFO 
    ( 
    UINT cbSize; //   SCROLLINFO 
    UINT fMask; //     
    int nMin; //    
    int nMax; //    
    UINT nPage; //   
    int nPos; //   
    int nTrackPos; //      
    ) SCROLLINFO; 

       cbSize   .  ( ) 
 fMask ,        
.      (. 6.1): 

     6.1.   fMask 

                       

    SIFALL 
    SIFDISABLE 
    NOSCROLL 
    SIFPAGE 
    SIFPOS 
    S1FRANGE 
    SIFTRACKPOS 

    To ,  SIF PAGE | SIF POS | SIF RANGE | SIFTRACKPOS 

         ,    ,  
   nPage    nPos   
 nMin  nMax    nTrackPos   
             
  .          
Mask  GetScrollInfoO. 
      nPage        
.  nPos   .  nMin  nMax  
      .   nTrackPos 
  ,   ,  , .. 
    .      . 

    6.                                153 


      SetScrolllnfoQ 

         ,    
  ,    SetScrollRangeQ  SetScrollPos() 
    SetScrollInfo(). ,     
   Windows 95.       SCROLL. H, 
    .   : 

    //   SetScrollInfo () 
    #include <afxwin.h> 
    #include <string.h> 
    ^include "scroll.h" 
    ^include "scrlids.h" 
    ftdefine RANGEMAX 50 
    int ctlsbpos = 0; 
    int vsbpos = 0; 
    int hsbpos = 0; 
    CMainWin::CMainWin() 
    { 
    SCROLLINFO si; //     
    Create (NULL, "Using Scroll Bars", 
    
    WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, 
    rectDefault, NULL, "DialogMenu"); 
    
    //     
    if(!LoadAceel Table("DialogMenu")) 
    MessageBox ( "Cannot Load Accelerators", "Error"); 
    si.cbSize = sizeof (SCROLLINFO); 
    si.fMask = SIF_RANGE; 
    si.nMin = 0; 
    si.nMax = RANGEMAX; 
    SetScrollInfo(SB_VERT, Ssi); 
    SetScrollInfo(SB_HORZ, Ssi); 
    ) 
    
    //   
    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) 


    154                                    MFC:   


    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    ON_WM_VSCROLL() 
    ON_WM_HSCROLL() 
    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("Scroll Bars", "Help"); 
    t 
    //   MM_VSCROLL 
    afx_msg void CMainWin::OnVScroll(UINT SBCode, UINT Pos, CSrollBar *SB) 
    ( 
    char str[255] ; 
    SCROLLINFO si; //     
    
    if(SB) return; // , SB   NULL 
    CClientDC dc(this); 
    
    switch(SBCode) { 
    case SB_LINEDOWN: 
    vsbpos++; 
    if(vsbpos>RANGEMAX) vsbpos = RANGEMAX; 
    break; 
    case SB_LINEUP: 
    vsbpos--; 
    if(vsbpos<0) vsbpos = 0; 
    break; 
    case SB_THUMBPOSITION: 
    vsbpos = Pos; //    
    break; 
    case SB_THUMBTRACK: 


    6.                                155 


    vsbpos = ; //    
    break; 
    case SB_PAGEDOWN: 
    vsbpos +=5; 
    if(vsbpos>RANGEMAX) vsbpos = RANGEMAX; 
    break; 
    case SB_PAGEUP: 
    vsbpos -=5; 
    if(vsbpos<0) vsbpos = 0; 
    break; 
    ) 
    si.cbSize = sizeof(SCROLLINFO); 
    si.fMask = SIF_POS; 
    si.nPos = vsbpos; 
    SetScrollInfo(SB_VERT, &si); 
    wsprintf (str, "Vertical Scroll Bar: %d    ", vsbpos); 
    dc.TextOut (2, 2, str, strlen (str)); 
    } 
    //   WM_HSCROLL 
    afx_msg void CMainHin::OnHScroll(UINT SBCode, UINT Pos, 
    CSrollBar *SB) 
    { 
    char str [255] ; 
    SCROLLINFO si; //     
    if (SB) return; // , SB   NULL 
    CClientDC dc(this); 
    switch(SBCode) { 
    case SB_LINERIGHT: 
    hsbpos++; 
    if(hsbpos>RANGEMAX) hsbpos = RANGEMAX; 
    break; 
    case SB_LINELEFT: 
    hsbpos--; 
    if(hsbpos<0) hsbpos = 0; 
    break; 
    case SB_THUMBPOSITION: 
    hsbpos = Pos; //    
    break; 
    case SB_THUMBTRACK: 
    hsbpos = Pos; //    
    break; 
    case SB_PAGERIGHT: 
    hsbpos +=5; 
    if (hsbpOS>RANGEMAX) hsbpos = RANGEMAX; 
    break; 
    case SB_PAGELEFT: 
    hsbpos -=5; 
    if(hsbpos<0) hsbpos = 0; 
    break; 
    } 


    156                                     MFC:   


    si.cbSize = sizeof(SCROLLINFO) ; 
    si.fMask = SIF_POS; 
    si.nPos = hsbpos; 
    SetScrollInfo(SB_HORZ, &si); 
    wsprintf (str, "Horizontal Scroll Bar: %d    ", hsbpos); 
    dc.TextOut (200, 2, str, strlen (str)); 
    } 
    
    //      
    BEGIN_MESSAGE_MAP(CSampleDialog, CDialog) 
    
    ON_WM_VSCROLL() 
    END_MESSAGE_MAP() 
    
    //    
    BOOL CSampleDialog::OnInitDialog () 
    { 
    SCROLLINFO si; //     
    CDialog::OnInitDialog(); //     
    CScrollBar *SB = (CScrollBar *) GetDlgItem(IDD_SB1) ; 
    si.cbSize = sizeof(SCROLLINFO); 
    si.fMask = SIF_RANGE; 
    si.nMin = 0; 
    si.nMax = RANGEMAX; 
    SB->SetScrollInfo(&si) ; 
    ctlsbpos =0; //      
    return TRUE; 
    } 
    
    //   WM_VSCROLL 
    afx_msg void CSampleDialog::OnVScroll(UINT SBCode, UINT Pos, 
    CSrollBar *SB) 
    ( 
    char str [255] ; 
    SCROLLINFO si; //     
    if(!SB) return; // , SB    
    //     
    CClientDC dc(this); 
    
    switch(SBCode) ( 
    case SB_LINEDOWN: 
    ctlsbpos++; 
    if(ctlsbpos>RANGEMAX) ctlsbpos = RANGEMAX; 
    break; 
    case SB_LINEUP: 
    ctlsbpos--; 
    if(ctlsbpos<0) ctlsbpos = 0; 
    break; 
    case SB_THUMBPOSITION: 


    6.                                157 


    ctlsbpos = ; //    
    break; 
    case SBJTHUMBTRACK: 
    ctlsbpos = Pos; //    
    break; 
    case SB_PAGEDOWN: 
    ctlsbpos +=5; 
    if(ctlsbpos>RANGEMAX) ctlsbpos = RANGEMAX; 
    break; 
    case SB_PAGEUP: 
    ctlsbpos -=5; 
    if(ctlsbpos<0) ctlsbpos = 0; 
    break; 
    } si.cbSize = sizeof(SCROLLINFO); 
    si.fMask = SIF_POS; 
    si.nPos = ctlsbpos; 
    SB->SetScrollInfo (&si) ; 
    wsprintf(str, "%d", ctlsbpos); 
    dc.TextOut(55, 30, "     ", 5) ; 
    dc.TextOut (55, 30, str, strlen(str)); 
    } 
    CApp App; //    


    DDX-  DDV- 

         ,   
    ,     
     .  ,    
,  .     , 
    . ,     
       cbstatusl  
cbstatus2     .  , 
       .  
   ()  ,    
 cbstatusl  cbstatus2,      
  .     (..  ),   
   Cancel.        
      .    
            
.  ,  ,   (   
 ),    . 
         ,   
     .   MFC  
   .     
: DDX  DDV. DDX-       
 . DDV-      
.    (  
, ,  

    158                                     MFC:   

     ,   ,  )   
,  ,  DDX-   . 
     -   
.  ,          
  -. 
       DDX- (. 6.2): 

     6.2.   DDX- 

    	 

    DDX,	Check	 		  
    DDX	Text	 			  
    DDX	Radio	 			  
    DDX.	Scroll	 			 

        DDV- (. .): 

     6.3.   DD - 

    	 

    DDV	MaxChars	   
    DDV	MinMaxDouble	  	double 
    DDV	MinMaxDWord	  	DWORD 
    DDV	MinMaxInt	  	int 
    DDV	MinMaxLong	  	long int 
    DDV	MinMaxUnsigned	  	unsigned int 

        DDX-  DDV-,  
  DoDataExcliangeQ    .  
    CWnd    : 

    void CWnd::DoDataExchange(CDataExchange *Data}; 

      Data      CDataExchange, 
 DDX-  DDV- (     ). 
 DoDataExchange()       .  
  DDX-       
DDV (  ). 
     DoDataExchangeQ DDX/DDV-    
          
 . ,  DDX_Check()   : 

    void AFXAPI DDX_Check(CDataExchange *Data, int ID, int &var) ; 

      Data      CDataExchange, 
   DoDataExchangeQ. ID     , 

    6.                                159 

    a var   ,     .  
    DoDataExchange(),     
     . 
    ,   DDX/DDV-    : 
    1.   DoDataExchangeQ    . 
    2.          
  . 
    3.   DoDataExchange()    DDX- 
  . 
    4.  ,    DDX-   
DDV. ,        
 . 
             
          .  
 Cancel    . 
     ,       
,     DDX/DDV-.     
 ,   ,    ..  
         
      (wizards).    
        
MFC,           
,    DDX/DDV-.     
   ,      , 
  ,        MFC. 

    160                                     MFC:   
