           

               
      .     
         
   ,   MFC.     
 ,      
,     .     , 
        . 
           Windows,   
         
 .         
 .   ,  ,    , 
       . 

    181 

           ,    
   .      
 MFC,          

      

     ,     MFC   CDC::TextOut().  
     ,    
  .        
   ,    Text0ut(). ,  
      (0,0).    
  ,   Y   . 
          Text0ut()    
         ,    
   .     
.   ,    Text0ut()   . 
..      (      
   ,   ,    
9).     Windows     
.        ,   ,  
        . , , 
 ,   ,    ,   
   . 

         

          TextOutQ     
   .          
  SetTextColor()  SetBkColorQ,    CDC. 
  : 

    virtual COLORREF CDC::SetTextColor(COLORREF Color}; 
    virtual COLORREF CDC::SetBkColor(COLORREF Color); 

     SetTextColoi-0      
    ,     Color ( 
  ,     ). , 
 SetBkColor()      ,  
   Color (   ).    
  . 
          COLORREF,  32- 
 .  Windows      . 
,  ,   ,    
   RGB (, , ).   
        .  
   

    182                                    MFC:   

          .    
    RGB   .     
   . 
       COLORREF,      
SetTextColor()  SetBkColorQ,     (. 8.1): 

     8.1.    COLORREF 

    	 

    0 ( )	 
    1	 
    2	 
    3 ( )	   

           RGB     
  255,  0    ,  255   . 
          COLORREF,  Windows  
 RGB(),     .    : 

    COLORREF RGB (BYTE red, BYTE green, BYTE blue) ; 

     red, green  blue       0  255. 
,   -    RGB(255, 0, 
255).     RGB(255, 255, 255),   RGB(0, 0, 
0).          
. , RGB(0, 100, 100)  - .   
    ,  , 
     . 

        

       SetBRModeQ   ,    
       .    : 

    int CDC::SetBkMode(int mode); 

     ,         
 (    ).     
,     ,   
mode,       : OPAQUE ()  
TRANSPARENT ().     . 
      mode  OPAQUE,         
    .   mode  TRANSPARENT,   
 .       SetBkColorQ .  
    OPAQUE. 

    8.                         J83 


       

         3,       
.  ,  Windows    . 
 ,   "i", ,     ,  "w". 
            
    .  ,     
   .  ,      , 
    ,      Windows  
        . 
    Windows         
 .       Text0ut().  
    ,    .  
           
 " / ".  ,   
     . 
          , , 
,         
 . ,        
.         
.          
GetTextMetricsQ.    CDC.   : 

    BOOL CDC::GetTextMetrics(LPTEXTMETRIC IpTextAttrib) const; 

      IpTexlAttrib      
TEXTMETRIC.         
  ,     .  
           
.  TEXTMETRIC   : 

    typedef struct tagTEXTMETRIC 
    ( 
    LONG tmHeight; //    
    LONG tmAscent; //     
    LONG tmDescent; //    
    LONG tiTiInternalLeading; //     
    LONG tmExternalLeading; //    
    LONG tmAveCharWidth; //    
    LONG tmMaxCharWidth; //    
    LONG tmWeight; //  ()  
    LONG tmOverhang; //    
    //   
    LONG tmDigitizedAspectX; //    
    LONG tmDigitizedAspectY; //    
    BYTE tmFirstChar; //    
    BYTE tmLastChar; //    
    BYTE tmDefaultChar; // ,    
    BYTE tmBreakChar; // ,     


    184                                    MFC:   


    BYTE tmltalic; //  ,    
    BYTE ri-nUnderlined; //  ,     
    BYTE tmStruckOut; //  ,    
    BYTE tmPitchAndFamily; //     
    BYTE tmCharSet; //     
    ) TEXTMETRIC; 

      ,   GetTextMetricsQ,   
   ,     ,     
       .  
          .  
  ,   ,     
  ,       
 .  ,         
  .  ,    , 
   (Y)   . ,  
   ,     GetTextMetricsQ, 
          
.      tmHeight  tmExternalLeading, 
.   ,      
   . 
    :   tmExternalLeading      
,        .   
  ,    .      
   .   ,     . 

       

           ,  
          
  . .. ,   strlen(),   
     .       CDC 
  GetTextExtentQ,    : 

    CSize CDC::GetTextExtent(LPCSTR IpszString, int Len) const.

      Ips^String   ,    
.  Len     .   
        CSize.  
   SIZE,    : 

    typedef struct tagSIZE 
    { 
    LONG ex; //  
    LONG ; //  
    ) SIZE; 


    8.                         185 

             .  
     ,     
 ,       . 

       

     Windows       
 ,       ,  
  .   ,  , , 
 API- GetSystemMetrics(),   : 

    int GetSystemMetrics(int what); 

     ,           
MFC.         
API,          .  
what    .  GetSystemMetricsO 
     .   
   .  what     
  (. 8.2): 

     8.2.   

    	  

    SMCXFULLSCREEN	   ,     
    SMCYFL)LLSCREEN	   ,     
    SMCX[CON	   
    SMCYICON	   
    SMCXSMICON	   
    SMCYSMICON	   
    SMCXSCREEN	  
    SMCYSCREEN	  
    

         

    ,      Windows,     
,    ,   .  
   : 

    ; TEXT.RC 
    #include <afxres.h> 
    #include "ids.h" 


    186                                     MFC:   


    TextMenu MENU ( 
    POPUP "Demonstrate Text" 
    { 
    
    MENUITEM "&Show\tF2", IDM_SHOW 
    MENUITEM "&Reset\tF3", IDM_RESET 
    MENUITEM "E&xit\tF4", IDM_EXIT 
    } 
    MENUITEM "SHelp", IDM_HELP 
    } 
    TextMenu ACCELERATORS 
    ( 
    VK_F2, IDM_SHOW, VIRTKEY 
    VK_F3, IDM_RESET, VIRTKEY 
    VK_F4, IDM_EXIT, VIRTKEY 
    VK_F1, IDM_HELP, VIRTKEY 
    } 

         IDS.H,    
.  IDM_FONT    . 

    // IDS.H 
    #define IDM_SHOW   100 
    #define IDM_RESET 101 
    #define IDM_FONT   102 
    #define IDM_EXIT   103 
    #define IDM_HELP   104 
       .,    : 
    // . 
    //       
    class CMainWin : public CFrameWnd 
    ( 
    public: 
    int m_X, m_Y; //     
    char m str[255]; //     
    CMainWin() ; 
    afx msq void OnShowO; 
    afx msg void OnResetO; 
    afx msg void OnExitO; 
    afx msg void OnHelpO; 
    DECLARE_MESSAGE_MAP() 
    ) ; 
    //      
    class CApp : public CWinApp 


    S.                         187 


    { 
    public: 
    BOOL Initlnstance (); 
    ); 
       : 
    //      
    ^include <afxwin.h> 
    #include <string.h> ftinclude "text.h" 
    #include "ids.h" 
    int maxX, maxY; //   
    CMainWin::CMainWin() ( 
    Create(NULL, "Demonstrate Text Output", 
    WSJ3VERLAPPEDHINDOW, rectDefault, 
    NULL, "TextMenu") ; 
    //     
    if(!LoadAccelTable("TextMenu")) 
    MessageBox("Cannot Load Accelerators", "Error"); 
    m_X = m_Y = 0; 
    maxX = GetSystemMetrics(SM_CXSCREEN) ; 
    maxY = GetSystemMetrics(SM_CYSCREEN) ; 
    } 
    //   
    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_SHOW, OnShow) 
    ON_COMMAND(IDM_RESET, OnReset) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    //   IDM_EXIT 
    afx msg void CMainWin::OnExit () 
    int response; 


    188                                    MFC:   


    response = MessageBox("Quit the Program?", "Exit", MB YESNO); 
    if(response == IDYES) 
    SendMessage(WM_CLOSE); //   } 
    //   IDM HELP 
    afx msg void CMainWin::OnHelp() 
    ( 
    MessageBox("Text Demo", "Help"); 
    ) 
    //   
    afx_msg void CMainWin::OnShow() 
    ( 
    CClientDC DC(this); 
    TEXTMETRIC tm; 
    CSize size; 
    //     
    DC.SetTextColor(RGB(0, 0, 0)) ; 
    //     
    DC.SetBkColor(RGB(0, 255, 255)); 
    //    
    DC.GetTextMetrics(&tm) ; 
    wsprintf(m_str, "The font is %ld pixels high.", tm.tmHeight); 
    DC.TextOut(m__X, m__Y, m_str, strlen(m_str)); //   
     Y =  Y + tm.tmHeight + tm.tmExternalLeading; //  
    //   
    strcpy(m_str, "This is on the next line."); 
    DC.TextOut(m X, m Y, m str, strlen(m str)); //   
    //    
    size = DC.GetTextExtent(m_str, strlen(m_str)); 
    wsprintf(m str, "Previous string is %ld units long", size.ex); 
    m X = size.ex; //      
    DC.TextOut(m X, m Y, m str, strlen(m str)); 
    m Y = m Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    m X = 0; //    
    wsprintf(m str, "Screen dimensions: %d %d", maxX, maxY); 
    DC.TextOut(m X, m Y, m str, strlen(m_str)); 
    m_Y = m_Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   1 
    //    
    afx_msg void CMainWin::OnReset() 


    8.                         189 


    { 
    m_X = m_Y = 0; 
    ) 
    CApp ; //    

      ,      . .; 
  Show   Demonstrate Text,     
       .   
   . 8.1. 

    . 8.1.                       

            maxY  
,     GetSystemMetrics().    
   -  ,      . 
     ,    CMainWin()    _  
m_Y,       .   
     ,    
         
  . 
          - OnShowQ 
   .       
.      ,    
 .         
,       . ..  
, ,      . 

    190                                    MFC:   

           .  
  .       
wsprintf(),          TextOutQ.  
,     ,    TextOutQ,   
     .     
.     m_Y,    
 Y  ,   ,  . 
        "This is on the next line".    
       wsprintf(),  
      GetTextExtentQ.   
     _,   
    .     
  .    Y (..  m_Y)  
.           
     .    m_Y 
   ,   _   0.  , 
        .   
       m_Y    . 
         Show        
   . 
       ,    Demonstrate Text  
Reset.         (0,0). 

       

             
,      ,  
   3.   :      
- ,       ,    
,   , , .. .    ,  
         
 WM_PAINT,      .   
 :      
  ,   ?    
 3,    .    ,    
   .       
,      , ,  , 
""  .     ,    
           
   WM_PAINT.  , ,   
,     .   ,    
   Windows  MFC. 

       

             
  .      
 , 

    8.                         191 

       .       
   .  ,    
WM_PAINT,          
  .      ,  
      .   
    ,    
WM_PAINT,        , 
 .   ,      
    . 

     API- 

            
MFC.       .  CreateCompatibleDCO. 
Select0bject(), CreateStockObject()  BitBltQ.  ,  
 CreateCompatibleBitmapO  PatBltQ. 
     CreateCompatibleBitmapO   ,  
   .      
    ,    . 
     CBitmap    : 

    BOOL CBitmap::CreateCompatibleBitmap(CDC *pDC, int Width, int Height); 

      Width  Height   .   
  .      " 
      . 
     PatBItQ        
 .      CDC.    
     .  PatBltQ   : 

    BOOL CDC::PatBlt(int X, int , int Width, int Height, DWORD dwRasterOp) ; 

       /     
 .       
 Width  Height.  dwRasterOp   
 .        (. 8.3): 

     8.3.   dwRasterOp 

      

BLACKNESS 
WHITENESS 
PATCOPY 
PATINVERT
DSTINVERT	

    ( ) 
    ( ) 
      
         
   ( ) 


    192 MFC:   \ 

    ,        ,  
   dwRasterOp   PATCOPY.  
PatBltQ           
 . 
    ,      ,    
  . 

         

      ,    .     
        
WM_PAINT,          
   .  ,    , 
          
.     . 

       

    -,     ,   
    (..  ).   
  ,      CMainWin().  
          
.         
,  ,      , 
   CMainWin.   : 

    CDC m rnemDC; //  ,     
    CBitmap m bmp; //    
    CBrush m bkbrush; //     

        CMainWin(),    
 : 

    maxX = GetSystemMetrics(SM_CXSCREEN); 
    maxY = GetSystemMetrics(SM_CYSCREEN); 
    CClientDC DC (this) ; 
    //     
    m memDC.CreateCompatibleDC(&DC) ; 
    m bmp.CreateCompatibleBitmap(&DC, maxX, maxY) ; 
    m memDC.SelectObject(&m bmp) ; 
    //    
    m_bkbrush.CreateStockObject(WHITE_BRUSH) ; 
    m memDC.SelectObject(&m_bkbrush) ; 
    //     
    ni_niemDC.PatBlt (0, 0, maxX, maxY, PATCOPY); 


    8.                         193 

        .    
.       ,  
      .   
   .    
        
 .     ,    
 .   ,      
,          
.  ,        
,     .    
     .    
  .      ,   
 PatBltQ        .  i 
,     ,     
   . ,      . 
,  ,      .  ,  
,    ,  (  
    CMainWin()).    
      . 

       

       ,       . 
         
WM_PAINT.      OnShowQ,   
    . 

    //      
    afx msg void CMainWin::OnShow() 
    ( 
    TEXTMETRIC tm; 
    CSize size; 
    //     
    m memDC.SetTextColor(RGB(0, 0, 0)) ; 
    //     
    m_memDC.SetBkColor(RGB(0, 255, 255)); 
    //    
    m memDC.GetTextMetrics(&tm); 
    wsprintf(m_str, "The font is %ld pixels high.", tm.tmHeight); 
    m memDC.TextOut(m X, m Y, m str, strlen(m_str)); //   
    m Y = m Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    strcpy(m_str, "This is on the next line."); 
    m memDC.TextOut(m X, m , m str, strlen(m str)); //   


    194                                     MFC:   


    //    
    size = m mernDC .GetTextExtent (m str, strlen (m str)); 
    wsprintf(m str, "Previous string is %ld units long", size.ex); 
    m X = size.ex; //      
    m_memDC.TextOut(m_X, m_Y, m_str, strlen(m_str)); 
    m Y = m Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    m X = 0; //    
    wsprintf(m str, "Screen dimensions: %d %d", maxX, maxY) ; 
    m_memDC.TextOut(m_X, m_Y, m__str, strlen(m_str)); 
    rn_Y = m_Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    InvalidateRect(NULL) ; 
    1 

     ,         
m_memDC.       ,  
 InvalidateRectQ. 
         WM_PAINT    
   .      OnPaintO: 

    //       
    afx msg void CMainWin::OnPaint() 
    ( 
    CPaintDC DC (this) ; 
    DC.BitBlt(0, 0, maxX, maxY, &m_memDC, , , SRCCOPY); 
    ) 

          m_meinDC    
  BitBIt().  STRCOPY    
      .    
    m_memDC,      
       .    
 :   \VM_PAINT    , 
     ,    
    . 
       ,     
 ,          
 ,  ,  .  ,   
  ,     (  
rcPaint  PAINTSTRUCT  .  3),     
 ,     ,   . 
   ! 

    8.                         195 


          

         ,     
 .           
  IDS.H,     .    
V7RTWIN.H,    : 

    // VIRTWIN.H 
    //       
    class CMainWin : public CFrameWnd 
    { 
    public: 
    int m X, m_Y; //     
    char m_str[255]; //     
    CDC m memDC; //  ,   
    //   
    CBitmap m bmp; //    
    CBrush  bkbrush; //                      \ 
    CMainWin() ; 
    afx msg void OnPaintO; 
    afx_rnsg void OnShow(); 
    afx msg void OnResetO; 
    afx msg void OnExitO; 
    afx_msg void OnHelpO; 
    DECLARE_MESSAGE_MAP() 
    }; 
    //      
    class CApp : public CWinApp < public: 
    BOOL Initlnstance (); 
    ); 

       : 

    //      
    #include <afxwin.h> 
    #include <string.h> 
    #include "virtwin.h" 
    ^include "ids.h" 
    int maxX, maxY; //   
    CMainWin::CMainWin() 
    ( 
    Create(NULL, "Demonstrate Text Output", 


    196                                    MFC:    


    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "TextMenu") ; 
    //     
    if(!LoadAccelTable("TextMenu")) 
    MessageBox("Cannot Load Accelerators", "Error"); 
    m_X = m_Y = 0; 
    maxX = GetSystemMetrics(SM_CXSCREEN); 
    maxY = GetSystemMetrics(SM_CYSCREEN) ; 
    CClientDC DC(this) ; 
    //     
    m_memDC.CreateCompatibleDC(&DC) ; 
    m bmp.CreateCompatibleBitmap(&DC, maxX, maxY); 
    m memDC.SelectObject(&m_bmp); 
    //    
    m_bkbrush.CreateStockObject(WHITE_BRUSH) ; 
    m memDC.SelectObject(&m bkbrush); 
    //     
    m_memDC.PatBlt(0, 0, maxX, maxY, PATCOPY); 
    } 
    //   
    BOOL ::Initlnstance() 
    ( 
    m pMainWnd = new CMainWin; 
    m_pMainWnd->ShowWindow(m_nCmdShow) ; 
    m_pMainWnd->UpdateWindow() ; 
    return TRUE; 
    ) 
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_WM_PAINT() 
    ON_COMMAND(IDM__SHOW, OnShow) 
    ON_COMMAND(IDM_RESET, OnReset) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    //       
    afx msq void CMainWin::OnPaint() 
    ( 
    CPaintDC DC(this) ; 
    DC.BitBlt(0, 0, maxX, maxY, &m_memDC, , , SRCCOPY) ; 
    ) 


    8.                         197 


    //   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 ("Text Demo", "Help"); 
    ) 
    //      
    afx msg void CMainWin::0n3how() 
    ( 
    TEXTMETRIC tm; 
    CSize size;                                                        ^ 
    //                                ^ 
    mJ-nemDC.SetTextColor (RGB (, , 0));                                  
    //                                    
    m_memDC.SetBkColor(RGB(0, 255, 255));                               J 
    //                                             
    m_memDC.GetTextMetrics(Stm);                                         
    wsprintf(m_str, "The font is %ld pixels high.", tm.tmHeight);      ^B 
    m_memDC.TextOut(m_X, m_Y, m_str, strlen(m_str)); //     ^ 
    m_Y ^ ni__Y + tm.tmHeight + tm.tmExternalLeading; //        ^ 
    //   ^ 
    strcpy(m_str, "This is on the next line.");                        ^B 
    m_memDC.TextOut(m_X, m_Y, m_str, strlen(m_str)); //      J 
    //    
    size = m memDC.GetTextExtent(m str, strlen(m str)); 
    wsprintf(m_str, "Previous string is %ld units long", size.ex); 
    m_X = size.ex; //      
    m memDC.TextOut(m_X, m Y, m str, strien(m str)) ; 
    m__Y = m_Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    m X == 0; //    
    wsprintf(m_str, "Screen dimensions: %d %d", maxX, maxY);            ^ 


    198                                     MFC:    i 


    m memDC.TextOut(m X, m Y, m str, strlen(m str)) ; 
    m Y = m Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    InvalidateRect(NULL) ; 
    //       
    afx msg void CMainWin::OnReset() 
    ( 
    m_X = m_Y = 0; 
    ni_memDC.PatBlt(0, 0, maxX, maxY, PATCOPY); 
    InvalidateRect(NULL) ; 
    } 
    CApp App; //    

     ,     . -, 
   ,    ,   
  .  -,    Reset   
.      PatBltQ. 

      

    , , ,     Windows   
    .     
     .     
    .    Windows  
   ,    .   
    . 

       

     4)   ,     
  MFC- CreateStuckObject(),       7.  
    MFC    . 
 ,    ,   . 8.4: 

     S.4.         

      

ANS1F1XEDFONT 
ANSIVARFONT 
DEV1CEJDEFAULTFONT 
DEFAULTGUIFONT
OEMF1XEDFONT 
SYSTEMFONT 
SYSTEMFIXEDFONT	

ANSI-   
ANSI-   
 [}) 
 ,    
,   
  Windows 95 
    Windows 


    8.        199 

           .    
Windows     ,    Windows 
3.0      ( Windows 95  Windows NT) 
    . 
            .    
       CFont.    
 ,      CreateStockObject().  
!';    SelectObjectQ    
   .       , 
  , ,  ,    . 
, .   ,  ,   ,  
  . 
       ,       
            
 Change Font.         
        
ANSI-  .       
 TDS.H,    .    : 

    ; SYSFONT.RC 
    ^include <afxres.h> 
    #include "ids.h" 
    TextMenu MENU 
    ( 
    POPUP "Demonstrate Text" < 
    MENUITEM "&Show\tF2", IDM_SHOW 
    MENUITEM "&Reset\tF3", IDM_RESET 
    MENUITEM "SChange Font\tF4", IDM_FONT 
    MENUITEM "E&xit\tF5", IDM_EXIT 
    ) 
    MENUITEM "SHelp", IDM_HELP 
    ) 
    TextMenu ACCELERATORS 
    ( 
    VK_F2, IDM_SHOW, VIRTKEY 
    VK_F3, IDM_RESET, VIRTKEY 
    VK_F4, IDM^FONT, VIRTKEY 
    VK_F5, IDM_EXIT, VIRTKEY 
    VK_F1, IDM_HELP, VIRTKEY 
    } 
       SYSFONT.H,    : 
    // SYSFONT.H 
    //       


    200                                    MFC:   


    class CMainWin : public CFrameWnd 
    ( 
    public: 
    int m X, m_Y; //     
    char m str[255]; //     
    CDC m memDC; //  ,   
    //   
    CBitmap m bmp; //    
    CBrush m bkbrush; //     
    CFont m SystemFont, m AnsiVarFont; //   
    CMainWin() ; 
    afx msg void OnPaint(); 
    afx msq void OnShow(); 
    afx msg void OnFont(); 
    afx msg void OnResetO; 
    afx_msg void OnExitO; 
    afx_msg void OnHelpO; 
    DECLARE_MESSAGE_MAP() 
    1; 
    //      
    class CApp : public CWinApp 
    ( 
    public: 
    BOOL Initlnstance (); 
    ); 

       : 

    //     
    ^include <afxwin.h> 
    ^include <strinq.h> 
    itinclude "sysfont.h" 
    Hnclude "ids.h" 
    int maxX, maxY; //   
    CMainWin::CMainWin() 
    ( 
    Create(NULL, "Demonstrate Built-in Fonts", 
    WSJ3VERLAPPEDWINDOW, rectDefault, 
    NULL, "TextMenu") ; 
    //     
    if(!LoadAccelTable("TextMenu")) 
    MessageBox("Cannot Load Accelerators", "Error"); 


    8.                         201 


    m_X = m_Y = 0; 
    maxX = GetSystemMetrics(SM_CXSCREEN); 
    maxY = GetSystemMetrics(SM_CYSCREEN); 
    CClientDC DC(this) ; 
    //     
    m_memDC.CreateCompatibleDC(&DC) ; 
    m_bnip.CreateCompatibleBitmap(&DC, maxX, maxY); 
    m memDC.SelectObject(Sm bmp); 
    //    
    m_bkbrush.CreateStockObject(WHITE_BRUSH) ; 
    m_meniDC. SelectObject (&m_bkbrush) ; 
    //     
    m_memDC.PatBlt(0, 0, maxX, maxY, PATCOPY) ; 
    //     
    m_AnsiVarFont.CreateStockObject(ANSI_VAR_FONT) ; 
    m_SystemFont.CreateStockObject(SYSTEM_FONT) ; 
    } 
    //   
    BOOL CApp::Initlnstance() 
    < 
    m_pMainWnd = new CMainWin; 
    m_pMainWnd->ShowWindow(m_nCmdShow) ; 
    ni_pMainWnd->UpdateWindow(); 
    return TRUE; 
    ) 
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_WM_PAINT() 
    ON_COMMAND(IDM_SHOW, OnShow) 
    ON_COMMAND(IDM_FONT, OnFont) 
    ON_COMMAND(IDM_RESET, OnReset) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP <) 
    //       
    afx msg void CMainWin::OnPaint() 
    { 
    CPaintDC DC (this) ; 
    DC.BitBlt(0, 0, maxX, maxY, &m_memDC, , , SRCCOPY) ; 
    i 
    //   IDM_EXIT 
    afx_msg void CMainWin::OnExit() 


    202                                     MFC:   


    { 
    int responses
    response = MessageBox ("Quit the Program?", "Exit", MB_YESNO); 
    if (response == IDYES) 
    SendMessage(WM CLOSE); //   
    1 
    //   IDM_HELP 
    afx msg void CMainWin::OnHelp () 
    ( 
    MessageBox ("Text Demo", "Help"); 
    //   
    afx msg void CMainWin::OnShow() 
    ! 
    TEXTMETRIC tm; 
    CSize size; 
    //     
    m_memDC.SetTextColor(RGB(0, 0, 0) ) ; 
    //    
    m_memDC.GetTextMetrics(&tm) ; 
    wsprintf(m str, "The font is %ld pixels high.", tm.tmHeight) ; 
     memDC.TextOut(m X, m Y, m str, strlen(m str)); //   
    m_Y = m_Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    strcpy(m str, "This is on the next line."); 
    m memDC.TextOut(m X, m Y, m str, strlen(m str)); //   
    //    
    size = m_memDC.GetTextExtent(m_str, strlen(m_str)); 
    wsprintf(m str, "Previous string is %ld units long", size.ex); 
    m X = size.ex; //      
    m_memDC.TextOut(m_X, m_Y, m_str, strlen(m_str)); 
    m_Y = m_Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    m X = 0; //    
    wsprintf(m str, "Screen dimensions: %d %d", maxX, maxY); 
    m memDC.TextOut(m X, m Y, m str, strlen(m str)) ; 
    m_Y = m_Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    InvalidateRect(NULL) ; 
    ) 


    8.                         203 


    //       
    afx msg void CMainWin::OnReset () 
    { 
    m_X = m_Y = 0; 
    m_memDC.PatBlt (0, 0, maxX, maxY, PATCOPY); 
    InvalidateRect(NULL) ; 
    } 
    //   
    afx msg void CMainWin::OnFont() 
    { 
    static whichfont = 0; 
    if(!whichfont) { 
    m_memDC.SelectObject(&m_AnsiVarFont) ; 
    whichfont = 1; 
    } 
    else { 
    m memDC.SelectObject(&m SystemFont); 
    whichfont = 0; 
    } 
    ) 
    CApp App; //    

         . 8.2. 

    . 8.2.     


       

            ,   
    .      
. -,      

    204                                     MFC:   

          . -,  
         
 . 
     ,        . 
      ,    
  . ( ,      
    .) 
          CreateFontQ,  
   CFont.   : 

    BOOL CFont::CreateFont (int Height, int Width, int Escapement, 
    int Orient ation, int Height, 
    BYTE Ital, BYTE Underline, 
    BYTE StrikeThru, BYTE Charset, 
    BYTE Precision, BYTE ClipPrecision, 
    BYTE Quality, BYTE Pitch, 
    LPCSTR FontName}; 

         Height.    ,  
   .      Width. 
    ,  Windows   ,   
   .     
 . 
         .     
 Escapement.        
 .         
,      . ,  900  
 ,      90 , .. . 
         Orientation.    
    ,       
   . 
     Weight    ()   
  0  1000.    ,      
.     400.   
(bold)   700.      
  : 

    FWJ30NTCARE 
    FW_THIN 
    FW_EXTRALIGHT 
    FW_ULTRALIGHT 
    FH_LIGHT 
    FW_NORMAL 
    FW_REGULAR 
    FW_MEDIUM 
    FW_SEMIBOLD 
    FW_DEMIBOLD 
    FW_BOLD 
    FW_EXTRABOLD 
    FW_ULTRABOLD 
    FM_BLACK 
    FW_HEAVY 


    8.                        205 

          (italic),   
///  .       .  
   (underline),   Underline 
  .       .  
     (strike-through),  
 SirikeThru   .      
 . 
     Charset    .    
  ANSI_CHARSET.  Precision  ,   
      .  
     OUT_DEFAULT_PRECIS.  
ClipPrecision    .   
,   ,     , 
 "".        CLIP_DEFAULT_PRECIS. 
     Quality ,      
  ,       
.        : 

    DEFAULT_QUALITY 
    DRAFT_QUALITY 
    PROOF_QUALITY 

     Pitch     .    
  : 

    DEFAULT_PITCH 
    FIXED_PITCH 
    VARIABLE_PITCH 

         : 

    FF_DECORATIVE 
    FF_DONTCARE 
    FF_MODERN 
    FF_ROMAN 
    FF_SCRIPT 
    FF_SWISS 

        Pitch     
          . 
           FontName.    
   32 .      
 . 
         CreateFontQ   
.     .   ,  
       .     
        
 ,   . 
    ,     CreateFontQ,     
   .     
  CFont.         
 DeleteObjectQ. 

    206                                     MFC:   

       ,     
 .      Courier New,  
    Century Gothic.       Change 
Font     .      
 .          
 1DS.H,     .    USERFONT.H, 
   : 

    // USERFONT.H 
    //       
    class CMainWin : public CFrameWnd 
    ( 
    public: 
    int m_X, m_Y; //     
    char m str[255]; //     
    CDC m memDC; //  ,   
    //   
    CBitmap m_bmp; //    
    CBrush m bkbrush; //     
    CFont m_SystemFont; //   
    CFont m CourierNew, m CenturyGothic; //   
    char m fontname[80]; //    
    CMainWin () ; 
    afx msg void OnPaintO; 
    afx msg void OnShowO; 
    afx msg void OnFontO; 
    afx msg void OnResetO; 
    afx msg void OnExitO; 
    afx msq void OnHelpO; 
    DECLARE_MESSAGE__MAP() 
    //      
    class CApp : public CWinApp 
    public: 
    BOOL Initlnstance () ; 

       : 

    //     
    #include <afxwin.h> 
    ^include <string.h> 
    ^include "userfont.h" 
    Hnclude "ids.h" 


    8.                         207 


    int maxX, maxY; //   
    CMainWin::CMainWin() 
    { 
    Create (NULL, "Demonstrate Custom Fonts", 
    WS_OVERLAPPEDWINDOW, rectDefault, 
    NULL, "TextMenu"); 
    //     
    if('LoadAccelTable("TextMenu")) 
    MessageBox("Cannot Load Accelerators", "Error"); 
    m_X = in_Y = 0; 
    maxX = GetSystemMetrics(SM_CXSCREEN); 
    maxY = GetSystemMetrics(SM_CYSCREEN); 
    CClientDC DC(this); 
    //     
    m_memDC.CreateCompatibleDC(&DC) ; 
    m_bmp.CreateCompatibleBitmap(&DC, maxX, maxY) ; 
    m_memDC.SelectObject (&ni_bmp) ; 
    //    
    m_bkbrush.CreateStockObject(WHITE_BRUSH) ; 
    m memDC.SelectObject(&m bkbrush); 
    //     
    m_memDC.PatBlt(0, 0, maxX, maxY, PATCOPY) ; 
    //     
    m_SystemFont.Create3tockObject(SYSTEM_FONT) ; 
    //    
    m_CourierNew.CreateFont(14, , , , FW_NORMAL, 
    , , , ANSI_CHARSET, 
    OUTJ3E FAULT_PRECIS, 
    CLIP_DEFAULT_PRECIS, 
    DEFAULT_QUALITY, 
    DEFAULT_PITCH | FF_DONTCARE, 
    "Courier New") ; 
    m_CenturyGothic.CreateFont(20, , , 0, FW_SEMIBOLD, 
    , , , ANSI_CHARSET, 
    OUT_DEFAULT_PRECIS,                      ; 
    CLIP_DEFAULT_PRECIS, 
    DEFAULT_QUALITY, 
    DEFAULT_PITCH | FF_DONTCARE, 
    "Century Gothic");                       I 
    strcpy(m fontname, "Default");                                      ' 
    } 


    208                                    MFC:   ' 


    //   
    BOOL CApp::lnitlnstance() 
    ( 
    rti pMainWnd = new CMainWin; 
    m_pMainWnd->ShowWindow(m_nCmdShow) ; 
    m pMainWnd->UpdateWindow(); 
    return TRUE; 
    } 
    //     
    BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd) 
    ON_WM_PAINT () 
    ON_COMMAND(IDM_SHOW, OnShow) 
    ON_COMMAND(IDM_FONT, OnFont) 
    ON_COMMAND(IDM_RESET, OnReset) 
    ON_COMMAND(IDM_EXIT, OnExit) 
    ON_COMMAND(IDM_HELP, OnHelp) 
    END_MESSAGE_MAP() 
    //       
    afx msg void CMainWin::OnPaint() 
    ( 
    CPaintDC DC(this) ; 
    DC.BitBlt(0, 0, maxX, maxY, &m_memDC, , , SRCCOPY) ; 
    ) 
    //   IDM_EXIT 
    afx msg void CMainWin::OnExit() 
    ( 
    int response; 
    response = MessageBox("Quit the Program?", "Exit", MB_YESNO) ; 
    if (response == IDYES) 
    SendMessage(WM CLOSE); //   
    1 
    //   IDM HELP 
    afx msg void CMainWin::OnHelp () 
    ( 
    MessageBox("Text Demo", "Help"); 
    1 
    //   
    afx_msg void CMainWin::OnShow() 
    ( 
    TEXTMETRIC tm; 
    CSize size; 
    //     


    8.                         209 


    m_memDC.SetTextColor(RGB(0, 0, 0) ) ; 
    //    
    m__memDC .GetTextMetrics (&tm) ; 
    wsprintf(m str, "%s is %ld pixels high.", 
    m fontname, tm.tmHeight); 
    m_memDC.TextOut(m_X, m_Y, m_str, strlen(m_str)); //   
    m_Y = m_Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    strcpy(m_str, "This is on the next line."); 
    m memDC.TextOut(m X, m Y, m str, strlen(m str)); //   
    //    
    size = m memDC.GetTextExtent(m str, strlen(m str)); 
    wsprintf(m str, "Previous string is %ld units long", size.ex); 
    m_X = size.ex; //      
    m_memDC.TextOut(m_X, m_Y, m_str, strlen(m_str)); 
    m_Y = m_Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    m X = 0; //    
    wsprintf(m str, "Screen dimensions: %d %d", maxX, maxY); 
    m_memDC.TextOut(m_X, m_Y, m_str, strlen(m_str)); 
    m Y ^ m Y + tm.tmHeight + tm.tmExternalLeading; //   
    //   
    InvalidateRect(NULL) ; 
    } 
    /I       
    afx msg void CMainWin::OnReset() 
    ( 
    m_X = m_Y = 0; 
    m_memDC.PatBIt(0, 0, maxX, maxY, PATCOPY) ; 
    InvalidateRect(NULL) ; 
    } 
    //   
    afx msg void CMainWin::OnFont() 
    ( 
    static whichfont = 0; 
    switch(whichfont) 
    ( 
    case 0: 
    m_memDC.SelectObject(&m_CourierNew) ; 
    whichfont = 1; 
    strcpy(m fontname, "Courier New"); 
    break; 
    case 1:                                                           i 


    210                                     MFC:   


    m_memDC.SelectObject(&m_CenturyGothic) ; 
    whichfont = 2; 
    strcpy(m fontname, "Century Gothic"); 
    break; 
    case 2: 
    m_rnemDC .Select Object) &m_SystemFont) ; 
    whichfont = 0; 
    strcpy(m_fontname, "Default") ; 
    break; 
    ) 
    CApp App; //    

         . 8.3. ,   Windows 
          
.       . ,  , 
,  ,   MFC   
  . 

    . 8.3.     

    8.                           211