第四讲 WIN32编程入门(3)GDI.ppt
第二部分第二部分 Win32 SDK编程编程 在在Windows应用程序中,图形与文本都是通过图形设备接口,简称应用程序中,图形与文本都是通过图形设备接口,简称GDI(Graphics Device Interface),以图形形式来处理的。),以图形形式来处理的。GDI是是Windows的子系统,它负责在视讯显示器和打印机上显示图形。的子系统,它负责在视讯显示器和打印机上显示图形。GDI是是Windows非常重要的部分。要在窗口的显示区域绘图,可以使用非常重要的部分。要在窗口的显示区域绘图,可以使用Windows的图形设备接口(的图形设备接口(GDI)函数。从程序写作者的观点来看,)函数。从程序写作者的观点来看,GDI由几百个由几百个函数调用和一些相关的数据类型、宏和结构组成。函数调用和一些相关的数据类型、宏和结构组成。Windows提供了用于将提供了用于将字符串输出到窗口的显示区域内字符串输出到窗口的显示区域内TextOut等。该函数的格式如下:等。该函数的格式如下:BOOL TextOut(HDC hdc,/handle to device context int nXStart,/x-coordinate of starting position int nYStart,/y-coordinate of starting position LPCTSTR lpString,/pointer to string int cbString/number of characters in string );GDI简介简介设备内容(简称为设备内容(简称为DC):):句柄只不过是一个数值,句柄只不过是一个数值,Windows以它在内部使用对象。程序写作者从以它在内部使用对象。程序写作者从Windows取得句取得句柄,然后在其它函数中使用该句柄。设备内容句柄是柄,然后在其它函数中使用该句柄。设备内容句柄是GDI函数的窗口通行证,有了这种函数的窗口通行证,有了这种设备内容句柄,程序写作者就能自如地在显示区域上绘图。设备内容句柄,程序写作者就能自如地在显示区域上绘图。实际上实际上DC是是GDI内部保存的数据结构。设备内容与特定的显示设备(如视讯显示器或打印内部保存的数据结构。设备内容与特定的显示设备(如视讯显示器或打印机)相关。对于显示器,设备内容总是与显示器上的特定窗口相关。设备内容中的有些值是机)相关。对于显示器,设备内容总是与显示器上的特定窗口相关。设备内容中的有些值是图形属性,这些属性定义了图形属性,这些属性定义了GDI绘图函数工作的细节。例如,对于绘图函数工作的细节。例如,对于TextOut,设备内容的,设备内容的属性确定了属性确定了文字的颜色、文字的背景色、文字的颜色、文字的背景色、x坐标和坐标和y坐标映像到窗口的显示区域的方式,以及坐标映像到窗口的显示区域的方式,以及显示文字时显示文字时Windows使用的字体使用的字体。当程序需要绘图时,它必须先取得设备内容句柄。在取得了该句柄后,当程序需要绘图时,它必须先取得设备内容句柄。在取得了该句柄后,Windows用内定用内定的属性值填入内部设备内容结构。在后面的章节中您会看到,可以通过呼叫不同的的属性值填入内部设备内容结构。在后面的章节中您会看到,可以通过呼叫不同的GDI函数函数改变这些默认值。利用其它的改变这些默认值。利用其它的GDI函数可以取得这些属性的目前值。当然,还有其它的函数可以取得这些属性的目前值。当然,还有其它的GDI函数能够在窗口的显示区域真正地绘图。函数能够在窗口的显示区域真正地绘图。当程序在显示区域绘图完毕后,它必须释放设备内容句柄。句柄被程序释放后就不再有当程序在显示区域绘图完毕后,它必须释放设备内容句柄。句柄被程序释放后就不再有效,且不能再被使用。程序必须在处理单个消息处理期间取得和释放句柄。除了呼叫效,且不能再被使用。程序必须在处理单个消息处理期间取得和释放句柄。除了呼叫CreateDC(函数,在本章暂不讲述)建立的设备内容之外,程序不能在两个消息之间保存其(函数,在本章暂不讲述)建立的设备内容之外,程序不能在两个消息之间保存其它设备内容句柄。它设备内容句柄。GDI简介简介-HDC取得设备内容句柄的方法:取得设备内容句柄的方法:HDC hdc;hdc=BeginPaint(HWND hwnd,LPPAINTSTRUCT lpPaint);Do some drawing with hdc;EndPaint(HWND hwnd,CONST PAINTSTRUCT lpPaint);以上只能用于以上只能用于WM_PAINT消息响应中;消息响应中;hdc=GetDC(HWND hwnd);Do some drawing with hdc;ReleaseDC(HWND hwnd,HDChdc);以上用于非以上用于非WM_PAINT消息响应中消息响应中GDI简介简介-HDC设置字体颜色:设置字体颜色:COLORREF SetTextColor(HDC hdc,/handle to device context COLORREF crColor/text color);设置背景色:设置背景色:COLORREF SetBkColor(HDC hdc,/handle of device context COLORREF crColor/background color value);设置对其方式:设置对其方式:UINT SetTextAlign(HDC hdc,/handle to device context UINT fMode/text-alignment flag);GDI简介简介-字体字体字体参数:字体参数:BOOL GetTextMetrics(HDC hdc,/handle to device context LPTEXTMETRIC lptm/pointer to text metrics structure);typedef struct tagTEXTMETRIC LONG tmHeight;LONG tmAscent;LONG tmDescent;LONG tmInternalLeading;LONG tmExternalLeading;LONG tmAveCharWidth;LONG tmMaxCharWidth;其它结构字段其它结构字段 TEXTMETRIC,*PTEXTMETRIC;GDI简介简介-字体字体GDI简介简介-字体字体字体参数字体参数:GDI简介简介-字体字体字体参数字体参数:TEXTMETRIC tm;case WM_CREATE:hdc=GetDC(hwnd);/获得字体参数获得字体参数GetTextMetrics(hdc,&tm);cxChar=tm.tmAveCharWidth;cyChar=tm.tmHeight+tm.tmExternalLeading;ReleaseDC(hwnd,hdc);return 0;GDI简介简介-字体字体字体参数字体参数:For(i=0;i 10;i+)TextOut(hdc,0,i*cyChar,studentsi.stuOrder,strlen(studentsi.stuOrder);TextOut(hdc,cxChar*10,i*cyChar,studentsi.stuNo,strlen(studentsi.stuNo);SetTextAlign(hdc,TA_RIGHT);/设置对其方式设置对其方式TextOut(hdc,cxChar*30,i*cyChar,studentsi.stuName,strlen(studentsi.stuName);SetTextAlign(hdc,TA_LEFT);/设置对其方式设置对其方式TextOut(hdc,cxChar*50,i*cyChar,studentsi.stuSchool,strlen(studentsi.stuSchool);GDI简介简介练习练习 选择几个类似学号、姓名等信息的结构数据,选择几个类似学号、姓名等信息的结构数据,然后格式化输出这些信息。然后格式化输出这些信息。