亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 4.輸出文字.txt

?? 本書介紹了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序?qū)懽鞯姆椒?
?? TXT
?? 第 1 頁 / 共 5 頁
字號:
輸出文字
 智能中國——游戲組  整理編譯   
 

--------------------------------------------------------------------------------

在前一章,您看到了一個簡單的Windows 98程序,它在窗口中央,或者更準(zhǔn)確地說,在顯示區(qū)域中央顯示一行文字。正如我們學(xué)到的,顯示區(qū)域是整個應(yīng)用程序窗口中未被標(biāo)題列、窗口邊框,以及可選的菜單列、工具列、狀態(tài)列和滾動條占據(jù)的部分。簡而言之,顯示區(qū)域是窗口中可以由程序任意書寫和傳遞視覺信息的部分。

對于程序的顯示區(qū)域,您幾乎可以為所欲為,只不過您不能假定窗口大小是某一特定尺寸,或者在程序執(zhí)行時其大小會保持不變。如果您不熟悉圖形窗口環(huán)境的程序設(shè)計,這些限制可能會使您感到驚訝:不能再假設(shè)屏幕上的一行文字一定有80個字符了。您的程序必須與其它Windows程序共享視訊顯示器。Windows使用者控制程序窗口在屏幕上顯示的方式。盡管可以建立固定大小的窗口(這對于計算器之類的應(yīng)用是合理的),但在大多數(shù)情況下,使用者應(yīng)該能夠改變應(yīng)用程序窗口的大小。您的程序必須能夠接受指定給它的大小,并且合理地利用這一空間。

這有兩種可能的情況。一種可能是,程序只有僅能顯示「hello」的顯示區(qū)域;還有另一種可能,即程序在一個大屏幕、高分辨率的系統(tǒng)上執(zhí)行,其顯示區(qū)域大得足以顯示兩整頁文字。靈活地處理這兩種極端是Windows程序設(shè)計的要點(diǎn)之一。

這一章,我們將講述程序在顯示區(qū)域顯示信息的方式,但比上一章說明的顯示方式更加復(fù)雜。當(dāng)程序在顯示區(qū)域顯示文字或圖形時,它經(jīng)常要「繪制」它的顯示區(qū)域。本章著重講述繪制的方法。

盡管Windows為顯示圖形提供了強(qiáng)大的圖形設(shè)備接口(GDI)函數(shù),但在這一章中,我只介紹簡單文字行的顯示。我也將忽略Windows能夠使用的不同字體外形及字體大小,僅使用Windows的內(nèi)定系統(tǒng)字體。這看起來似乎是一種限制,其實不然,本章涉及和解決的問題適用于所有Windows程序設(shè)計。在混合顯示文字和圖形時,Windows內(nèi)定字體的字符大小通常決定了圖形的尺寸。

本章表面上是討論繪圖的方法,實際上是討論與設(shè)備無關(guān)的程序設(shè)計基礎(chǔ)。Windows程序只能對顯示區(qū)域大小甚至字符的大小做很少的假定,相反地,必須使用Windows提供的功能來取得關(guān)于程序執(zhí)行環(huán)境的信息。

繪制和更新


在文字模式環(huán)境下,程序可以在顯示器的任意部分輸出,程序輸出到屏幕上的內(nèi)容會停留在原處,不會神秘地消失。因此,程序可以丟掉重新生成屏幕顯示時所需的信息。

在Windows中,只能在窗口的顯示區(qū)域繪制文字和圖形,而且不能確保在顯示區(qū)域內(nèi)顯示的內(nèi)容會一直保留到程序下一次有意地改寫它時還保留在那里。例如,使用者可能會在屏幕上移動另一個程序的窗口,這樣就可能覆蓋您的應(yīng)用程序窗口的一部分。Windows不會保存您的窗口中被其它程序覆蓋的區(qū)域,當(dāng)程序移開后,Windows會要求您的程序更新顯示區(qū)域的這個部分。

Windows是一個消息驅(qū)動系統(tǒng)。它通過把消息投入應(yīng)用程序消息隊列中或者把消息發(fā)送給合適的窗口消息處理程序,將發(fā)生的各種事件通知給應(yīng)用程序。Windows通過發(fā)送WM_PAINT消息通知窗口消息處理程序,窗口的部分顯示區(qū)域需要繪制。

WM_PAINT消息


大多數(shù)Windows程序在WinMain中進(jìn)入消息循環(huán)之前的初始化期間都要呼叫函數(shù)UpdateWindow。Windows利用這個機(jī)會給窗口消息處理程序發(fā)送第一個WM_PAINT消息。這個消息通知窗口消息處理程序:必須繪制顯示區(qū)域。此后,窗口消息處理程序應(yīng)在任何時刻都準(zhǔn)備好處理其它WM_PAINT消息,必要的話,甚至重新繪制窗口的整個顯示區(qū)域。在發(fā)生下面幾種事件之一時,窗口消息處理程序會接收到一個WM_PAINT消息:

在使用者移動窗口或顯示窗口時,窗口中先前被隱藏的區(qū)域重新可見。
  
使用者改變窗口的大?。ㄈ绻翱陬悇e樣式有著CS_HREDRAW和CS_VREDRAW位旗標(biāo)的設(shè)定)。
  
程序使用ScrollWindow或ScrollDC函數(shù)滾動顯示區(qū)域的一部分。
  
程序使用InvalidateRect或InvalidateRgn函數(shù)刻意產(chǎn)生WM_PAINT消息。
  
在某些情況下,顯示區(qū)域的一部分被臨時覆蓋,Windows試圖保存一個顯示區(qū)域,并在以后恢復(fù)它,但這不一定能成功。在以下情況下,Windows可能發(fā)送WM_PAINT消息:

Windows擦除覆蓋了部分窗口的對話框或消息框。
  
菜單下拉出來,然后被釋放。
  
顯示工具提示消息。
  
在某些情況下,Windows總是保存它所覆蓋的顯示區(qū)域,然后恢復(fù)它。這些情況是:

鼠標(biāo)光標(biāo)穿越顯示區(qū)域。
  
圖標(biāo)拖過顯示區(qū)域。
  
處理WM_PAINT消息要求程序?qū)懽髡吒淖冏约合蝻@示器輸出的思維方式。程序應(yīng)該組織成可以保留繪制顯示區(qū)域需要的所有信息,并且僅當(dāng)「響應(yīng)要求」-即Windows給窗口消息處理程序發(fā)送WM_PAINT消息時才進(jìn)行繪制。如果程序在其它時間需要更新其顯示區(qū)域,它可以強(qiáng)制Windows產(chǎn)生一個WM_PAINT消息。這看來似乎是在屏幕上顯示內(nèi)容的一種舍近求遠(yuǎn)的方法。但您的程序結(jié)構(gòu)可以從中受益。

有效矩形和無效矩形


盡管窗口消息處理程序一旦接收到WM_PAINT消息之后,就準(zhǔn)備更新整個顯示區(qū)域,但它經(jīng)常只需要更新一個較小的區(qū)域(最常見的是顯示區(qū)域中的矩形區(qū)域)。顯然,當(dāng)對話框覆蓋了部分顯示區(qū)域時,情況即是如此。在擦除對話框之后,需要重畫的只是先前被對話框遮住的矩形區(qū)域。

這個區(qū)域稱為「無效區(qū)域」或「更新區(qū)域」。正是顯示區(qū)域內(nèi)無效區(qū)域的存在,才會讓W(xué)indows將一個WM_PAINT消息放在應(yīng)用程序的消息隊列中。只有在顯示區(qū)域的某一部分失效時,窗口才會接受WM_PAINT消息。

Windows內(nèi)部為每個窗口保存一個「繪圖信息結(jié)構(gòu)」,這個結(jié)構(gòu)包含了包圍無效區(qū)域的最小矩形的坐標(biāo)以及其它信息,這個矩形就叫做「無效矩形」,有時也稱為「無效區(qū)域」。如果在窗口消息處理程序處理WM_PAINT消息之前顯示區(qū)域中的另一個區(qū)域變?yōu)闊o效,則Windows計算出一個包圍兩個區(qū)域的新的無效區(qū)域(以及一個新的無效矩形),并將這種變化后的信息放在繪制信息結(jié)構(gòu)中。Windows不會將多個WM_PAINT消息都放在消息隊列中。

窗口消息處理程序可以通過呼叫InvalidateRect使顯示區(qū)域內(nèi)的矩形無效。如果消息隊列中已經(jīng)包含一個WM_PAINT消息,Windows將計算出新的無效矩形。否則,它將一個新的WM_PAINT消息放入消息隊列中。在接收到WM_PAINT消息時,窗口消息處理程序可以取得無效矩形的坐標(biāo)(我們馬上就會看到這一點(diǎn))。通過呼叫GetUpdateRect,可以在任何時候取得這些坐標(biāo)。

在處理WM_PAINT消息處理期間,窗口消息處理程序在呼叫了BeginPaint之后,整個顯示區(qū)域即變?yōu)橛行?。程序也可以通過呼叫ValidateRect函數(shù)使顯示區(qū)域內(nèi)的任意矩形區(qū)域變?yōu)橛行?。如果這呼叫具有令整個無效區(qū)域變?yōu)橛行У男Ч瑒t目前隊列中的任何WM_PAINT消息都將被刪除。

GDI 簡介


要在窗口的顯示區(qū)域繪圖,可以使用Windows的圖形設(shè)備接口(GDI)函數(shù)。Windows提供了幾個GDI函數(shù),用于將字符串輸出到窗口的顯示區(qū)域內(nèi)。我們已經(jīng)在上一章看過DrawText函數(shù),但是目前使用最為普遍的文字輸出函數(shù)是TextOut。該函數(shù)的格式如下:

TextOut (hdc, x, y, psText, iLength) ;
        
TextOut向窗口的顯示區(qū)域?qū)懭胱址sText參數(shù)是指向字符串的指針,iLength是字符串的長度。x和y參數(shù)定義了字符串在顯示區(qū)域的開始位置(不久會講述關(guān)于它們的詳細(xì)情況)。hdc參數(shù)是「設(shè)備內(nèi)容句柄」,它是GDI的重要部分。實際上,每個GDI函數(shù)都需要將這個句柄作為函數(shù)的第一個參數(shù)。

設(shè)備內(nèi)容


讀者可能還記得,句柄只不過是一個數(shù)值,Windows以它在內(nèi)部使用對象。程序?qū)懽髡邚腤indows取得句柄,然后在其它函數(shù)中使用該句柄。設(shè)備內(nèi)容句柄是GDI函數(shù)的窗口「通行證」,有了這種設(shè)備內(nèi)容句柄,程序?qū)懽髡呔湍茏匀绲卦陲@示區(qū)域上繪圖,使圖形如自己所愿地變得好看或者難看。

設(shè)備內(nèi)容(簡稱為「DC」)實際上是GDI內(nèi)部保存的數(shù)據(jù)結(jié)構(gòu)。設(shè)備內(nèi)容與特定的顯示設(shè)備(如視訊顯示器或打印機(jī))相關(guān)。對于視訊顯示器,設(shè)備內(nèi)容總是與顯示器上的特定窗口相關(guān)。

設(shè)備內(nèi)容中的有些值是圖形「屬性」,這些屬性定義了GDI繪圖函數(shù)工作的細(xì)節(jié)。例如,對于TextOut,設(shè)備內(nèi)容的屬性確定了文字的顏色、文字的背景色、x坐標(biāo)和y坐標(biāo)映像到窗口的顯示區(qū)域的方式,以及顯示文字時Windows使用的字體。

當(dāng)程序需要繪圖時,它必須先取得設(shè)備內(nèi)容句柄。在取得了該句柄后,Windows用內(nèi)定的屬性值填入內(nèi)部設(shè)備內(nèi)容結(jié)構(gòu)。在后面的章節(jié)中您會看到,可以通過呼叫不同的GDI函數(shù)改變這些默認(rèn)值。利用其它的GDI函數(shù)可以取得這些屬性的目前值。當(dāng)然,還有其它的GDI函數(shù)能夠在窗口的顯示區(qū)域真正地繪圖。

當(dāng)程序在顯示區(qū)域繪圖完畢后,它必須釋放設(shè)備內(nèi)容句柄。句柄被程序釋放后就不再有效,且不能再被使用。程序必須在處理單個消息處理期間取得和釋放句柄。除了呼叫CreateDC(函數(shù),在本章暫不講述)建立的設(shè)備內(nèi)容之外,程序不能在兩個消息之間保存其它設(shè)備內(nèi)容句柄。

Windows應(yīng)用程序一般使用兩種方法來取得設(shè)備內(nèi)容句柄,以備在屏幕上繪圖。

取得設(shè)備內(nèi)容句柄:方法一


在處理WM_PAINT消息時,使用這種方法。它涉及BeginPaint和EndPaint兩個函數(shù),這兩個函數(shù)需要窗口句柄(作為參數(shù)傳給窗口消息處理程序)和PAINTSTRUCT結(jié)構(gòu)的變量(在WINUSER.H表頭文件中定義)的地址為參數(shù)。Windows程序?qū)懽髡咄ǔ0堰@一結(jié)構(gòu)變量命名為ps并且在窗口消息處理程序中定義它:

PAINTSTRUCT ps ;
        
在處理WM_PAINT消息時,窗口消息處理程序首先呼叫BeginPaint。BeginPaint函數(shù)一般在準(zhǔn)備繪制時導(dǎo)致無效區(qū)域的背景被擦除。該函數(shù)也填入ps結(jié)構(gòu)的字段。BeginPaint傳回的值是設(shè)備內(nèi)容句柄,這一傳回值通常被保存在叫做hdc的變量中。它在窗口消息處理程序中的定義如下:

HDC hdc ;
        
HDC數(shù)據(jù)型態(tài)定義為32位的無正負(fù)號整數(shù)。然后,程序就可以使用需要設(shè)備內(nèi)容句柄的TextOut等GDI函數(shù)。呼叫EndPaint即可釋放設(shè)備內(nèi)容句柄。

一般地,處理WM_PAINT消息的形式如下:

caseWM_PAINT:
        
  hdc = BeginPaint (hwnd, &ps) ;
        
         使用GDI函數(shù)
        
  EndPaint (hwnd, &ps) ;
        
  return 0 ;
        
在處理WM_PAINT消息時,必須成對地呼叫BeginPaint和EndPaint。如果窗口消息處理程序不處理WM_PAINT消息,則它必須將WM_PAINT消息傳遞給Windows中DefWindowProc(內(nèi)定窗口消息處理程序)。DefWindowProc以下列代碼處理WM_PAINT消息:

case WM_PAINT:
        
    BeginPaint (hwnd, &ps) ;
        
    EndPaint (hwnd, &ps) ;
        
   return 0 ;
        
這兩個BeginPaint和EndPaint呼叫之間中沒有任何敘述,僅僅使先前無效區(qū)域變?yōu)橛行А5韵路椒ㄊ清e誤的:

case WM_PAINT:
        
    return 0 ;   // WRONG !!!
        
Windows將一個WM_PAINT消息放到消息隊列中,是因為顯示區(qū)域的一部分無效。如果不呼叫BeginPaint和EndPaint(或者ValidateRect),則Windows不會使該區(qū)域變?yōu)橛行АO喾?,Windows將發(fā)送另一個WM_PAINT消息,且一直發(fā)送下去。

繪圖信息結(jié)構(gòu)


前面提到過,Windows為每個窗口保存一個「繪圖信息結(jié)構(gòu)」,這就是PAINTSTRUCT,定義如下:

typedef struct tagPAINTSTRUCT
        
{
        
  HDC           hdc ;
        
    BOOL      fErase ;
        
    RECT      rcPaint ;
        
    BOOL          fRestore ;
        
    BOOL          fIncUpdate ;
        
    BYTE          rgbReserved[32] ;
        
} PAINTSTRUCT ;
        
在程序呼叫BeginPaint時,Windows會適當(dāng)填入該結(jié)構(gòu)的各個字段值。使用者程序只使用前三個字段,其它字段由Windows內(nèi)部使用。hdc字段是設(shè)備內(nèi)容句柄。在舊版本的Windows中,BeginPaint的傳回值也曾是這個設(shè)備內(nèi)容句柄。在大多數(shù)情況下, fErase被標(biāo)志為FALSE(0),這意味著Windows已經(jīng)擦除了無效矩形的背景。這最早在BeginPaint函數(shù)中發(fā)生(如果要在窗口消息處理程序中自己定義一些背景擦除行為,可以自行處理WM_ERASEBKGND消息)。Windows使用WNDCLASS結(jié)構(gòu)的hbrBackground字段指定的畫刷來擦除背景,這個WNDCLASS結(jié)構(gòu)是程序在WinMain初始化期間登錄窗口類別時使用的。許多Windows程序使用白色畫刷。以下敘述設(shè)定窗口類別結(jié)構(gòu)字段值:

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        
不過,如果程序通過呼叫Windows函數(shù)InvalidateRect使顯示區(qū)域中的矩形失效,則該函數(shù)的最后一個參數(shù)會指定是否擦除背景。如果這個參數(shù)為FALSE(即0),則Windows將不會擦除背景,并且在呼叫完BeginPaint后PAINTSTRUCT結(jié)構(gòu)的fErase字段將為TRUE(非零)。

PAINTSTRUCT結(jié)構(gòu)的rcPaint字段是RECT型態(tài)的結(jié)構(gòu)。您已經(jīng)在第三章中看到,RECT結(jié)構(gòu)定義了一個矩形,其四個字段為left、top、right和bottom。PAINTSTRUCT結(jié)構(gòu)的rcPaint字段定義了無效矩形的邊界,如圖4-1所示。這些值均以圖素為單位,并相對于顯示區(qū)域的左上角。無效矩形是應(yīng)該重畫的區(qū)域。


 



圖4-1 無效矩形的邊界
 

PAINTSTRUCT中的rcPaint矩形不僅是無效矩形,它還是一個「剪取」矩形。這意味著Windows將繪圖操作限制在剪取矩形內(nèi)(更確切地說,如果無效矩形區(qū)域不為矩形,則Windows將繪圖操作限制在這個區(qū)域內(nèi))。

在處理WM_PAINT消息時,為了在更新的矩形外繪圖,可以使用如下呼叫:

InvalidateRect (hwnd, NULL, TRUE) ;
        
該呼叫在BeginPaint呼叫之前進(jìn)行,它使整個顯示區(qū)域變?yōu)闊o效,并擦除背景。但是,如果最后一個參數(shù)等于FALSE,則不擦除背景,原有的東西將保留在原處。

通常這是Windows程序在無論何時收到WM_PAINT消息而不考慮rcPaint結(jié)構(gòu)的情況下簡單地重畫整個顯示區(qū)域最方便的方法。例如,如果在顯示區(qū)域的顯示輸出中包括了一個圓,但是只有圓的一部分落到了無效矩形中,它就使僅繪制圓的無效部分變得沒有意義。這需要畫整個圓。在您使用從BeginPaint傳回的設(shè)備內(nèi)容句柄時,Windows不會繪制rcPaint矩形外的任何部分。

在第三章的HELLOWIN程序中,我們并不關(guān)心處理WM_PAINT消息時的無效矩形。如果文字顯示區(qū)域恰巧在無效矩形內(nèi),則由DrawText恢復(fù)之。否則,在處理DrawText呼叫的某個時刻,Windows會確定它無須向顯示器上輸出。不過,這一決定需要時間。關(guān)心程序性能和速度的程序?qū)懽髡呦M谔幚鞼M_PAINT期間使用無效矩形范圍,以避免不必要的GDI呼叫。如果繪制時需要存取例如位圖這樣的磁盤文件,則這就顯得尤其重要。

取得設(shè)備內(nèi)容句柄:方法二


雖然最好是在處理WM_PAINT消息處理期間更新整個顯示區(qū)域,但是您也會發(fā)現(xiàn)在處理非WM_PAINT消息處理期間繪制顯示區(qū)域的某個部分也是非常有用的?;蛘吣枰獙⒃O(shè)備內(nèi)容句柄用于其它目的,如取得設(shè)備內(nèi)容的信息。

要得到窗口顯示區(qū)域的設(shè)備內(nèi)容句柄,可以呼叫GetDC來取得句柄,在使用完后呼叫ReleaseDC:

hdc = GetDC (hwnd) ;
        
使用GDI函數(shù)
        
ReleaseDC (hwnd, hdc) ;
        
與BeginPaint和EndPaint一樣,GetDC和ReleaseDC函數(shù)必須成對地使用。如果在處理某消息時呼叫GetDC,則必須在退出窗口消息處理程序之前呼叫ReleaseDC。不要在一個消息中呼叫GetDC卻在另一個消息呼叫ReleaseDC。

與從BeginPaint傳回設(shè)備內(nèi)容句柄不同,GetDC傳回的設(shè)備內(nèi)容句柄具有一個剪取矩形,它等于整個顯示區(qū)域。可以在顯示區(qū)域的某一部分繪圖,而不只是在無效矩形上繪圖(如果確實存在無效矩形)。與BeginPaint不同,GetDC不會使任何無效區(qū)域變?yōu)橛行АH绻枰拐麄€顯示區(qū)域有效,可以呼叫

ValidateRect (hwnd, NULL) ;
        
一般可以呼叫GetDC和ReleaseDC來對鍵盤消息(如在字處理程序中)和鼠標(biāo)消息(如在畫圖程序中)作出反應(yīng)。此時,程序可以立刻根據(jù)使用者的鍵盤或鼠標(biāo)輸入來更新顯示區(qū)域,而不需要考慮為了窗口的無效區(qū)域而使用WM_PAINT消息。不過,一旦確實收到了WM_PAINT消息,程序就必須要收集足夠的信息后才能更新顯示。

與GetDC相似的函數(shù)是GetWindowDC。GetDC傳回用于寫入窗口顯示區(qū)域的設(shè)備內(nèi)容句柄,而GetWindowDC傳回寫入整個窗口的設(shè)備內(nèi)容句柄。例如,您的程序可以使用從GetWindowDC傳回的設(shè)備內(nèi)容句柄在窗口的標(biāo)題列上寫入文字。然而,程序同樣也應(yīng)該處理WM_NCPAINT (「非顯示區(qū)域繪制」)消息。

TextOut:細(xì)節(jié)


TextOut是用于顯示文字的最常用的GDI函數(shù)。語法是:

TextOut (hdc, x, y, psText, iLength) ;
        
以下將詳細(xì)地討論這個函數(shù)。

第一個參數(shù)是設(shè)備內(nèi)容句柄,它既可以是GetDC的傳回值,也可以是在處理WM_PAINT消息時BeginPaint的傳回值。

設(shè)備內(nèi)容的屬性控制了被顯示的字符串的特征。例如,設(shè)備內(nèi)容中有一個屬性指定文字顏色,內(nèi)定顏色為黑色;內(nèi)定設(shè)備內(nèi)容還定義了白色的背景。在程序向顯示器輸出文字時,Windows使用這個背景色來填入字符周圍的矩形空間(稱為「字符框」)。

該文字背景色與定義窗口類別時設(shè)置的背景并不相同。窗口類別中的背景是一個畫刷,它是一種純色或者非純色組成的畫刷,Windows用它來擦除顯示區(qū)域,它不是設(shè)備內(nèi)容結(jié)構(gòu)的一部分。在定義窗口類別結(jié)構(gòu)時,大多數(shù)Windows應(yīng)用程序使用WHITE_BRUSH,以便內(nèi)定設(shè)備內(nèi)容中的內(nèi)定文字背景顏色與Windows用以擦除顯示區(qū)域背景的畫刷顏色相同。

psText參數(shù)是指向字符串的指針,iLength是字符串中字符的個數(shù)。如果psText指向Unicode字符串,則字符串中的字節(jié)數(shù)就是iLength值的兩倍。字符串中不能包含任何ASCII控制字符(如回車、換行、制表或退格),Windows會將這些控制字符顯示為實心塊。Text0ut不識別作為字符串結(jié)束標(biāo)志的內(nèi)容為零的字節(jié)(對于Unicode,是一個短整數(shù)型態(tài)的0),而需要由nLength參數(shù)指明長度。

TextOut中的x和y定義顯示區(qū)域內(nèi)字符串的開始位置,x是水平位置,y是垂直位置。字符串中第一個字符的左上角位于坐標(biāo)點(diǎn)(x,y)。在內(nèi)定的設(shè)備內(nèi)容中,原點(diǎn)(x和y均為0的點(diǎn))是顯示區(qū)域的左上角。如果在TextOut中將x和y設(shè)為0,則將從顯示區(qū)域左上角開始輸出字符串。

當(dāng)您閱讀GDI繪圖函數(shù)(例如TextOut)的文件時,就會發(fā)現(xiàn)傳遞給函數(shù)的坐標(biāo)常常被稱為「邏輯坐標(biāo)」。在第五章會詳細(xì)地解釋這種情況。現(xiàn)在請注意,Windows有許多「坐標(biāo)映像方式」,它們用來控制GDI函數(shù)指定的邏輯坐標(biāo)轉(zhuǎn)換為顯示器的實際圖素坐標(biāo)的方式。映像方式在設(shè)備內(nèi)容中定義,內(nèi)定映像方式是MM_TEXT(使用WINGDI.H中定義的標(biāo)識符)。在MM_TEXT映像方式下,邏輯單位與實際單位相同,都是圖素;x的值從左向右遞增,y的值從上向下遞增(參看圖4-2)。MM_TEXT坐標(biāo)系與Windows在PAINTSTRUCT結(jié)構(gòu)中定義無效矩形時使用的坐標(biāo)系相同,這為我們帶來了很多方便(但是,其它映像方式并非如此)。


 



圖4-2 MM_TEXT映像方式下的x坐標(biāo)和y坐標(biāo)
 

設(shè)備內(nèi)容也定義了一個剪裁區(qū)域。您已經(jīng)看到,對于從GetDC取得的設(shè)備內(nèi)容句柄,內(nèi)定剪裁區(qū)域是整個顯示區(qū)域;而對于從BeginPaint取得的設(shè)備內(nèi)容句柄,則為無效區(qū)域。Windows不會在剪裁區(qū)域之外的任何位置顯示字符串。如果一個字符有一部分在剪裁區(qū)域外,則Windows將只顯示此區(qū)域內(nèi)的那部分。要想將輸出寫到窗口的顯示區(qū)域之外不是那么容易的,所以不用擔(dān)心會無意間出現(xiàn)這種事情。

系統(tǒng)字體


設(shè)備內(nèi)容還定義了在您呼叫TextOut顯示文字時Windows使用的字體。內(nèi)定字體為「系統(tǒng)字體」,或用Windows表頭文件中的標(biāo)識符,即SYSTEM_FONT。系統(tǒng)字體是Windows用來在標(biāo)題列、菜單和對話框中顯示字符串的內(nèi)定字體。

在Windows的早期版本中,系統(tǒng)字體是等寬(fixed-pitch)字體,這意味著所有字符均具有同樣的寬度,非常類似于打字機(jī)。然而,從Windows 3.0開始,系統(tǒng)字體成為一種變寬(variable-pitch)字體,這意味著不同的字符具有不同的大小,比如,「W」要比「i」寬。變寬字體比等寬字體好讀,這已經(jīng)是公認(rèn)的事實。不過,可以想見,這一轉(zhuǎn)變使很多原來的Windows程序代碼不再適用,從而要求程序?qū)懽髡邔W(xué)習(xí)一些使用字體的新技術(shù)。

系統(tǒng)字體是一種「點(diǎn)陣字體」,這意味著字符被定義為圖素塊(在第十七章,將討論TrueType字體,它是由輪廓定義的)。至于確切的大小,系統(tǒng)字體的字符大小取決于視訊顯示器的大小。系統(tǒng)字體設(shè)計為至少能在顯示器上顯示25行80列文字。

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
洋洋av久久久久久久一区| 久久精品国产一区二区三区免费看| 亚洲图片另类小说| 一区二区三区美女视频| 色哟哟一区二区| 精品日韩成人av| 亚洲欧洲国产日本综合| 美女脱光内衣内裤视频久久网站| 成人18精品视频| 欧美日本一区二区在线观看| 国产精品久久午夜夜伦鲁鲁| 精品一二线国产| 欧美四级电影网| 欧美国产97人人爽人人喊| 青青草国产成人99久久| 色婷婷综合久久久中文字幕| 亚洲第一成人在线| 91麻豆免费看| 国产精品麻豆欧美日韩ww| 国产在线视视频有精品| 欧美精品一二三区| 一区二区三区在线看| 欧美精品一二三区| 国产黑丝在线一区二区三区| 精品久久久久99| 丁香六月久久综合狠狠色| 2023国产精品自拍| 麻豆中文一区二区| 国产精品你懂的在线| 91行情网站电视在线观看高清版| 亚洲免费在线电影| 91日韩一区二区三区| 日本成人在线网站| 欧美一卡二卡三卡四卡| 亚洲五月六月丁香激情| 欧洲色大大久久| 亚洲午夜免费福利视频| 久久综合色之久久综合| 在线视频欧美精品| 国产在线精品一区二区不卡了 | 岛国精品在线播放| 亚洲成av人影院| 国产精品视频免费看| 91精品国产色综合久久不卡电影| 成人污视频在线观看| 另类小说视频一区二区| 亚洲综合激情网| 欧美久久婷婷综合色| 成人开心网精品视频| 麻豆精品在线视频| 亚洲一区二区av在线| 国产女主播视频一区二区| 成人av网站在线观看免费| 免费视频一区二区| 亚洲一卡二卡三卡四卡无卡久久| 国产免费久久精品| 精品少妇一区二区三区在线播放| 欧美午夜精品一区二区蜜桃| 成人综合在线观看| 国产综合成人久久大片91| 天天操天天干天天综合网| 精品国产91久久久久久久妲己 | 色婷婷av一区二区三区gif| 国产美女视频一区| 三级亚洲高清视频| 国产亚洲一区二区在线观看| 91污在线观看| 丰满少妇久久久久久久 | 亚洲午夜激情网站| 亚洲欧美综合色| 亚洲国产精品成人综合 | 中文字幕一区二区三区不卡| 久久综合999| 日韩三区在线观看| 99精品视频一区| 日韩av电影天堂| 三级一区在线视频先锋| 午夜精彩视频在线观看不卡| 亚洲成人资源网| 午夜视频在线观看一区二区| 亚洲国产欧美日韩另类综合| 亚洲电影视频在线| 亚洲亚洲精品在线观看| 亚洲午夜视频在线观看| 婷婷丁香久久五月婷婷| 秋霞电影一区二区| 激情综合色播激情啊| 国产精品一区二区三区网站| 亚洲成人免费在线观看| 亚洲大片在线观看| 日本一道高清亚洲日美韩| 美女网站色91| 国产美女娇喘av呻吟久久| 国产成人午夜99999| 不卡在线视频中文字幕| 91色视频在线| 欧美日韩国产高清一区二区 | 奇米一区二区三区| 国内精品久久久久影院薰衣草| 国产最新精品精品你懂的| 国产盗摄一区二区| 不卡区在线中文字幕| 91成人免费在线| 欧美一区三区二区| 国产亚洲欧美日韩日本| 亚洲精品一二三区| 国产精品你懂的在线| 一二三四区精品视频| 青青草原综合久久大伊人精品优势| 精东粉嫩av免费一区二区三区| 成人精品在线视频观看| 在线精品视频免费播放| 欧美成人bangbros| 中文字幕一区二区三区在线播放 | 天天爽夜夜爽夜夜爽精品视频| 激情综合色播五月| 99国产一区二区三精品乱码| 在线成人av网站| 久久久久国产免费免费| 2020国产成人综合网| 亚洲欧美在线aaa| 日韩国产精品大片| 本田岬高潮一区二区三区| 成人av电影观看| 欧美一区二区三区视频在线 | 中文字幕在线不卡| 免费成人在线观看视频| 成人黄色a**站在线观看| 3d动漫精品啪啪一区二区竹菊 | 国产一区二区三区不卡在线观看| 欧美日韩和欧美的一区二区| 国产婷婷色一区二区三区四区| 亚洲国产裸拍裸体视频在线观看乱了| 国产在线观看一区二区| 欧美日韩在线播放| 欧美午夜电影在线播放| 久久久久亚洲蜜桃| 婷婷国产在线综合| 91丨porny丨首页| 26uuu精品一区二区在线观看| 亚洲成年人网站在线观看| 成人免费视频caoporn| 欧美电影精品一区二区| 久久精品人人爽人人爽| 奇米色一区二区| 在线视频亚洲一区| 亚洲三级在线免费| 丁香另类激情小说| 久久先锋资源网| 日本va欧美va瓶| 欧美日韩午夜在线视频| 成人欧美一区二区三区黑人麻豆 | 久久精品在线观看| 日韩在线一区二区三区| 在线观看三级视频欧美| 国产精品不卡视频| 成人免费视频国产在线观看| 国产午夜精品久久| 精品一区二区三区免费| 欧美电视剧在线看免费| 奇米一区二区三区av| 欧美一级生活片| 爽好久久久欧美精品| 欧美日韩一卡二卡三卡| 亚洲午夜日本在线观看| 欧美午夜精品一区| 亚洲成人福利片| 欧美伊人久久大香线蕉综合69| 又紧又大又爽精品一区二区| 91色乱码一区二区三区| 亚洲美女免费在线| 在线日韩av片| 午夜视频一区在线观看| 4438成人网| 看国产成人h片视频| 精品国产乱码久久久久久影片| 精品一区二区三区香蕉蜜桃| 久久一区二区三区国产精品| 国产精品一区二区三区网站| 国产人妖乱国产精品人妖| 成人午夜av电影| 亚洲欧美日韩小说| 欧美日韩一区在线观看| 视频一区二区三区入口| 欧美mv日韩mv国产| 国产乱人伦偷精品视频不卡 | 91欧美一区二区| 亚洲一区二区三区四区五区中文| 欧美日韩你懂得| 蜜桃一区二区三区在线| 久久蜜桃av一区精品变态类天堂| 国产91清纯白嫩初高中在线观看| 国产精品毛片a∨一区二区三区| 91免费版在线看| 亚洲成人精品一区| 久久婷婷色综合| 91视频xxxx| 蜜桃av噜噜一区| 国产精品三级视频| 欧美日韩在线综合|