1、Windows的GetSystemMetrics函数中取得的信息是很有意义的,该函数传回Windows中不同视觉组件的大小信息,如图标、光标、标题栏和滚动条等。它们的大小因显示卡和驱动程序的不同而有所不同。GetSystemMetrics是在程序中完成与设备无关图形输出的重要函数。该函数需要一个参数,叫做「索引」,在Windows表头文件定义了75个整数索引标识符(标识符的数量随着每个版本的Windows的发布而不断地增加,在Windows 1.0的程序写作者文件中仅列出了26个)。GetSystemMetrics传回一个整数,这个整数通常就是参数中指定的图形组件大小。
该函数原型:GetTextMetrics (HDC hdc , TEXTMETRIC* tm) ;
其中 TEXTMETRIC结构体的定义如下:
typedef struct tagTEXTMETRIC
{
LONG tmHeight ; //tmAscent和tmDescent的和
LONGtmAscent ; //在TEXTMETRIC结构中,内部的间距包括在tmAscent中(因此也在tmHeight中),并且它经常是重音符号出现的地方
LONG tmDescent ;
LONGtmInternalLeading ; //tmInternalLeading字段可被设成0,在这种情况下,加重音的字母会稍稍缩短以便容纳重音符号
LONG tmExternalLeading ; //在横向字符之间的空间大小
LONG tmAveCharWidth ; //小写字母加权平均宽度
LONG tmMaxCharWidth ; //字体中最宽字符的宽度
//其它结构字段
}
TEXTMETRIC, * PTEXTMETRIC ;字体纵向大小由5个值确定:
2、TextOut是用于显示文字的最常用的GDI函数。语法是:
TextOut (hdc, x, y, psText, iLength) ;
第一个参数是设备内容句柄,它既可以是GetDC的传回值,也可以是在处理WM_PAINT消息时BeginPaint的传回值。psText参数是指向字符串的指针,iLength是字符串中字符的个数;x和y定义显示区域内字符串的开始位置,x是水平位置,y是垂直位置。
/*---------------------------------------------------------
SYSMETS.H -- System metrics display structure
-----------------------------------------------------------*/
#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" ),
//Defoe.Tu tyysoft@yahoo.com.cn Windows 程序设计 PDF 美化版
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" ),
//Defoe.Tu tyysoft@yahoo.com.cn Windows 程序设计 PDF 美化版
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")
} ;
/*------------------------------------------------------------------
SYSMETS1.C -- System Metrics Display Program No. 1
(c) Charles Petzold, 1998
----------------------------------------------------------------*/
#include <windows.h>
#include "system.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!" ),
//Defoe.Tu tyysoft@yahoo.com.cn Windows 程序设计 PDF 美化版
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, 0, 0))
{
TranslateMessage (& msg ) ;
DispatchMessage (& msg ) ;
}
return msg . wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cxCaps , cyChar ;
/* cxChar 保存平均字符宽度; cyChar 保存字符的总高度; cxCaps 大写字母的平均宽度(对于固定跨度的字符cxChar等于cxPaps,对于可变字体,cxCaps可以设定为cxChar乘以150%;对于可变宽度字体,TEXTMETRIC结构中的tmPitchAndFamily字段的低位为1,对于固定宽度字体,该值为0) */
HDC hdc ;
int i ;
PAINTSTRUCT ps ;
TCHAR szBuffer [10] ;
TEXTMETRIC tm ;
switch ( message)
{
case WM_CREATE:
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc , & tm) ;
cxChar = tm.tmAveCharWidth ;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc ) ;
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, & ps) ;
for ( i = 0 ; i < NUMLINES ; i++)
{
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 (hdc , 22 * cxCaps + 40 * cxChar, cyChar * i, szBuffer ,
wsprintf (szBuffer , TEXT ("%5d" ),
GetSystemMetrics(sysmetrics[ i].Index))) ;
SetTextAlign (hdc , TA_LEFT | TA_TOP ) ;
}
EndPaint (hwnd, & ps) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}