      

            
  ,    .  
     -.     Widows 
       ,   
,   .      ( 
 ),      .   
 ,   .  MFC   
    CStatusBarCtrI. 

    :          
 CStatusBor.     Windows    CStatusBarCtrI. 


       

             
CStatusBarCtrI,     CreateQ,    : 

    BOOL CStatusBarCtrI::Create(DWORD dwStyle, const RECT &SizePos, CWnd 
*0wner, UINT ID} ; 

      dwStyle    .   
    WS_CHILD.  ,   
 WS_VISIBLE  WS_BORDER.      
 ,     . 12.1.    
      RECT,    
 SizePos. ,      ( 
    CCS_NORESIZE).      
        
.         Owner. 
     ID.  CreateQ  
          . 
       ,       
( ),        . 
(,    ,    .) 
      .     
    . 

     12.1.    

                      

    CCS_BOTTOM                   
    CCS_NODIVIDER                 
  
    CCS_NOHILITE                   


    294                                     MFC:   


                      

    CCS_NOMOVEY                  
    CCS_NOPARENTALIGN           
      
    CCS_NORESIZE                   
 SivPos  CreateQ      
    CCS_TOP                      
  (   ) 

         

            , 
 .     SetPartsQ,   : 

    BOOL CStatusBarCtrl::SetParts (int NumParts, int *MidthArray} ; 

      NumParts     .  
    256.  ,    
 WidthArray,      .  
,        NumParts. 
           
 . 

         

         ,       
  .     SetTextQ,  
 : 

    BOOL CStatusBarCtrl::SetText(LPCSTR IpszString, int Part, int How} ; 

      IpszString     ,  
    ,   Part.  
   ,     .    
    .  How   
 .     .    
  "" , ..    .   
 SBT_POPOUT,     "" , ..   
 . 

       

         .     : 
    1.    . 
    2.     . 
    3.      . 
    4.        . 

    12.  ,                   295 

       -  ,   
        SetText(). 
           ,  
  ,    .   
       .    
         
 .      . 12.1: 

    . 12.1.      

         : 

    ; STATUS.RC 
    ^include <afxres.h> 
    ftinclude "ids.h" 
    StatusMenu MENU ( 
    POPUP "SDemo" 
    { 
    
    MENUITEM "&Dialog\tF2", IDM_DIALOG 
    MENUITEM "E&xit\tF3", IDM_EXIT 
    > 
    MENUITEM "SHelp", IDM_HELP 
    } 


    296                                    MFC:   


    StatusMenu ACCELERATORS 
    { 
    VK_F2, IDM_DIALOG, VIRTKEY 
    VK_F3, IDM_EXIT, VIRTKEY 
    VK_F1, IDM_HELP, VIRTKEY 
    } 
    StatusDialog DIALOG 18, 18, 150, 92 
    CAPTION "Demonstrate a Status Bar" 
    STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 
    ( 
    PUSHBUTTON "Reset", IDD_RESET, 92, 34, 37, 14, 
    
    WS_CHILD I WS_VISIBLE ] WSJTABSTOP 
    PUSHBUTTON "OK", IDOK, 92, 53, 37, 14, 
    
    WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    EDITTEXT IDD_EB1, 10, 10, 30, 12, ES_LEFT | WS_CHILD | 
    WS_VISIBLE I WS_BORDER 
    
    AUTOCHECKBOX "Option I", IDD_CB1, 10, 40, 48, 12 
    AUTOCHECKBOX "Option 2", IDD_CB2, 10, 60, 48, 12 
    ) 

         IDS.H.     
,    . 

    // IDS.H 
    #define IDMJ3IALOG 100 
    tdefine IDM_HELP   101 
    #define IDM_EXIT   102 
    ftdefine IDD__EB1    200 
    #define IDD_CB1    201 
    #define IDD__CB2    202 
    #define IDD__RESET 203 
    #define IDD_RB1    204 
    #define IDD_RB2    205 
    #define IDD_RB3    206 
    tdefine IDD_RB4    207 
    #define IDD_RB5    208 
    ftdefine IDD_RB6    209 
    #define IDD_SPIN   210 
    ^define IDD_STATUS 300 
    #define ID_TAB     400 
    ftdefine NUMPARTS   3 
       STATUS.H,    : 
    // STATUS.H 
    //       


    12.  ,                   297 


    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 
    ( 
    
    CStatusBarCtrl m_Status; //    
    CSpinButtonCtrl m Spin; //     
    public: 
    CSampleDialog(char *DialogName, CMnd *0wner) : 
    CDialog(DialogName, Owner) {) 
    BOOL OnInitDialog (); 
    
    afx_msg void OnVScroll(UINT SBCode, UINT Pos, 
    CScrollBar *SB) ; 
    afx_msg void OnCBlO; 
    afx_msg void OnCB2() ; 
    afx msg void OnResetO; 
    DECLARE_MESSAGE_MAP() 
       : 
    //     
    
    #include <afxwin.h> 
    ftinclude <afxcmn.h> 
    ^include <string.h> 
    #include "status.h" 
    #include "ids.h" 
    CMainWin::CMainWin() 
    ( 
    Create(NULL, "Using A Status Bar", 


    298                                     MFC:   


    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "StatusMenu"); 
    InitCommonControls(); 
    
    //     
    if('LoadAccelTable("StatusMenu")) 
    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() 
    
    //   IDM_DIALOG 
    afx_msg void CMainWin::OnDialog() 
    ( 
    CSampleDialog diagOb("StatusDialog", 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("Status Bar", "Help"); 
    } 
    
    //      
    BEGIN_MESSAGE_MAP(CSampleDialog, CDialog) 


    12.  ,                   299 


    ON_WM_VSCROLL() 
    ON_COMMAND(IDD_CB1, OnCBl) 
    ON_COMMAND(IDD_CB2, OnCB2) 
    ON_COMMAND(IDD_RESET, OnReset) 
    END_MESSAGE_MAP() 
    
    //    
    BOOL CSampleDialog: .-OnInitDialog () 
    { 
    RECT r; 
    int i; 
    int parts[NUMPARTS] ; 
    CDialog::OnInitDialog(); //     
    
    //     
    .left = .top = 10; 
    .right = .bottom = 50; 
    m_Spin.Create(WS_VISIBLE | WS_CHILD | WS_BORDER | 
    UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 
    r, this, IDD_SPIN) ; 
    
    //      
    m_Spin.SetRange(0, 20); 
    
    //    
    m_Spin.SetBuddy(GetDlgItem(IDD_EB1)) ; 
    
    //       
    m_Spin.SetPos(10) ; 
    
    //      
    GetClientRect(&r) ; 
    for (i=l; 1<=NUMPARTS; 1++) 
    parts[i-1] = r.right/NUMPARTS *i; 
    //    
    r.left = r.top =0; //    
    .right = r.bottom = 0; 
    
    m_Status.Create(WS_VISIBLE I WS_CHILD, 
    r, this, IDD_STATUS) ; 
    
    //       
    m_Status.SetParts(NUMPARTS, parts) ; 
    m_Status.SetText("Spin Ctrl: 10", 0, 0) ; 
    m_Status.SetText("Option 1: OFF", 1, 0); 
    m_Status.SetText("Option 2: OFF", 2, 0) ; 
    return TRUE; 
    } 
    
    //   WM_VSCROLL, 
    //     
    afx_msg void CSampleDialog::OnVScroll(UINT SBCode, UINT Pos, CScrollBar *SB) 


    300                                     MFC:   


    char str [255] ; 
    
    //  SB        
    if (SB != (CScrollBar *)&m_Spin) return; 
    wsprintf (str, "Spin Ctrl: 6d", Pos) ; 
    m_Status.SetText(str, 0, 0) ; 
    } 
    
    //   IDD CB1 
    afx_msg void CSampleDialog::OnCBl() f 
    CButton *cbptr = (CButton *) GetDlgItem(IDD_CBl); 
    if(cbptr->GetCheck()) 
    m_Status.SetText("Option 1: ON", 1, 0) ; 
    else 
    m_Status.SetText("Option 1: OFF", 1, 0) ; 
    1 
    
    //   IDD_CB2 
    afx_msg void CSampleDialog::OnCB2() 
    ( 
    CButton *cbptr = (CButton *) GetDlgItem(IDD_CB2) ; 
    if(cbptr->GetCheck ()) 
    m_Status.SetText("Option 2: ON", 2, 0) ; 
    else 
    m_Status.SetText("Option 2: OFF", 2, 0) ; 
    //   IDD_RESET 
    afx msg void CSampleDialog::OnReset() 
    ( 
    CButton *cbptr = (CButton *) GetDlgItem(IDD_CBl) ; 
    cbptr->SetCheck(0) ; 
    cbptr = (CButton *) GetDlgItem(IDD_CB2) ; 
    cbptr->SetCheck(0) ; 
    m_Spin.SetPos(10) ; 
    m_Status.SetText("Spin Ctrl: 10", 0, 0) ; 
    m_Status.SetText("Option 1: OFF", 1, 0) ; 
    m_Status.SetText("Option 2: OFF", 2, 0) ; 
    ) 
    CApp ; //    
             
OnInitDialogO.       .    


    12.  ,                   301 


      GetClientRect().      
  .   : 

    void CWnd::GetClientRect(RECT *Rect) const; 

      Reel      RECT,  
  . 
         ,    
(    GetCIientRectQ)   3.  , 
     .      
        
   parts. ,     
 ,    .    ,   
  .   -    
 ,        . 
             
 .  CStatusBarCtrl    , 
    . 

     

          .  
    .       
     .     
,     .    
    .     
    .  MFC  
    CTabCtrl. 

    :       ,   
.     ,      
    . 


      

            CTabCtrl, a 
   CreateQ,   : 

    BOOL CTabCtrl:: Create (DWORD dwStyle, const RECT S-SizePos, CWnd *0wner, 
UINT ID}; 

      dwStyle   .    
  WS_CHILD  WS_VISILE.     
 (. 12.2): 

    302                                     MFC:   


     12.2.   

                   

    TCS_BUTTONS          ,    
    TCS_FIXEDWIDTH          
    TCS_MULTILINE            
    TCS_TOOLTIPS             
    TCS_SINGLBL1NE            (  
    ) 

     SizePos     RECT,    
   .      
   Owner.      
ID.  CreateQ        
    . 

      

      ,      .  
    Insertltem(),   : 

    BOOL CTabCtrl::Insertltem(int Index, TC_ITEM * Item); 

      Index    .  
   .  Item     
 _1,   .  Insertltem()  
    .    
         . 
     _1   : 

    typedef struct _TC_ITEM 
    ( 
    UINT mask; 
    UINT IpReservedl; 
    UINT lpReserved2; 
    LPSTR pszText; 
    int cchTextMax; 
    int ilmage; 
    LPARAM IParam; 
    } TC_ITEM; 

    ,    mask  , ,   
  pszText, ilmage  IParam    .  mask 
      (. 12.3): 

     J2.3.   mask 

                  

    TCIF_IMAGE              ilmage 
    TCIF_PARAM              IParam 
    TCIF_TEXT               pszText 


    12.  ,                   303 

         pszText     
      .    i 
        ,    
  .     cchTextMax    . 
          ,    ilmage 
'   ,    .  
]\       -1. (  
 [  ,       
 ! .       
CImageUst.)  IParan   ,   
 . 

       CTabCtrl 

     CTabCtrl   ,     
  .       > . 
       ,       
.     GetCurSel(),   : 

    int CTabCtrl::GetCurSel() const; 

          -1,     
    . 
         SetCurSelQ,   : 

    int CTabCtrl::SetCurSel (int Index); 

      Index    .  
      -1,     
   . 
            
GetItemQ,    : 

    BOOL CTabCtrl::GetItem(int Index, TC_ITEM * Item) const; 

      Index   .  Item  
    _,      
 .      mask  
,  ,      . 
         
.         
    . 
      ,      , 
   Setltem(),    : 

    BOOL CTabCtrl::Setltem(int Index, TC_ITEM * Item}; 

      Index   .  Item  
    _1,   . 
   mask  ,  ,   

    304                                    MFC:   

      .      
       . 
           AdjustRectQ,  
      .    
 : 

    void CTabCtrl::AdjustRect(BOOL How, RECT *Rect}; 

          ,  
. ,           
 ,    ,       
   .     
 .       .   
   .   How   ,   Rect 
     RECT,      
.          
 ,  .   How  ,   
Rect, ,    ,    , 
           . 

      

         ,   
 WM_NOTIFY.          
 : TCN_SELCHANGE, TCN.SELCHANGING  TCN_KEYDOWN.  
TCN_SELCHANGING   ,     .  
TCN_SELCHANGE     .  TCN_KEYDOWN 
   . 
    ,   ,     
 ON_NOTIFY(),    : 

    ONJMOTIFY(notification-code, ID, handler} 

      notification-code     .  
 ID   .  - 
    handler.     : 

    afx_msg void handler(NMHDR *hdr, LRESULT * Result}; 

      TCN_SELCHANGE  TCN_KEYDOWN  Result  .  
 TCN_SELCHANGING       ,  
  ,    ,   ,  
 . 

        

           . 
       .    
   ,  One, Two  Three.    
      ,    . 
     . 12.2. 

    12.  ,                   305 


    . 12.2.      

          .   IDS.H  
,   .    .,    : 

    //  . 
    //       
    class CMainWin : public CFrameWnd 
    { 
    CTabCtrl m_Tab; //   
    public: 
    CMainWin() ; 
    afx_msg void OnTabChange(NMHDR *hdr, LRESULT *NotUsed); 
    DECLARE_MESSAGE_MAP() 
    }; 
    //      
    class CApp : public CWinApp 
    { 
    public: 
    BOOL Initlnstance() ; 
    ); 
    * 


    306                                    MFC:   

       : 

    //       
    
    tinclude <afxwin.h> 
    #include <afxcmn.h> 
    finclude <string.h> 
    tinclude "ids.h" 
    ^include "tab.h" 
    CMainWin::CMainWin() 
    ( 
    Create(NULL, "Using A Tab Control"); 
    InitCommonControls (); 
    RECT r; 
    TC_ITEM tci; 
    
    //      
    GetClientRect(&r) ; 
    
    //   
    m_Tab.Create(WS_VISIBLE I WS_CHILD, 
    r, this, ID_TAB) ; 
    tci.mask = TCIF_TEXT; 
    tci.ilmage = -1; 
    tci.pszText = "One"; 
    m_Tab.InsertItem(0, Stci); 
    tci.pszText = "Two"; 
    m_Tab.Insertltem(1, &tci) ; 
    tci.pszText = "Three"; 
    m_Tab.Insertltem(2, &tci); 
    ) 
    
    //   
    BOOL CApp::Initlnstance () 
    ( 
    m_pMainWnd = new CMainWin; 
    m_pMainWnd->ShowWindow(m_nCmdShow); 
    m_pMainWnd->UpdateWindow() ; 
    return TRUE; 
    1 
    
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_NOTIFY(TCN_SELCHANGE, ID_TAB, OnTabChange) 


    12.  ,                   307 


    END_MESSAGE_MAP() 
    //     
    afx_nisg void CMainWin::OnTabChange(NMHDR *hdr, LRESULT *NotUsed) 
    { 
    CClientDC DC(this) ; 
    char str[255]; 
    wsprintf(str, "Changed to Tab %d ", m_Tab.GetCurSel()+1) ; 
    DC.SetBkColor(RGB(200, 200, 200)); 
    DC.TextOut (40, 100, str, strlen(str)); 
    } 
    CApp App; //    

      CMainWin(),   ,  ! 
 GetClientRect()     .   
 ,       
.     ,    ] 
 .    ,     
.      WMJNOTIFYc  TCNJSELCHANGI  
      ,   
,     . 

      

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

    308                                    MFC:   

         .   
  ,  Options, Pitch  Page Size.     
   .         
 ,     .    
  .      . 12.3. 
         : 

    ; TAB.RC 
    tinclude <afxres.h> 
    ^include "ids.h" 
    
    TabDialoql DIALOG 2, 16, 158, 106 
    STYLE HS_CHILD | WS_VISIBLE ] WS_POPUP 
    ( 
    
    PUSHBUTTON "Reset", IDD_RESET, 92, 34, 37, 14, 
    WS_CHILD I WS_VISIBLE | WS_TABSTOP 
    
    EDITTEXT IDD_EB1, 10, 10, 30, 12, ES_LEFT I WS_CHILD | 
    WS_VISIBLE | WS_BORDER 
    AUTOCHECKBOX "Option I", IDD_CB1, 10, 40, 48, 12 
    AUTOCHECKBOX "Option 2", IDD_CB2, 10, 60, 48, 12 
    ) 
    TabDidloq2 DIALOG 2, 16, 158, 106 
    STYLE WS_POPUP I WS_CHILD | WS_VISIBLE 
    ( 
    
    LTEXT "Choose Pitch", 199, 10, 10, 60, 12 
    AUTORADIOBUTTON "High Pitch", IDD_RB1, 10, 40, 48, 12 
    AUTORADIOBUTTON "Medium Pitch", IDD_RB2, 10, 60, 62, 12 
    AUTORADIOBUTTON "Low Pitch", IDD_RB3, 10, 80, 48, 12 
    > 
    
    TabDialog3 DIALOG 2, 16, 158, 106 
    STYLE WS_POPUP i WS_CHILD | WS_VISIBLE 
    { 
    LTEXT "Choose Page Size", 2, 10, 10, 70, 12 
    AUTORADIOBUTTON "Small", IDD_RB4, 10, 40, 48, 12 
    AUTORADIOBUTTON "Medium", IDD_RB5, 10, 60, 48, 12 
    AUTORADIOBUTTON "Large", IDD_RB6, 10, 80, 48, 12 > 

      IDS.H   ,   .    
TABDEMO.H,    : 

    //  TABDEMO.H 
    //       
    class CMainWin : public CFrameWnd 
    ( 
    CTabCtrl m Tab; //   
    public: 
    CMainWin () ; 


    12.  ,                   309 


    afx_msg void OnTabChange(NMHDR *hdr, LRESULT *NotUsed) ; 
    DECLARE_MESSAGE_MAP() 
    }; 
    
    //      
    class CApp : public CWinApp 
    { 
    public: 
    BOOL Initlnstance (); 
    ); 
    //        
    class CTabDialogI : public CDialog 
    ( 
    
    CSpinButtonCtrl m_Spin; //     
    CStatusBarCtrl m_Status; //    
    public: 
    CTabDialogI () : CDialog() () 
    BOOL OnInitDialog (); 
    
    afx_msg void OnVScroll(UINT SBCode, UINT Pos, 
    CScrollBar *SB) ; 
    afx_msg void OnCBl(); 
    afx_msg void OnCB2(); 
    afx msg void OnResetO; 
    DECLARE_MESSAGE_MAP() 
    
    //        
    class CTabDialog2 : public CDialog 
    ( 
    public: 
    CTabDialog2 () : CDialog {) 
    DECLARE_MESSAGE_MAP()                                             ; 
    1; 
    
    //        
    class CTabDialog3 : public CDialog                                   i 
    {                                                                          
                                                       I 
    public: 
    CTabDialog3 () : CDialog () {)                                        . 
    DECLARE_MESSAGE_MAP() 
    }; 


    310                                    MFC:   

       : 

    //   
    #include <afxwin.h> 
    #include <afxcmn.h> 
    #include <string.h> 
    #include "ids.h" 
    #include "tabdemo.h" 
    
    //     
    CTabDialogI DiagObI; 
    CTabDialog2 Diag0b2; 
    CTabDialogS Diag0b3; 
    
    //     
    CDialog *CurDialog; 
    
    CMainWin::CMainWin() 
    ( 
    RECT r; 
    TC_ITEM tci; 
    r.left = r.top = 10; 
    r.bottom = 250; r.right = 275; 
    
    Create(NULL, "Using A Tab Control", WS_OVERLAPPEDWINDOW, r, 
    NULL, NULL) ; 
    InitCommonControls () ; 
    
    //      
    GetClientRect(&r) ; 
    
    //   
    m_Tab.Create(WS_VISIBLE | WS_CHILD, r, this, ID_TAB) ; 
    tci.mask = TCIF_TEXT; 
    tci.ilmage = -1; 
    tci.pszText = "One"; 
    m_Tab.Insertltem(0, &tci); 
    tci.pszText = "Two"; 
    m_Tab. Insertltemd, &tci) ; 
    tci.pszText = "Three"; 
    m_Tab.Insertltem(2, &tci); 
    
    //      
    CurDialog = SDiagObI; 
    DiagObI.Create("TabDialogI", this) ; 
    ( 


    12.  ,                   311 


    //   
    BOOL CApp::Initlnstance () 
    
    (                                                                   | 
    m pMainWnd = new CMainWin;                                        i 
    m_pMainWnd->ShowWindow(m_nCmdShow);                               j 
    m pMainWnd->UpdateWindow(); 
    return TRUE; 
    ; 
    
    //     
    BEGIN__MESSAGE_MAP(CMainWin, CFrameWnd) 
    
    ON_NOTIFY(TCN_SELCHANGE, ID_TAB, OnTabChange) 
    END_MESSAGE_MAP() 
    
    //        
    BEGIN_MESSAGE_MAP(CTabDialogI, CDialog) 
    ON_WM_VSCROLL() 
    ON_COMMAND(IDD_CB1, OnCBl) 
    ON_COMMAND(IDD_CB2, OnCB2) 
    
    ON_COMMAND(IDD_RESET, OnReset) 
    END_MESSAGE_MAP() 
    
    BEGIN_MESSAGE_MAP(CTabDialog2, CDialog) 
    END_MESSAGE_MAP() 
    
    BEGIN_MESSAGE_MAP(CTabDialog3, CDialog) 
    END_MESSAGE_MAP() 
    //     
    BOOL CTabDialogI::OnInitDialog() 
    ( 
    RECT r; 
    int i; 
    int parts[NUMPARTS]; 
    CDialog::OnInitDialog(); //     
    
    //     
    .left = .top = 10; 
    .right = .bottom = 50; 
    m_Spin.Create(WS_VISIBLE | WS_CHILD | WS_BORDER I 
    UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 
    r, this, IDD_SPIN) ; 
    
    //      
    m_Spin.SetRange(0, 20); 
    
    //    
    m_Spin.SetBuddy(GetDlgItem(IDD_EB1)) ; 
    
    //       
    m_Spin.SetPos(10) ; 


    312                                     MFC:   


    m_Status.SetText("Option 2: ON", 2, 0) ; 
    else 
    m_Status.SetText("Option 2: OFF", 2, 0) ; 
    i 
    
    //   IDD_RESET 
    afx_msg void CTabDialogI::OnReset() 
    ( 
    CButton *cbptr = (CButton *) GetDlgItem(IDD_CBl) ; 
    cbptr->SetCheck(0) ; 
    cbptr = (CButton *) GetDlgItem(IDD_CB2) ; 
    cbptr->SetCheck (0) ; 
    m_Spin.SetPos(10); 
    m_Status.SetText("Spin Ctrl: 10", 0, 0) ; 
    m_Status.SetText("Option 1: OFF", 1, 0) ; 
    m_Status.SetText("Option 2: OFF", 2, 0) ; 
    1 
    //     
    afx_msg void CMainWin::OnTabChange(NMHDR *hdr, LRESULT *NotUsed) 
    ( 
    if(CurDialog) CurDialog->DestroyWindow() ; 
    
    switch(m_Tab.GetCurSel ()) { 
    case 0: 
    DiagObI.Create("TabDialogI", this) ; 
    CurDialog = &DiagObl; 
    break; 
    case 1: 
    Diag0b2.Create("TabDialog2" , this) ; 
    CurDialog = &DiagOb2; 
    break; 
    case 2: 
    Diag0b3.Create("TabDialog3", this) ; 
    CurDialog = &DiagOb3; 
    break; 
    CApp App; //    


    314                                     MFC:   


    . 12.3.      

          OnTabChangeQ.    
     . -,    
DestroyWindow()   ,    . 
(, , ,       .) 
    CreateQ   ,    
. (       .) 
       ,    . 
, ,     . 

       

     ,   ,    . 
       . 
  , ,     Explorer 
 Windows 95.     ,  
        
.         
. ,        !   
          
 .   ,      
    .  MFC    
    CTreeCtrl. 
    :         
 CTreeView.    ,  ,   
 CTreeCtrl.  CTreeView    ,    
     . 

    12.  ,                   315 


        

             
CTreeCtrl,     CreateQ,    : 
    BOOL CTreeCtrl::Create(DWORD dwSkyle, const RECT bSizePos, CWnd * Owner, 
UINT ID) ; 
      dwStyle    .   
   WS_CHILD  WS_VISIBLE.    
 ,        
 (. 12.4): 


     12.4.     

                    

    TVS_EDITLABELS         (.. ) 
 ,     
    TVS_HASLINES            
    TVS_LIN ESATROOT          
    TVS_HASBUTTONS           "+"  "", 
      

       TVS_HASLINES  TVSJLINESATROOT    
   .      
"" .    TVS_HASBUTTONS    
  "+"  "".   "+",    
         ,  "",   
  .        . 
          . 
     RECT,     SiwPos,    
 .        Owner. 
 ID   .  CreateQ  
          . 
           .   
   ,      . 

        

        ,   .    
 ,    Insertltem().   
   .      : 

    HTREEITEM CTreeCtrl::Insertltem(TV_INSERTSTRUCT *Item); 

      Item      TV_INSERTSTRUCT, 
      .   
    ,      NULL. 
 ,    MFC   .    . 

    316                                     MFC:   


     TV_INSERTSTRUCT   : 
    typedef struct _TV_INSERTSTRUCT { 
    HTREEITEM hParent; 
    HTREEITEM hInsertAfter; 
    TV_ITEM item; 
    ) TV_INSERTSTRUCT; 

       hParent   ,   
 ( ).      ,    
   TVI_ROOT.   hInsertAfter , 
       .    
  ,       
.      hInsertAfter     
  (. 12.5): 

     12.5.   hfnsertAfter 

                     

    TVI_FIRST                  
    TVI_LAST                  
    TVI_SORT                    

      item   .    
  TV_ITEM,   : 

    typedef struct _TV_ITEM ( 
    UINT mask; 
    HTREEITEM hitem; 
    UINT state; 
    UINT stateMask; 
    LPSTR pszText; 
    int cchTextMax; 
    int ilmage; 
    int iSelectedImage; 
    int cChildren; 
    LPARAM 1 Pa ram; 
    } TV_ITEM; 

      mask ,      _ 
  .       (. 12.6): 

     12.6.   mask 

                     

    TV[F_HANDLE               hitem 
    TVIF_STATE                  state  stateMask 
    TVIF_TEXT                  pszText  cchTextMax 
    TVIF_IMAGE                 ilmage 


    12.  ,                   317 


                     

    TVIF_SELECTEDIMAGE       iSelectedImage 
    TVIF_CHILDREN             cChiIdren 
    TVIF_PARAM                 IParam 

      state    .   
  (. 12.7): 

     12.7.    

                      

    TVIS_DISABLED             
    TVIS_DROPHILITED         ,      
  
    TVIS_EXPANDED          ,   ,  
. (    .) 
    TVIS_EXPANDEDONCE     ,   ,    
( ) . (    ) 
    TVIS_FOCUSED               
    TVIS_SELECTED            

     stateMask ,      
 .           
 . 
          pszText    
 ,      .   
        ,    
  .      cchTextMax  
 .      cchTextMax . 
           ,    
ilmage    ,    . 
   ,    ilmage    -1.   
,   iSelectedImage     . 
          cChiIdren    
   ( ).  IParam  , 
 . 
     ,   ,   
Insertltem(),        .  
      CTreeCtrI. 

         

       ,     
 (..    ).    
     Expand(),   : 

    BOOL CTreeCtrI::Expand(HTREEITEM hitem, UINT How) ; 

    318                                     MFC:   

      h/fem    .  How 
    .      
  (. 12.8): 

     12.8.   How 

                     

    TVE_COLLAPSE              ,    
,  
    TVE_COLLAPSERESET        
    TVE_EXPAND                ,    
,  
    TVE_TOGGLE              (  )  
  

     ,    ( TVE_COLLAPSERESET) 
   ,    ,  
 hitem. ,  TVE_COLLAPSE   , 
   hitem,      (   
    ). 
     Expand()        
    . 

         

         ,    
  . ,  CTreeCtrl  
 ,      .   
   . 
     ,       ,  
  GetSelectedItemQ,    : 

    HTREEITEM CTreeCtrl::GetSelectedItem() ; 

          .    
  ,  NULL. 
    1            SelectQ,  
 : 

    HTREEITEM CTreeCtrl::Select(HTREEITEM hitem, UINT How) ; 

      hitem    .  
 How     .    
TVGN_CARET,    .    TVGN_DROPHILITE,  
       .   
  TVGN_FIRSTVISIBLE,       
,     .    
         . 

    12.  ,                   319 

           Getltem(),! 
  : 

    BOOL CTreeCtrl::Getltem(TV_ITEM *Item}; 

      Item      TV_ITEM.  
   hiteni        
,    mask   ,      
.         
 .       
      . 
           Setltem(), 
   : 

    BOOL CTreeCtrl::Setltem(TV_ITEM *Ttem); 

      Item      TV_ITEM.  
   hitem        
,    mask   ,     
.          
   . 
            
DeleteItemQ.   : 

    BOOL CTreeCtrl::Deleteltem(HTREE hitem}; 

      h Item    .  
  ,    TVI_ROOT.   
           . 

         

      -       
  WM_NOTIFY.       
  (  ).   
   (. 12.9): 

     12.9.   

                                                         ''\ 

    TVN_DELETEITEM               
    TVN_ITEMEXPANDING            
    TVN_ITEMEXPANDED               
    TVN_SELCHANGING             
    TVN_SELCHANGED              

           : 

    afx_msg void _( *hdr, LRESULT *Result); 


    320 MFC:   

      ,     ,  
hdr      NM_TREEVIEW.    
 : 

    typedef struct _NM_TREEVIEW ( 
    NMHDR hdr; 
    UINT action; 
    TV_ITEM itemOld; 
    TV_ITEM itemNew; 
    POINT ptDrag; 
    ) NM_TREEVIEW; 

      hdr     NMHDR (.  10). 
      code  .  
,    ,    hwndFrom  
NMHDR.  action  NM_TREEVIEW  ,   
  .   itemOld  itemNew  
      (  )  
    (-,   ).   
        ptDrag. 
      TVN_SELCHANGING  TVNJSELCHANGED  itemOld  
  ,   itemNew    . 
  TVN_ITEMEXPANDING  TVN_ITEMEXPANDED   itemNew 
      ( ).   
TVN_DELETEITEM   itemOld     . 
      TVN_SELCHANGING  TVNJTEMEXPANDING -  
  ,     Result,  
,    ,    ,   . 
      . 

          

            . 
    ,        . 
   ,       
 ,       .  
           
 .      . 12.4. 
        : 

    ; TREE.RC 
    #include <afxres.h> 
    tinclude "treeids.h" 
    TreeMenu MENU 1 
    POPUP "&Demo" 
    { 
    MENUITEM "SExpand One\tF2", IDM_EXPAND 


    12.  ,                   321 


    MENUITEM "Expand &All\tF3", IDM_EXPANDALL 
    MENUITEM "&Collapse\tF4", IDM_COLLAPSE 
    MENUITEM "E&xit\tF5", IDM_EXIT 
    ) 
    
    MENUITEM "SHelp", IDM_HELP 
    ) 
    TreeMenu ACCELERATORS 
    ( 
    VK_F2, IDM_EXPAND, VIRTKEY 
    VK_F3, IDM_EXPANDALL, VIRTKEY 
    VK_F4, IDM_COLLAPSE, VIRTKEY 
    VK_F5, IDM_EXIT, VIRTKEY 
    VK_F1, IDM_HELP, VIRTKEY 
    } 

        TREEIDS.H: 

    // TREEIDS.H 
    #define IDM_EXPAND     100 
    #define IDM_EXPANDALL 101 
    #define IDM_COLLAPSE   102 
    #define IDM_EXIT       103 
    #define IDM_HELP       104 
    #define ID_TREE        200 
    #define NUM            5 

       TREE.H,    : 

    // TREE.H 
    //       
    class CMainWin : public CFrameWnd 
    { 
    CTreeCtrl rn Tree; //     
    void InitTree() ; 
    public: 
    CMainWin () ; 
    
    //    
    afx msg void OnExpandO; 
    afx msg void OnExpandAll() ; 
    afx msg void OnCollapse () ; 
    afx msg void OnExitO; 
    afx_msg void OnHelpO; 
    afx msg void OnPaintO; 
    afx_msg void OnTreeChange(NMHDR *hdr, LRESULT *NotUsed) ; 


    322                                    MFC:   


    DECLARE_MESSAGE_MAP () 
    //      
    class CApp : public CWinApp 
    ( 
    public: 
    BOOL Initlnstance () ; 
    ); 
        : 
    //      
    
    finclude <afxwin.h> 
    tinclude <afxcmn.h> 
    tinclude <string.h> 
    tinclude "tree.h" 
    tinclude "treeids.h" 
    HTREEITEM hTreeCtrl[NUM]; 
    HTREEITEM hTreeCurrent; 
    CMainWin::CMainWin() 
    { 
    Create(NULL, "Using A Tree View Control", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "TreeMenu") ; 
    
    //     
    if( [LoadAccelTable("TreeMenu")) 
    MessageBox("Cannot Load Accelerators", "Error"); 
    InitCommonControls() ; 
    RECT r; 
    
    //     
    .left = .top = 0; 
    .right = 120; .bottom = 100; 
    m_Tree.Create(WS__VISIBLE I WS_CHILD | WS_BORDER | 
    TVS_HASLINES | TVS_HASBUTTONS I TVS_LINESATROOT, 
    r, this, IDJTREE); 
    InitTree() ; 
    ) 
    //     
    void CMainWin::InitTree() 
    { 
    TV_INSERTSTRUCT tvs; 
    TV_ITEM tvi; 
    tvs.hInsertAfter = TVI_LAST; 
    tvi.mask = TVXF_TEXT; 


    12.  ,                   323 


    tvi.pszText = "One"; 
    tvs.hParent = TVI_ROOT; 
    tvs.item = tvi; 
    hTreeCtrl[0] = rn_Tree.Insertltem(&tvs) ; 
    hTreeCurrent = hTreeCtrl[0]; //     
    tvi.pszText = "Two"; 
    tvs.hParent = hTreeCtrl[0]; 
    tvs.item = tvi; 
    hTreeCtrl[1] = m_Tree.Insertltem(&tvs); 
    tvi.pszText = "Three"; 
    tvs.hParent = hTreeCtrl[1]; 
    tvs.item = tvi; 
    hTreeCtrl[2] = m__Tree.Insertltem(&tvs); 
    tvi.pszText = "Four"; 
    tvs.hParent = hTreeCtrl[2]; 
    tvs.item = tvi; 
    hTreeCtrl[3] = m_Tree.Insertltem(&tvs); 
    tvi.pszText = "Five"; 
    tvs.hParent = hTreeCtrl[2]; 
    tvs.item = tvi; 
    hTreeCtrl[4] = mJTree.Insertltem(&tvs); 
    } 
    
    //   
    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_EXPAND, OnExpand) 
    ON_COMMAND(IDM_EXPANDALL, OnExpandAll) 
    ON_COMMAND(IDM_COLLAPSE, OnCollapse) 
    ON_NOTIFY(TVN_SELCHANGED, ID_TREE, OnTreeChange) 
    ON_WM_PAINT() 
    ON_COMMAND(IDM_EXIT, OnExit) 
    
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    
    //   WM_PAINT 
    afx msg void CMainWin::OnPaint() 
    t 
    CPaintDC DC(this) ; 
    TV_ITEM tvi; 
    char strl[40] ; 


    324                                    MFC:   


    char str2[255]; 
    tvi.hltem = hTreeCurrent; 
    tvi.pszText = strl; 
    tvi.cchTextMax = sizeof(strl) - 1; 
    tvi.mask = TVIF_TEXT | TVIF_HANDLE; 
    m__Tree.GetItem(&tvi) ; 
    wsprintf(str2, "Current selection: %s", tvi.pszText); 
    DC.TextOut(2, 150, str2, strlen(str2)); 
    ) 
    //   IDM_EXPAND 
    afx msg void CMainWin::OnExpand() 
    { m Tree.Expand(hTreeCurrent, TVE EXPAND); 
    )   
    
    //   IDM_EXPANDALL 
    afx msg void CMainWin::OnExpandAll() { 
    int i; 
    
    for(i=0; i<NUM; i++) 
    m__Tree.Expand(hTreeCtrl[i] , TVE_EXPAND) ; 
    1      t 
    
    //   IDM_COLLAPSE 
    afx msg void CMainWin::OnCollapse() 
    1 
    m_Tree.Expand(hTreeCurrent, TVE_COLLAPSE) ; 
    } 
    
    //   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("Tree View", "Help"); 
    } 
    //      


    12.  ,                   325 


    afx_msg void CMainWin::OnTreeChange(NMHDR *hdr, LRESULT *NotUsed) { 
    hTreeCurrent = m_Tree.GetSelectedItem(); 
    InvalidateRect(NULL) ; 
    ) 
    CApp App; //    


    . 12.4.       

      InitTree()     . 
 ,        
hTreeCtrl.       .  
 hTreeCurrent      .  
         
 . 
             
 WM_NOTIFY.      OnTreeChange(), 
     GetSelectedItem()    
 ,     .  OnPaintQ  
  GetItemO     ,  
     . 
          OnExpandAlI().  ,  
  ExpandQ    ,   , 
.    ,    hTreeCtrl. 
               
.        . 
,        .   
 ,   ,    . 

    326                                    MFC:  