      

       B 

     Windows - ,     
,        
:   .        
Microsoft        .   
    .     
Windows-,   ,  , , , C++, COBOL, 
FORTRAN, Java, LISP, Modula-2, , REXX  Smalltalk/V. , ,  
  . 
         Windows     - 
 ;      C++.    
    -  ,      
 : 
    1.  . 
    2.     (message crackers). 
    3.  C++. 
    4. C++    MFC (Microsoft Foundation Classes). 
       . 
     ,        , 
     4.    -  
       ;   
     . (    ,    
   MFC;       .) 
     3     .    
Windows  C++     ,    , , 
      ,  C++   
  ,     ,     . 3  4, 
  ,  Windows-, -    
    C++. 
     1   : ,       
,     -  .  
-     2.     : 
    ?        
. ,    ,       
  .         
,      ,    . 
        WINDOWSX.H,   Visual C++. 
      WINDOWS.,      ,  
 

    658 _____________________________Windows   

     #define,   . Microsoft   
,      : 
            ,   
   .        
     Windows  . ,   
\32-    .      
         
  .   ,   : 
       ,   .   ,  
,   .        
 .          
.     ,    
  . 
        . 
       16- Windows-  Win32. 
                 . 
           .   
   . 
         ,    ,    C++,    
      . 
        -,     ,   
 ,  ,  ,    . 
        ,       
     Windows. ,  
  Windows    LONG,     
  ,      .    
       ( LONG).     
  MAKELONG,    WINDEF.H.    
      ,      
  .       WINDOWSX.H. 
       WINDOWSX.H    3 :  
,         API-. 

        

         .  
      switch.    
    switch,   500  .  
 ,     , ...    .  
   .      switch  
       .    
  . 
          ,      
 wParam  IParam,      . , 
   WM_COMMAND  wParam    . 
     ,     
.  ?    .  ,  16- Windows 
 IParam  

    ____________________  .   659 

    WM_COMMAND      .    
 ,         
  .     ,   
   .   WM_COMMAND,  
  ,    : 

    void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl. UINT codeNotify) { 
    switch (id) { 
    case ID_SOMELISTBOX: 
    if (codeNotify != LBN_SELCHANGE) 
    break; 
    
    //  LBN_SELCHANGE 
    break: 
    case ID_SOMEBUTTON: 
    break: 

    ,  !    wParam  IParam, 
        .  WINDOWSX.H 
  2 :  Win32   16- Windows.   
16- Windows  ,    Win32.  , 
   ,   -      
  ,        
16- Windows,    Win32! 
      ,   -   
 switch  : 

    LRESULT WndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM IParam) { 
    switch (uMsg) { 
    HANDLE_MSG(hwnd, WM_COMMAND, Cls_OnCommand); 
    HANDLE_MSG(hwnd, WM_PAINT, Cls_OnPaint); 
    HANDLE_MSG(hwnd, WM_DESTROY, Cls_OnDestroy); 
    default: 
    return(DefWindowProc(hwnd, uMsg, wParam, IParam)); 
    } 
    } 

      WINDOWSX.H  HANDLE_MSG (  16- Windows,   
Win32)  : 

    ttdefine HANDLE_MSG(hwnd. message, fn) \ 
    case (message): \ 
    return HANDLE_##message((hwnd), (wParam), (IParam), (fn)); 

      WM_COMMAND      
 : 

    case (WM_COMMAND): 
    return HANDLE_WM_COMMAND((hwnd), (wParam), (IParam), (Cls_OnCommand)); 


    660 _____________________________Windows   

     HANDLE_WM_*    WINDOWSX.H. -    
 .     wParam  
IParam,        
    (    Cls_OnCommand}. 
  HANDLE_WM_COMMAND  16- Windows: 

    #define HANDLE_WM_COMMAND(hwnd, wParam, IParam, fn) \ 
    ((fn)((hwnd), (int)(wParam), (HWND)LOWORD(lParam), 
    (UINT)HIWORD(lParam)), OL) 

      Win32: 

    fldefine HANOLE_WM_COMMAND(hwnd, wParam, IParam, fn) \ 
    ((fn)((hwnd), (int)(LOWORD(wParam)), (HWND) (IParam), 
    (UINT)HIWORD(wParam)), OL) 

              
Cls_OnCommand,   (   ) 
   wParam  IParam. 
         ,   
WINDOWSX.H   ,    . , 
    WM_COMMAND,   ,  : 

    /* void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); */ 
    ftdefine HANDLE_WM_COMMAND(hwhd, wParam, IParam, fn) \ 
    ((fn)((nwnd), (int)(LOWORD(wParam)), (HWND)(lParam), 
    (UINT)HIWORD(wParam)), OL) 
    Bdefine FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \ 
    (void)(fn)((hwnd), WM_COMMAND, 
    MAKEWPARAM((UINT)(id), (UINT)(codeNotify)), 
    (LPARAM)(HWND)(hwhdCtl)) 

       ,   ,   
 .      16- Windows,   
Win32.        HANDLE_WM_*,  
    (message forwarder). ,  
  WM_COMMAND     , 
  .    : 

    void Cls_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { 
    //    
    //    
    FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, DefWindowProc); 
    } 

     FORWARD_WM_*      
   wParam  IParam,      
.     DefWindowProc,      
 SendMessage  PostMessage. ,   
 -   ,    FORWARD_WM_*   
    .    
HANDLE_WM_*,  FORWARD_WM_*  16 Windows  Win32  -. 

    ____________________  .   661 


         

           .  
    FORWARD_WM_*.        
 ,   ,    
   . ,    LB_GETCOUNT 
 ,      WINDOWSX.H: 

    Sdefine ListBox_GetCount(hwndCtl) 
    ((int)(DWORD)SendMessage((hwndCtl), LB_GETCOUNT, 0, OL)) 

          . -,   
   (hwndCtI)    .    
LB_GETCOUNT   wParam  IParam,     
  . ,    ,   . 
    -,  ,  SendMessage,   int,  
       .    - : 

    int n = (int) SendMessage(hwndCtl, LB_GETCOUNT, , OL); 

         16- Windows    
     .   ,   
    DWORD ( SendMessage)  
  int.   : 

    int n = ListBox_GetCount(hwndCtl): 

     ,   ,    SendMessage, ? 
          ,      
   .    ,   
 ,     . -  
    GetDlgItem  : 

    int n = ListBox_GetCount(GetDlgItem(hDlg, ID_LISTBOX)); 

         ,     
SendDlgItemMessage,     -  
 GetDlgItem.          
 , , ,    GetDlgItem  , 
   ,      : 

    HWND hwndCti = GetDlgItem(hDlg, ID_LISTBOX); 
    int n = ListBox_GetCount(hwndCtl): 
    ListBox_AddString(hwndCtl, "Another string"); 

         ,   ,   
   GetDlgItem.      
,       ,    
 -   Z-. 

    662 ______________________________Windows   


    API- 

           , 
  ,         
 .      - : 

    HFONT hfontOrig = (HFONT) Select0b]ect(hdc, (HGDIOBJ) hfontNew); 

         ,   
  .         
,    WINDOWSX.H: 

    #define SelectFont(hdc, hfont) \ 
    ((HFONT) Select0bject((hdc). (HGDIOBJ) (HFONT) (hfont))) 

            : 

    HFONT hfontOrig = SelectFont(hdc, hfontNew); 

        ,     . 
      WINDOWSX.H    API-,   
  .      
  . 