输出文本与绘图.docx
《输出文本与绘图.docx》由会员分享,可在线阅读,更多相关《输出文本与绘图.docx(25页珍藏版)》请在冰豆网上搜索。
![输出文本与绘图.docx](https://file1.bdocx.com/fileroot1/2022-11/23/b09631fb-6dee-4622-bc12-3f630d28b1c5/b09631fb-6dee-4622-bc12-3f630d28b1c51.gif)
输出文本与绘图
第二讲:
输出文本与绘图
●显示器为多个程序共享,只能在窗口的客户区内输出。
●客户区是窗口中可以由程序任意书写和传递视觉信息的部分,通常显示了用户的某种交互需求
●窗口大小不固定,窗口之间的覆盖,要求开发者更新对应的客户区
●处理客户区的绘制,一般在WM_PAINT消息的处理过程中完成
●GDI:
GraphicsDeviceInterface
●WM_PAINT消息
1.在WinMain()中的UpdateWindow()函数直接给窗口过程发送第一个WM_PAINT消息。
2.当窗口客户区域的一部分或全部变成“无效”,以致必须刷新时,系统将产生这个消息:
(a)当窗口被最初创建时,整个客户区域都是无效的,第一个WM_PAINT消息通常是在WinMain()中调用UpdateWindow产生的;
(b)当窗口的大小发生变化时,整个客户区域都变得无效;
(c)当窗口区域的一部分不再被其他窗口遮盖之后,先前被遮盖的客户区域将变得无效;
●设备描述表(DC:
DeviceContext):
是GDI内部保存的数据结构,指物理输出设备,与特定显示设备相关,其属性定义了被输出文本的颜色、文本的背景色、字体等。
●设备描述表句柄是GDI函数的窗口“通行证”,有了这种设备内容句柄,程序员就能自如地在显示区域上绘图。
Windows提供了几个GDI函数,用于将字符串输出到窗口的显示区域内
●绘制的一般过程
●
●
●
●获取设备描述表句柄方法一:
处理WM_PAINT消息,必须使用BeginPaint()和EndPaint(),BeginPaint()和EndPaint()必须成对出现。
在BeginPaint()调用中,它使用注册窗口类的WNDCLASS结构的hbrBackGround域中指定的刷子来删除无效区域背景,BeginPaint()调用使整个客户区域有效。
如果窗口过程不处理WM_PAINT消息,则必须把它传给DefWindowProc()来处理,DefWindowProc()函数依次调用BeginPaint()和EndPaint()以使整个客户区域有效。
绘图信息结构PAINSTRUCT:
在程序调用BeginPaint()时,WINDOWS填充该结构的各个字段,若fErase为0,则意味着在调用BeginPaint()时,BeginPaint()已经用刷子删除无效区域背景;RECTrcPaint字段定义了包围无效区域的最小矩形,GDI输出函数只能在这个矩形内输出。
typedefstructtagPAINTSTRUCT
{
HDChdc;
BOOLfErase;
RECTrcPaint;
BOOLfRestore;
BOOLfIncUpdate;
BYTErgbReserved[32];
}PAINTSTRUCT;
●获取设备描述表句柄方法二:
在处理非WM_PAINT消息时,在客户区上做图获取设备描述表句柄的方法是GetDC()和ReleaseDC(),用GetDC()获取的设备描述表句柄,可在整个客户区上做图。
●程序必须在处理单个消息期间,获取和释放设备描述表句柄。
●系统字体:
设备描述表的默认字体是系统字体,系统字体是Windows用来在标题条、菜单和对话框中显示文本串的字体。
●字体大小:
系统用结构TEXTMETRIC来描述字体的各个参数,用函数GetTextMetrics(hdc,&tm)来取得当前字体的尺寸。
结构TEXTMETRIC的定义如下:
typedefstructtagTEXTMETRIC
{
LONGtmHeight;
LONGtmAscent;
LONGtmDescent;
LONGtmInternalLeading;
LONGtmExternalLeading;
LONGtmAveCharWidth;
LONGtmMaxCharWidth;
[otherstructurefields]
}TEXTMETRIC,*PTEXTMETRIC;
tmAveCharWidthfieldisaweightedaverageoflowercasecharacters.
tmMaxCharWidthisthewidthofthewidestcharacterinthefont.
ThelowbitofthetmPitchAndFamilyfieldintheTEXTMETRICstructureis1foravariable-widthfontand0forafixed-pitchfont.
●文本输出函数TextOut(hdc,x,y,psText,iLength):
TextOutwritesacharacterstringtotheclientareaofthewindow.ThepsTextargumentisapointertothecharacterstring,andiLengthisthelengthofthestringincharacters.Thexandyargumentsdefinethestartingpositionofthecharacterstringintheclientarea.(Moredetailssoononhowthesework.)Thehdcargumentisa"handletoadevicecontext".
●映射方式(MappingMode):
映射方式定义了如何把逻辑坐标转换成物理坐标,系统默认的映射方式是WM_TEXT,在WM_TEXT映射方式下,逻辑单位和物理单位相同,以像素为单位。
●输出文本程序例
/*-----------------------------------------------
SYSMETS.H--Systemmetricsdisplaystructure
-----------------------------------------------*/
#defineNUMLINES((int)(sizeofsysmetrics/sizeofsysmetrics[0]))
struct
{
intiIndex;
TCHAR*szLabel;
TCHAR*szDesc;
}
sysmetrics[]=
{
SM_CXSCREEN,TEXT("SM_CXSCREEN"),
TEXT("Screenwidthinpixels"),
SM_CYSCREEN,TEXT("SM_CYSCREEN"),
TEXT("Screenheightinpixels"),
SM_CXVSCROLL,TEXT("SM_CXVSCROLL"),
TEXT("Verticalscrollwidth"),
SM_CYHSCROLL,TEXT("SM_CYHSCROLL"),
TEXT("Horizontalscrollheight"),
SM_CYCAPTION,TEXT("SM_CYCAPTION"),
TEXT("Captionbarheight"),
SM_CXBORDER,TEXT("SM_CXBORDER"),
TEXT("Windowborderwidth"),
SM_CYBORDER,TEXT("SM_CYBORDER"),
TEXT("Windowborderheight"),
SM_CXFIXEDFRAME,TEXT("SM_CXFIXEDFRAME"),
TEXT("Dialogwindowframewidth"),
SM_CYFIXEDFRAME,TEXT("SM_CYFIXEDFRAME"),
TEXT("Dialogwindowframeheight"),
SM_CYVTHUMB,TEXT("SM_CYVTHUMB"),
TEXT("Verticalscrollthumbheight"),
SM_CXHTHUMB,TEXT("SM_CXHTHUMB"),
TEXT("Horizontalscrollthumbwidth"),
SM_CXICON,TEXT("SM_CXICON"),
TEXT("Iconwidth"),
SM_CYICON,TEXT("SM_CYICON"),
TEXT("Iconheight"),
SM_CXCURSOR,TEXT("SM_CXCURSOR"),
TEXT("Cursorwidth"),
SM_CYCURSOR,TEXT("SM_CYCURSOR"),
TEXT("Cursorheight"),
SM_CYMENU,TEXT("SM_CYMENU"),
TEXT("Menubarheight"),
SM_CXFULLSCREEN,TEXT("SM_CXFULLSCREEN"),
TEXT("Fullscreenclientareawidth"),
SM_CYFULLSCREEN,TEXT("SM_CYFULLSCREEN"),
TEXT("Fullscreenclientareaheight"),
SM_CYKANJIWINDOW,TEXT("SM_CYKANJIWINDOW"),
TEXT("Kanjiwindowheight"),
SM_MOUSEPRESENT,TEXT("SM_MOUSEPRESENT"),
TEXT("Mousepresentflag"),
SM_CYVSCROLL,TEXT("SM_CYVSCROLL"),
TEXT("Verticalscrollarrowheight"),
SM_CXHSCROLL,TEXT("SM_CXHSCROLL"),
TEXT("Horizontalscrollarrowwidth"),
SM_DEBUG,TEXT("SM_DEBUG"),
TEXT("Debugversionflag"),
SM_SWAPBUTTON,TEXT("SM_SWAPBUTTON"),
TEXT("Mousebuttonsswappedflag"),
SM_CXMIN,TEXT("SM_CXMIN"),
TEXT("Minimumwindowwidth"),
SM_CYMIN,TEXT("SM_CYMIN"),
TEXT("Minimumwindowheight"),
SM_CXSIZE,TEXT("SM_CXSIZE"),
TEXT("Min/Max/Closebuttonwidth"),
SM_CYSIZE,TEXT("SM_CYSIZE"),
TEXT("Min/Max/Closebuttonheight"),
SM_CXSIZEFRAME,TEXT("SM_CXSIZEFRAME"),
TEXT("Windowsizingframewidth"),
SM_CYSIZEFRAME,TEXT("SM_CYSIZEFRAME"),
TEXT("Windowsizingframeheight"),
SM_CXMINTRACK,TEXT("SM_CXMINTRACK"),
TEXT("Minimumwindowtrackingwidth"),
SM_CYMINTRACK,TEXT("SM_CYMINTRACK"),
TEXT("Minimumwindowtrackingheight"),
SM_CXDOUBLECLK,TEXT("SM_CXDOUBLECLK"),
TEXT("Doubleclickxtolerance"),
SM_CYDOUBLECLK,TEXT("SM_CYDOUBLECLK"),
TEXT("Doubleclickytolerance"),
SM_CXICONSPACING,TEXT("SM_CXICONSPACING"),
TEXT("Horizontaliconspacing"),
SM_CYICONSPACING,TEXT("SM_CYICONSPACING"),
TEXT("Verticaliconspacing"),
SM_MENUDROPALIGNMENT,TEXT("SM_MENUDROPALIGNMENT"),
TEXT("Leftorrightmenudrop"),
SM_PENWINDOWS,TEXT("SM_PENWINDOWS"),
TEXT("Penextensionsinstalled"),
SM_DBCSENABLED,TEXT("SM_DBCSENABLED"),
TEXT("Double-ByteCharSetenabled"),
SM_CMOUSEBUTTONS,TEXT("SM_CMOUSEBUTTONS"),
TEXT("Numberofmousebuttons"),
SM_SECURE,TEXT("SM_SECURE"),
TEXT("Securitypresentflag"),
SM_CXEDGE,TEXT("SM_CXEDGE"),
TEXT("3-Dborderwidth"),
SM_CYEDGE,TEXT("SM_CYEDGE"),
TEXT("3-Dborderheight"),
SM_CXMINSPACING,TEXT("SM_CXMINSPACING"),
TEXT("Minimizedwindowspacingwidth"),
SM_CYMINSPACING,TEXT("SM_CYMINSPACING"),
TEXT("Minimizedwindowspacingheight"),
SM_CXSMICON,TEXT("SM_CXSMICON"),
TEXT("Smalliconwidth"),
SM_CYSMICON,TEXT("SM_CYSMICON"),
TEXT("Smalliconheight"),
SM_CYSMCAPTION,TEXT("SM_CYSMCAPTION"),
TEXT("Smallcaptionheight"),
SM_CXSMSIZE,TEXT("SM_CXSMSIZE"),
TEXT("Smallcaptionbuttonwidth"),
SM_CYSMSIZE,TEXT("SM_CYSMSIZE"),
TEXT("Smallcaptionbuttonheight"),
SM_CXMENUSIZE,TEXT("SM_CXMENUSIZE"),
TEXT("Menubarbuttonwidth"),
SM_CYMENUSIZE,TEXT("SM_CYMENUSIZE"),
TEXT("Menubarbuttonheight"),
SM_ARRANGE,TEXT("SM_ARRANGE"),
TEXT("Howminimizedwindowsarranged"),
SM_CXMINIMIZED,TEXT("SM_CXMINIMIZED"),
TEXT("Minimizedwindowwidth"),
SM_CYMINIMIZED,TEXT("SM_CYMINIMIZED"),
TEXT("Minimizedwindowheight"),
SM_CXMAXTRACK,TEXT("SM_CXMAXTRACK"),
TEXT("Maximumdraggablewidth"),
SM_CYMAXTRACK,TEXT("SM_CYMAXTRACK"),
TEXT("Maximumdraggableheight"),
SM_CXMAXIMIZED,TEXT("SM_CXMAXIMIZED"),
TEXT("Widthofmaximizedwindow"),
SM_CYMAXIMIZED,TEXT("SM_CYMAXIMIZED"),
TEXT("Heightofmaximizedwindow"),
SM_NETWORK,TEXT("SM_NETWORK"),
TEXT("Networkpresentflag"),
SM_CLEANBOOT,TEXT("SM_CLEANBOOT"),
TEXT("Howsystemwasbooted"),
SM_CXDRAG,TEXT("SM_CXDRAG"),
TEXT("Avoiddragxtolerance"),
SM_CYDRAG,TEXT("SM_CYDRAG"),
TEXT("Avoiddragytolerance"),
SM_SHOWSOUNDS,TEXT("SM_SHOWSOUNDS"),
TEXT("Presentsoundsvisually"),
SM_CXMENUCHECK,TEXT("SM_CXMENUCHECK"),
TEXT("Menucheck-markwidth"),
SM_CYMENUCHECK,TEXT("SM_CYMENUCHECK"),
TEXT("Menucheck-markheight"),
SM_SLOWMACHINE,TEXT("SM_SLOWMACHINE"),
TEXT("Slowprocessorflag"),
SM_MIDEASTENABLED,TEXT("SM_MIDEASTENABLED"),
TEXT("HebrewandArabicenabledflag"),
SM_MOUSEWHEELPRESENT,TEXT("SM_MOUSEWHEELPRESENT"),
TEXT("Mousewheelpresentflag"),
SM_XVIRTUALSCREEN,TEXT("SM_XVIRTUALSCREEN"),
TEXT("Virtualscreenxorigin"),
SM_YVIRTUALSCREEN,TEXT("SM_YVIRTUALSCREEN"),
TEXT("Virtualscreenyorigin"),
SM_CXVIRTUALSCREEN,TEXT("SM_CXVIRTUALSCREEN"),
TEXT("Virtualscreenwidth"),
SM_CYVIRTUALSCREEN,TEXT("SM_CYVIRTUALSCREEN"),
TEXT("Virtualscreenheight"),
SM_CMONITORS,TEXT("SM_CMONITORS"),
TEXT("Numberofmonitors"),
SM_SAMEDISPLAYFORMAT,TEXT("SM_SAMEDISPLAYFORMAT"),
TEXT("Samecolorformatflag")
};
/*----------------------------------------------------
SYSMETS1.C--SystemMetricsDisplayProgramNo.1
(c)CharlesPetzold,1998
----------------------------------------------------*/
#defineWINVER0x0500
#include
#include"sysmets.h"
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,
PSTRszCmdLine,intiCmdShow)
{
staticTCHARszAppName[]=TEXT("SysMets1");
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
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("ThisprogramrequiresWindowsNT!
"),
szAppName,MB_ICONERROR);
return0;
}
hwnd=CreateWindow(szAppName,TEXT("GetSystemMetricsNo.1"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
ShowWindo