該文件為SYSMETS.h
#define
 NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0])) 
         
struct 

         
    
int    Index ; 
         
    TCHAR 
*       szLabel ; 
         
   TCHAR 
*       szDesc ; 
         

         
sysmetrics [] 
= 
         

         
  SM_CXSCREEN,    TEXT (
"SM_CXSCREEN"),             
         
                  TEXT (
"Screen width in pixels"), 
         
    SM_CYSCREEN, TEXT (
"SM_CYSCREEN"),             
         
                         TEXT (
"Screen height in pixels"), 
         
    SM_CXVSCROLL, TEXT (
"SM_CXVSCROLL"),            
         
                          TEXT (
"Vertical scroll width"), 
         
    SM_CYHSCROLL,  TEXT (
"SM_CYHSCROLL"),            
         
                          TEXT (
"Horizontal scroll height"), 
         
    SM_CYCAPTION, TEXT (
"SM_CYCAPTION"),            
         
                             TEXT (
"Caption bar height"), 
         
    SM_CXBORDER, TEXT (
"SM_CXBORDER"),             
         
                          TEXT (
"Window border width"), 
         
    SM_CYBORDER,  TEXT (
"SM_CYBORDER"),             
         
                          TEXT (
"Window border height"), 
         
    SM_CXFIXEDFRAME,TEXT (
"SM_CXFIXEDFRAME"),         
         
                          TEXT (
"Dialog window frame width"), 
         
    SM_CYFIXEDFRAME,TEXT (
"SM_CYFIXEDFRAME"),         
         
                          TEXT (
"Dialog window frame height"), 
         
    SM_CYVTHUMB,  TEXT (
"SM_CYVTHUMB"),             
         
                         TEXT (
"Vertical scroll thumb height"), 
         
    SM_CXHTHUMB,    TEXT (
"SM_CXHTHUMB"),             
                                      TEXT (
"Horizontal scroll thumb width"), 
         
    SM_CXICON,       TEXT (
"SM_CXICON"),              
         
                          TEXT (
"Icon width"), 
         
    SM_CYICON,       TEXT (
"SM_CYICON"),               
         
                        TEXT (
"Icon height"), 
         
    SM_CXCURSOR,  TEXT (
"SM_CXCURSOR"),             
         
                          TEXT (
"Cursor width"), 
         
    SM_CYCURSOR,    TEXT (
"SM_CYCURSOR"),            
         
                          TEXT (
"Cursor height"), 
         
    SM_CYMENU,       TEXT (
"SM_CYMENU"),               
         
                          TEXT (
"Menu bar height"), 
         
    SM_CXFULLSCREEN,TEXT (
"SM_CXFULLSCREEN"),         
         
                          TEXT (
"Full screen client area width"), 
         
    SM_CYFULLSCREEN,TEXT (
"SM_CYFULLSCREEN"),         
         
                          TEXT (
"Full screen client area height"), 
         
    SM_CYKANJIWINDOW,TEXT (
"SM_CYKANJIWINDOW"),        
         
                           TEXT (
"Kanji window height"), 
         
    SM_MOUSEPRESENT, TEXT (
"SM_MOUSEPRESENT"),         
         
                           TEXT (
"Mouse present flag"), 
         
    SM_CYVSCROLL,TEXT (
"SM_CYVSCROLL"),            
         
                           TEXT (
"Vertical scroll arrow height"), 
         
    SM_CXHSCROLL,TEXT (
"SM_CXHSCROLL"),            
         
                          TEXT (
"Horizontal scroll arrow width"), 
         
    SM_DEBUG,         TEXT (
"SM_DEBUG"),                
         
                           TEXT (
"Debug version flag"), 
         
    SM_SWAPBUTTON,TEXT (
"SM_SWAPBUTTON"),           
         
                           TEXT (
"Mouse buttons swapped flag"), 
         
    SM_CXMIN,         TEXT (
"SM_CXMIN"),                
         
                           TEXT (
"Minimum window width"), 
         
    SM_CYMIN,         TEXT (
"SM_CYMIN"),                
         
                           TEXT (
"Minimum window height"), 
         
    SM_CXSIZE,        TEXT (
"SM_CXSIZE"),               
         
                           TEXT (
"Min/Max/Close button width"), 
         
    SM_CYSIZE,       TEXT (
"SM_CYSIZE"),              
         
                           TEXT (
"Min/Max/Close button height"),          
    SM_CXSIZEFRAME,TEXT (
"SM_CXSIZEFRAME"),          
         
                           TEXT (
"Window sizing frame width"), 
         
    SM_CYSIZEFRAME,TEXT (
"SM_CYSIZEFRAME"),          
         
                           TEXT (
"Window sizing frame height"), 
         
    SM_CXMINTRACK,TEXT (
"SM_CXMINTRACK"),           
         
                           TEXT (
"Minimum window tracking width"), 
         
    SM_CYMINTRACK,TEXT (
"SM_CYMINTRACK"),           
         
                           TEXT (
"Minimum window tracking height"), 
         
    SM_CXDOUBLECLK,TEXT (
"SM_CXDOUBLECLK"),          
         
                           TEXT (
"Double click x tolerance"), 
         
    SM_CYDOUBLECLK,TEXT (
"SM_CYDOUBLECLK"),          
         
                           TEXT (
"Double click y tolerance"), 
         
    SM_CXICONSPACING,TEXT (
"SM_CXICONSPACING"),        
         
                           TEXT (
"Horizontal icon spacing"), 
         
    SM_CYICONSPACING,TEXT (
"SM_CYICONSPACING"),        
         
                           TEXT (
"Vertical icon spacing"), 
         
    SM_MENUDROPALIGNMENT,TEXT (
"SM_MENUDROPALIGNMENT"),    
         
                                  TEXT (
"Left or right menu drop"), 
         
    SM_PENWINDOWS,       TEXT (
"SM_PENWINDOWS"),           
         
                                  TEXT (
"Pen extensions installed"), 
         
    SM_DBCSENABLED,       TEXT (
"SM_DBCSENABLED"),          
         
                                  TEXT (
"Double-Byte Char Set enabled"), 
         
    SM_CMOUSEBUTTONS,        TEXT (
"SM_CMOUSEBUTTONS"),        
         
                                 TEXT (
"Number of mouse buttons"), 
         
    SM_SECURE,               TEXT (
"SM_SECURE"),               
         
                                  TEXT (
"Security present flag"), 
         
    SM_CXEDGE,               TEXT (
"SM_CXEDGE"),               
         
                                  TEXT (
"3-D border width"), 
         
    SM_CYEDGE,               TEXT (
"SM_CYEDGE"),               
         
                                  TEXT (
"3-D border height"), 
         
    SM_CXMINSPACING,         TEXT (
"SM_CXMINSPACING"),         
         
                                  TEXT (
"Minimized window spacing width"), 
         
    SM_CYMINSPACING,         TEXT (
"SM_CYMINSPACING"),         
         
                                  TEXT (
"Minimized window spacing height"), 
             SM_CXSMICON,         TEXT (
"SM_CXSMICON"),             
         
                                  TEXT (
"Small icon width"), 
         
    SM_CYSMICON,        TEXT (
"SM_CYSMICON"),             
         
                                  TEXT (
"Small icon height"), 
         
    SM_CYSMCAPTION,       TEXT (
"SM_CYSMCAPTION"),          
         
                                  TEXT (
"Small caption height"), 
         
    SM_CXSMSIZE,         TEXT (
"SM_CXSMSIZE"),             
         
                                 TEXT (
"Small caption button width"), 
         
    SM_CYSMSIZE,         TEXT (
"SM_CYSMSIZE"),             
         
                                  TEXT (
"Small caption button height"), 
         
    SM_CXMENUSIZE,       TEXT (
"SM_CXMENUSIZE"),           
         
                                  TEXT (
"Menu bar button width"), 
         
    SM_CYMENUSIZE,       TEXT (
"SM_CYMENUSIZE"),           
         
                                TEXT (
"Menu bar button height"), 
         
    SM_ARRANGE,              TEXT (
"SM_ARRANGE"),              
         
                                  TEXT (
"How minimized windows arranged"), 
         
    SM_CXMINIMIZED,      TEXT (
"SM_CXMINIMIZED"),          
         
                                  TEXT (
"Minimized window width"), 
         
    SM_CYMINIMIZED,       TEXT (
"SM_CYMINIMIZED"),          
         
                                  TEXT (
"Minimized window height"), 
         
    SM_CXMAXTRACK,       TEXT (
"SM_CXMAXTRACK"),          
         
                                  TEXT (
"Maximum draggable width"), 
         
    SM_CYMAXTRACK,       TEXT (
"SM_CYMAXTRACK"),           
         
                                 TEXT (
"Maximum draggable height"), 
         
    SM_CXMAXIMIZED,       TEXT (
"SM_CXMAXIMIZED"),          
         
                                  TEXT (
"Width of maximized window"), 
         
    SM_CYMAXIMIZED,       TEXT (
"SM_CYMAXIMIZED"),          
         
                                  TEXT (
"Height of maximized window"), 
         
    SM_NETWORK,          TEXT (
"SM_NETWORK"),              
         
                                  TEXT (
"Network present flag"), 
         
    SM_CLEANBOOT,         TEXT (
"SM_CLEANBOOT"),            
         
                                  TEXT (
"How system was booted"), 
         
    SM_CXDRAG,               TEXT (
"SM_CXDRAG"),               
         
                                  TEXT (
"Avoid drag x tolerance"), 
         
    SM_CYDRAG,               TEXT (
"SM_CYDRAG"),                        
                                  TEXT (
"Avoid drag y tolerance"), 
         
    SM_SHOWSOUNDS,        TEXT (
"SM_SHOWSOUNDS"),           
         
                                  TEXT (
"Present sounds visually"), 
         
    SM_CXMENUCHECK,       TEXT (
"SM_CXMENUCHECK"),          
         
                                 TEXT (
"Menu check-mark width"), 
         
    SM_CYMENUCHECK,       TEXT (
"SM_CYMENUCHECK"),          
         
                                 TEXT (
"Menu check-mark height"), 
         
    SM_SLOWMACHINE,       TEXT (
"SM_SLOWMACHINE"),          
         
                                  TEXT (
"Slow processor flag"), 
         
    SM_MIDEASTENABLED,       TEXT (
"SM_MIDEASTENABLED"),       
         
                                  TEXT (
"Hebrew and Arabic enabled flag"), 
         
    SM_MOUSEWHEELPRESENT,TEXT (
"SM_MOUSEWHEELPRESENT"),    
         
                                  TEXT (
"Mouse wheel present flag"), 
         
    SM_XVIRTUALSCREEN,       TEXT (
"SM_XVIRTUALSCREEN"),       
         
                                  TEXT (
"Virtual screen x origin"), 
         
    SM_YVIRTUALSCREEN,       TEXT (
"SM_YVIRTUALSCREEN"),       
         
                                  TEXT (
"Virtual screen y origin"), 
         
    SM_CXVIRTUALSCREEN,      TEXT (
"SM_CXVIRTUALSCREEN"),      
         
                                  TEXT (
"Virtual screen width"), 
         
    SM_CYVIRTUALSCREEN,      TEXT (
"SM_CYVIRTUALSCREEN"),      
         
                                  TEXT (
"Virtual screen height"), 
         
    SM_CMONITORS,       TEXT (
"SM_CMONITORS"),            
         
                                TEXT (
"Number of monitors"), 
         
    SM_SAMEDISPLAYFORMAT,TEXT (
"SM_SAMEDISPLAYFORMAT"),    
         
                                  TEXT (
"Same color format flag"
         
} ; 
       
-------------------------------------------------------------------------------
#include <windows.h> 
         
#include 
"sysmets.h" 
         
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; 
         
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
         
                 PSTR szCmdLine, 
int iCmdShow) 
         

         
    
static TCHAR szAppName[] = TEXT ("SysMets1") ; 
         
    HWND   hwnd ; 
         
    MSG   msg ; 
         
    WNDCLASS      wndclass ; 
         
    wndclass.style       
= CS_HREDRAW | CS_VREDRAW ; 
         
   wndclass.lpfnWndProc  
= WndProc ; 
         
   wndclass.cbClsExtra   
= 0 ; 
         
   wndclass.cbWndExtra   
= 0 ; 
         
   wndclass.hInstance    
= hInstance ; 
         
   wndclass.hIcon        
= LoadIcon (NULL, IDI_APPLICATION) ; 
         
    wndclass.hCursor      
= LoadCursor (NULL, IDC_ARROW) ; 
         
    wndclass.hbrBackground        
= (HBRUSH) GetStockObject (WHITE_BRUSH) ; 
         
    wndclass.lpszMenuName         
= NULL ; 
         
    wndclass.lpszClassName        
= szAppName ; 
         
    
         
    
if (!RegisterClass (&wndclass)) 
         
    { 
         
                 MessageBox (  NULL, TEXT (
"This program requires Windows NT!"), 
         
                          szAppName, MB_ICONERROR) ; 
         
   
         
    
return 0 ; 
         
    } 
         
    hwnd 
= CreateWindow (szAppName, TEXT ("Get System Metrics No. 1"), 
         
                   WS_OVERLAPPEDWINDOW, 
         
                   CW_USEDEFAULT, CW_USEDEFAULT, 
         
                   CW_USEDEFAULT, CW_USEDEFAULT, 
         
                   NULL, NULL, hInstance, NULL) ; 
         
    ShowWindow (hwnd, iCmdShow) ; 
         
    UpdateWindow (hwnd) ;          
    
while (GetMessage (&msg, NULL, 00)) 
         
                  { 
         
      TranslateMessage (
&msg) ; 
         
      DispatchMessage (
&msg) ; 
         
             } 
         
    
return msg.wParam ; 
         
     } 
         
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
         

     
//前綴為c代表[count],cxChar保存平均字符寬度,cxCaps保存大寫字母的平均寬度cyChar保存字符高度
    
//對于固定寬度字體cxChar = cxCaps
    static int    cxChar, cxCaps, cyChar ; 
         
    HDC                   hdc ; 
         
    
int                   i ; 
    
    
/*繪圖信息結構.程序呼叫BeginPaint時,windows會適當填入該結構的各個字段值,程序員使用前三個字段,其他字段由windows內部使用。
    typdedef struct tagPAINTSTRUCT
    {
        HDC hdc;//設備內容句柄,BeginPaint傳回值也曾是這個設備內容句柄

        BOOL fErase;//多數是為FALSE(0),意味windows已經擦出了無效矩形的背景,
        //如果要在窗口消息處理程序中自定義背景擦出行為,可以處理WM_ERASEBKGND消息
        //windows使用WNDCLASS結構的hbrBarkground字段指定的畫刷來擦除背景

        //如果程序通過呼叫windows函數InvalidateRect使顯示區域中的矩形失效,則該函數的最后一個參數會指定是否擦除背景,如果設為FALSE(即0),
        //windows將不會擦除背景,并且在呼叫完BeginPaint后PAINTSTRUCT結構的fErase字段將為TRUE(非零).
        //InwalidateRect(hwnd, NULL, TRUE);該呼叫在BeginPaint呼叫之前進行,它使整個顯示區域變為無效,并擦除背景。如果最后一個參數設置為FALSE,
        //則不擦除背景,原有的東西講保留在遠處。
        //通常這是windows程序在無論何時收到WM_PAINT消息而不考慮rcPaint結構的情況下簡單地重畫{整個顯示區域}最方便的方法。
        
        RECT rcPaint;//定義無效矩形(需要重畫的區域),如果無效矩形不為矩形,windows將繪圖操作限制在這個區域內
        BOOL fRestore;
        BOOL fIncUpdate;
        BYTE rgbReserved[32];
    }PAINTSRUCT;
    
*/
    PAINTSTRUCT ps ;      
         
    TCHAR                szBuffer [
10] ; 
         
    TEXTMETRIC  tm ;
//字體信息,提供了關于目前設備內容中選用的字體的豐富信息。
    /*
    typedef struct tagTEXTMETRIC
    {
        LONG tmHeight;//它是tmAscent和tmDescent的和,這兩個值表示了基準在線下字符的最大縱向高度
        LONG tmAscent;
        LONG tmDesent;
        //[間距]是指打印機在兩行文字間插入的空間,
        LONG tmInternalLeading;//內部間距,包括在tmAscent,它經常是重音符號出現的地方.設成0,加重音的字母會稍稍縮短一邊容納重音符號
        LONG tmExternalLeading;//外部間距,橫向字符之間的空間大小
        //下面是表述字符寬度的兩個字段,對于定寬字符,兩個字段的值相等
        LONG tmAveCharWidth;//小寫字母加權平均寬度
        LONG tmMaxCharWidth;//字體中最寬字符的寬度
        //其他結構字段,該結構攻20個字段
    }
    TEXTMETRIC, *PTEXTMETRIC;
    
*/
    
    
switch (message) 
         
    { 
         
   
case   WM_CREATE: 
         
/*取得設備內容句柄:1
         要得到窗口顯示區域的設備內容句柄,可以呼叫GetDC來取得句柄,在使用完后呼叫ReleaseDC: 
        hdc = GetDC (hwnd) ; 
                 
        使用GDI函數           
        ReleaseDC (hwnd, hdc) ; 
        與BeginPaint 和EndPaint 一樣,GetDC 和ReleaseDC 函數必須成對地使用.
        與從BeginPaint傳回設備內容句柄不同,GetDC傳回的設備內容句柄具有一個剪取矩形,{它等于整個顯示區域}。
        與 BeginPaint不同,GetDC不會使任何無效區域變為有效
        可以呼叫ValidateRect(hwnd, NULL)使真個顯示區域有效

        與GetDC相似的函數是GetWindowDC。GetDC傳回用于寫入窗口顯示區域的設備內容句柄,
        而GetWindowDC傳回寫入整個窗口的設備內容句柄。
        例如,您的程序可以使用從GetWindowDC傳回的設備內容句柄在窗口的 標題列上寫入文字。
        然而,程序同樣也應該處理WM_NCPAINT (「非顯示區域繪制」)消息。
         
*/
         hdc 
= GetDC (hwnd) ; 
         
        
//獲取字體大小,傳回設備內容中目前選取的字體信息,因此它需要設備內容句柄,windows將文字大小復制到tm結構中
          GetTextMetrics (hdc, &tm) ; 
         
          cxChar 
= tm.tmAveCharWidth ; //字符平均寬度
          
//對于可變寬字體,cxCaps設定為cxChar乘以150%,對于可變寬字體,TEXTMETRIC結構中tmPitchAndFamily字段的低位是1,對于固定寬度字體,該值為0
          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2* cxChar / 2 ;
         
          cyChar 
= tm.tmHeight + tm.tmExternalLeading ; //字符高度+上下行間距,每格cyChar為一行
         
 
          ReleaseDC (hwnd, hdc) ; 
         
          
return 0 ; 
         
 
    
case   WM_PAINT : 
         
/*取得設備內容句柄:2
         該函數需要窗口句柄和PAINTSTRUCT結構的變量(WINUSER.H中定義)的地址為參數
         呼叫BeginPaint一般在準備繪制時導致無效區域背景被擦除。該函數也填入ps結構的字段。返回值是設備內容句柄。
         然后程序就可以使用需要設備內容句柄的TextOut等GDI函數,最后呼叫EndPaint即可釋放設備內容句柄。
             一般地,處理WM_PAINT消息的形式如下: 
                    caseWM_PAINT: 
                             
                      hdc = BeginPaint (hwnd, &ps) ; 
                             
                             使用GDI函數           
                       EndPaint (hwnd, &ps) ; 
                             
                      return 0 ; 
         處理WM_PAINT消息時,必須成對的呼叫BeginPaint和EndPaint,如果不處理WM_PAINT,則它必須將WM_PAINT消息傳遞給Windows中DefWindowProc
         (windows內定的消息處理程序),改函數以下列代碼處理WM_PAINT消息:
             case WM_PAINT:                      
                BeginPaint (hwnd, &ps) ; 
                 //BeginPaint和EndPaint呼叫之間中沒有任何敘述,僅僅使先前無效區域變為有效
                EndPaint (hwnd, &ps) ;                      
               return 0 ; 
               但以下方法是錯誤的: 
                    case WM_PAINT: 
                        return 0 ;   // WRONG !!! 
          windows將一個WM_PAINT消息放到消息隊列中,是因為顯示區域的一部分無效。如果不呼叫BeginPaint和EndPaint(或者ValidateRect),windows不會
          使該區域變為有效。相反,Windows將發送另一個WM_PAINT消息,且一直發送下去
         
*/
          hdc 
= BeginPaint (hwnd, &ps) ; 
         
 
          
for (i = 0 ; i < NUMLINES ; i++
          {
                  
          
/*
          TextOut(hdc, x, y, psText, iLength)是用于顯示文字的最常用的GDI函數
          hdc是設備內容句柄,可是是GetDC的傳回值,也可以是處理WM_PAINT消息是BeginPaint的傳回值
          設備內容的屬性控制了被顯示的字符串的特征。比如字體顏色,背景顏色
          x, y是字符串的開始位置,x水平位置,y垂直位置
          psText是指向字符串的指針
          iLength是字符串長度[該串不能包含回車、換行、制表或退格,windows會將這些控制字符顯示為實心塊],TextOut不識別以0為結束標識符,所以需要
          iLength參數指明長度。
          
*/
         
//---------------下面三個TextOut分別顯示每一列
            TextOut       (hdc, 0, cyChar * i,                     
         
                         sysmetrics[i].szLabel, 
                                  lstrlen (sysmetrics[i].szLabel)) ; 
//顯示了大寫標識符
         
 
            TextOut       (hdc, 
22 * cxCaps, cyChar * i,     
         
                         sysmetrics[i].szDesc, 
         
                         lstrlen (sysmetrics[i].szDesc)) ; 
//敘述顯示對系統尺寸值的描述
         
 
                   SetTextAlign (hdc, TA_RIGHT 
| TA_TOP) ; //傳給后續TextOut函數的坐標將指定字符串的右上角
         
        TextOut (hdc, 
22 * cxCaps + 40 * cxChar, cyChar * i,   szBuffer, //40 * cxChar 包含第二列寬度和第三列寬度
         
    wsprintf (szBuffer, TEXT (
"%5d"), 
    
//獲取使用者接口上各類視覺組件大小的信息,返回一個整數,這個整數通常就是參數中指定的圖形組件大小
    GetSystemMetrics (sysmetrics[i].Index))) ; //敘述顯示從GetSystemMetrics函數取得的數值,szBuffer
         
              SetTextAlign (hdc, TA_LEFT 
| TA_TOP) ; 
         
         } 
         
            EndPaint (hwnd, 
&ps) ; 
         
            
return 0 ; 
         
    
case   WM_DESTROY : 
         
            PostQuitMessage (
0) ; 
         
    
return 0 ; 
         
    } 
         
    
return DefWindowProc (hwnd, message, wParam, lParam) ;