windows程序设计之窗口中显示多行文字

来源:互联网 发布:linux 修改用户组名 编辑:程序博客网 时间:2024/06/05 20:21

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);


}