该文件为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) ;