Visual-C++面向對象與可視化程序設計-windows-API-text-font_第1頁
Visual-C++面向對象與可視化程序設計-windows-API-text-font_第2頁
Visual-C++面向對象與可視化程序設計-windows-API-text-font_第3頁
Visual-C++面向對象與可視化程序設計-windows-API-text-font_第4頁
Visual-C++面向對象與可視化程序設計-windows-API-text-font_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

VisualC++面向對象與可視化程序設計--------WINDOWSAPI編程之textandfont第4講文本與字體使用定義好的與設備無關的字體集,

Windows就能維護它的設備無關性,提供“所見即所得”的好處,即屏幕所見與設備輸出的文本是一樣的

Windows經(jīng)常使用GDI進行文本輸出。在一定意義上,任何內(nèi)容都可以看成圖形實體圖形和文本并沒有明顯的界限文本操作先要獲得文本句柄設置字體、字符大小、字符顏色等有關屬性將這些屬性選入設備環(huán)境5.1設置文本的設備環(huán)境字體邏輯字體定義的字符集是設備無關的,它可以精確標度,因此得到廣泛應用描述所要顯示的文本的大小、類型和外形物理字體是為特殊設備設計的,因而是設備相關的Win系統(tǒng)提供了七種基本字體字體 說明 ANSI_FIXED ANSI標準的固定寬度的字體ANSI_VAR ANSI標準的可變寬度的字體

DEFAULT_GUI

當前GUI的缺省字體

OEM_FIXED

由標準原設備制造商(OEM)提供 DEVICE_DEFAULT 當前圖形設備的字體 SYSTEM_FIXED Windows的標準固定寬度的字體SYSTEM Windows提供的可變寬度的字體

常作為缺省字體

Win用它作為系統(tǒng)界面字體在內(nèi)定的DC中選擇的字體稱為系統(tǒng)字體,能夠由GetStockObject的SYSTEM_FONT參數(shù)識別。這是固定的ANSI字符集字體。在GetStockObject中指定SYSTEM_FIXED_FONT,可以獲得等寬字體的句柄。在希望所有的字體都具有相同寬度時,這是很方便的。備用字體OEM_FIXED_FONT也稱為終端機字體,是Windows在MS-DOS命令提示窗口中使用的字體,它包括與原始IBM-PC擴展字符集兼容的字符集。Windows在窗口標題列、菜單和對話框的文字中使用DEFULT_GUI_FONT。當將新字體選入DC時,必須使用GetTextMetrics計算字符的高度和平均寬度。如果選擇了固定字體,那么一定要注意,字符的平均寬度只是個平均值,某些字符會比它寬或比它窄。

字體型態(tài)Windows支持兩大類字體,即所謂的「GDI字體」和「設備字體」。GDI字體儲存在硬盤的文件中,而設備字體是輸出設備本來就有的。GDI字體有三種樣式:點陣字體,筆劃字體和TrueType字體。點陣字體的每個字符都以位圖像素圖案的形式儲存,每種點陣字體都有特定的縱橫比和字符大小。Windows通過簡單地復制圖素的行或列就可以由GDI點陣字體產(chǎn)生更大的字符。點陣字體的主要優(yōu)點是顯示性能(顯示速度很快)和可讀性(因為是手工設計的,所以盡可能清晰)。筆劃字體是以「連結點」的方式定義的一系列線段,筆劃字體可以連續(xù)地縮放,這意味著同樣的字體可以用于具有任何分辨率的圖形輸出設備,并且字體可以放大或縮小到任意尺寸。不過,它的性能不好,小字體的可讀性也很糟,而大字體由于筆劃是單根直線而顯得很單薄。筆劃字體有時也稱為繪圖機字體,因為它們特別適合于繪圖機,但是不適合于別的場合。TrueType字體的單個字符是通過填充的直線和曲線的輪廓來定義的。Windows可以通過改變定義輪廓的坐標對TrueType字體進行縮放。當程序開始使用特定大小的TrueType字體時,Windows「點陣化」字體。這就是說Windows使用TrueType字體文件中包括的「提示」對每個字符的連結直線和曲線的坐標進行縮放。這些提示可以補償誤差,避免合成的字符變得很難看。然后,每個字符的合成輪廓用于建立字符的位圖,這些位圖儲存在內(nèi)存以備將來使用。(1)定義字體句柄變量:

HFONThF;//hF為字體的句柄(2)調函數(shù)GetStockObject獲得系統(tǒng)字體句柄它返回的是系統(tǒng)的缺省字體

hF=GetStockObject():(3)調用函數(shù)SelectObject將字體選入設備環(huán)境

SelectObject(hdc,hF);選擇系統(tǒng)字體的步驟邏輯字體邏輯字體是一個GDI對象,它的句柄儲存在HFONT型態(tài)的變量中,邏輯字體是字體的描述。和邏輯畫筆及邏輯畫刷一樣,它是抽象的對象,只有當應用程序調用SelectObject將它選入DC時,它才成為真實的對象。邏輯字體的建立和選擇:可以透過調用CreateFont或CreateFontIndirect來建立邏輯字體。CreateFontIndirect函數(shù)接受一個指向LOGFONT結構的指針,該結構有14個字段。CreateFont函數(shù)接受14個參數(shù),它們與LOGFONT結構的14個字段形式相同。它們是僅有的兩個建立邏輯字體的函數(shù)。因為很難記住14個字段,所以很少使用CreateFont。5.1.2創(chuàng)建自定義字體若需要定義系統(tǒng)以外的字體,可以調用函數(shù)GreateFont自行創(chuàng)建HFont=CreateFont(intifHeight, //字體高度,0采用系統(tǒng)缺省值,使用邏輯單位

intifWidth, //字體寬度,取0則由系統(tǒng)根據(jù)高寬比取最佳值

intifEscapement, //每行文字相對于頁底的角度,單位為0.1度

intifOrienation, //每個文字相對于頁底的角度,單位為0.1度

DWORDifWeight, //字體粗細度,范圍為0~1000DWORDifltalic, //如果要求字體傾斜,則取非零

DWORDifUnderline, //如果要求下劃線,則取非零

DWORDifStrikeout, //如果要求中劃線,則取非零

DWORDifCharset, //字體所屬字符集

DWORDifOutputPrecision,//輸出精度,一般取缺省值OUT_DEFAULT_PRECISDWORDifClipPrecision,//剪裁精度,常取缺省值CLIP_DEFAULT_PRECISDWORDifQuality, //輸出質量,一般取缺省值DEFAULT_QUALITYDWORDifPitchAndFamily,//字體間距及系列缺省值DEFAULT_PITCH

DWORDifFaceName//字體名)可選的系統(tǒng)字符集:ANSI_CHARSETOEM_CHARSETSYMBOL_CHARSETDEFAULT_CHARSETSHIFTJIS_CHARSETifHeight,如果為正,就是設置單元高度;如果為負,就是設置字符高度。ifEScapement使字符串能夠以一定的角度書寫(但每個字符的基準線仍與水平軸平行),而ifOrientation使單個字符傾斜。要注意單位是十分之一度,逆時針方向旋轉。它很容易輸入一個值使范例字符串消失!因此,請使用0到-600或3000到3600之間的值。

lfWeight這個字段能夠指定粗體。WINGDI.H表頭文件定義了可用于這個字段的一組值.可以對標準字使用0或400,對粗體使用700。注意lfCharSet字段是唯一不用零表示默認值的字段。零值相當于ANSI_CHARSET,ANSI字符在美國和西歐使用。DEFAULT_CHARSET代碼等于1,表示程序執(zhí)行的機器上內(nèi)定的字符集。ifFaceName這是關于字樣的實際文字名稱。這個字段是寬度為LF_FACESIZE(或32個字符)的字節(jié)數(shù)組。如果要得到TrueType的斜體或粗體字體,有兩種方法。在lfFaceName字段中使用完整的字體名稱(如TimesNewRomanItalic),或者可以使用基本名稱(即TimesNewRoman),并設定lfItalic字段。例:lf.lfFaceName=“黑體”邏輯字體結構可以調用CreateFont來建立邏輯字體,它是具有14個參數(shù)的函數(shù)。一般,定義一個LOGFONT型態(tài)的結構LOGFONTlf;然后再定義該結構的字段會更容易一些。完成后,可以使用指向該結構的指針調用CreateFontIndirect: hFont=CreatFontIndirect(&lf);不必設定LOGFONT結構的每個字段。如果邏輯字體結構定義為靜態(tài)變量,那么所有的字段都會初始化為0,0一般是默認值。然后,可以不用更改而直接使用這個結構,CreateFontIndirect會傳回字體的句柄。LOGFONTlf;lf.lfHeight=-(int)(fabs(pt.y)/10.0+0.5);lf.lfWidth=0;lf.lfEscapement=0;lf.lfOrientation=0;lf.lfWeight=iAttributes&EZ_ATTR_BOLD?700:0;lf.lfItalic=iAttributes&EZ_ATTR_ITALIC?1:0;lf.lfUnderline=iAttributes&EZ_ATTR_UNDERLINE?1:0;lf.lfStrikeOut=iAttributes&EZ_ATTR_STRIKEOUT?1:0;lf.lfCharSet=DEFAULT_CHARSET;lf.lfOutPrecision=0;lf.lfClipPrecision=0;lf.lfQuality=0;lf.lfPitchAndFamily=0;lstrcpy(lf.lfFaceName,szFaceName);hFont=CreateFontIndirect(&lf);建立、選擇和刪除邏輯字體1.通過調用CreateFont或CreateFontIndirect建立邏輯字體,這些函數(shù)傳回HFONT型態(tài)的邏輯字體句柄。2.使用SelectObject將邏輯字體選入設備內(nèi)容,Windows會選擇與邏輯字體最匹配的真實字體。3.使用GetTextMetrics(及可能用到的其它函數(shù))確定真實字體的大小和特征。在該字體選入設備內(nèi)容后,可以使用這些信息來適當?shù)卦O定文字的間距。4.在使用完邏輯字體后,調用DeleteObject刪除邏輯字體,當字體選入有效的設備內(nèi)容時,不要刪除字體,也不要刪除備用字體。5.1.3設置字體和背景顏色設置字體顏色:SetTextColor(hdc,crColor);設置背景顏色:SetBkColor(hdc,crColor);crColor為設置的顏色字體及背景顏色的設置在開發(fā)過程中非常重要設置背景模式

:SetBkMode(hdc,iMode);SetBkMode(hdc,iMode);更改背景模式,其中iMode的值為OPAQUE或TRANSPARENT。內(nèi)定的背景模式為OPAQUE,它表示W(wǎng)indows使用背景顏色來填充矩形的背景。SetBkColor(hdc,rgbColor);來改變背景顏色。rgbColor的值是轉換為純色的值。內(nèi)定背景色是白色。如果兩行文字靠得太近,其中一個的背景矩形就會遮蓋另一個的文字。由于這種原因,通常希望內(nèi)定的背景模式是TRANSPARENT。在背景模式為TRANSPARENT的情況下,Windows會忽略背景色,也不對矩形背景區(qū)域著色。Windows也使用背景模式和背景色對點和虛線之間的空隙及陰影刷中陰影間的區(qū)域著色。

5.2文本的輸出過程確定后續(xù)文本坐標確定換行時文本坐標文本輸出過程獲取字體信息格式化文本調用函數(shù)輸出文本獲取字體信息輸出文本之前要獲取字體的信息,如字符高度等,以確定輸出格式和下一行字符的位置

GetTextMetrics(hdc,&tm);//tm為TEXTMETRICS結構獲取當前使用字體信息調用該函數(shù)時,系統(tǒng)將當前字體的信息拷貝到tm標識的TEXTMETRICS結構中系統(tǒng)定義的TEXTMETRICS的結構如下:typedefstructtagTEXTMETRIC{

//tmLONGtmHeight;

//字符高度LONGtmAscent;

//字符基線以上高度LONGtmDescent; //字符基線以下高度LONGtmInternalLeading; //tmHeight制訂的字符高度頂部的控件LONGtmExternalLeading; //行與行之間的間隔LONGtmAveCharWidth; //平均字符寬度LONGtmMaxCharWidth; //最大字符寬度LONGtmWeight; //字符的粗細度LONGtmOverhang; //合成字體間附加的寬度LONGtmDigitizedAspectX; //為輸出設備設計的X軸尺寸LONGtmDigitizedAspectY; //為輸出設備設計的Y軸尺寸BCHARtmFirstChar; //字體中第一個字符值BCHARtmLastChar; //字體中最后一個字符值BCHARtmDefaultChar; //代替不在字體中字符的字符BCHARtmBreakChar; //作為分割符的字符BYTEtmItalic; //非0則表示字體為斜體BYTEtmUnderlined; //非0則表示字體有下劃線BYTEtmStruckOut; //非0則表示字符為刪除字體BYTEtmPitchAndFamily; //字體間距和字體族BYTEtmCharSet; //字符集}TEXTMETRICReturn字體選入DC后從GetTextMetrics函數(shù)中獲得的信息。除了數(shù)值化的縱橫比以外,Windows復制到TEXTMETRIC結構的所有大小值都以邏輯單位表示。tmInternalLeading

用于顯示重音符號;基線上的高度為tmAscent;基線下的高度為tmDescent;tmHeight=tmAscent+tmDescent被稱為單元高度(cellheight);tmHeight-tmInternalLeading被稱為字符高度(characterheight)CreateFont的第1個參數(shù)ifHeight,如果為正,就是設置單元高度;如果為負,就是設置字符高度。tmWeight范圍從0到999。實際上,這個字段為400時是標準字體,700時是粗體。tmOverhang:Windows在合成斜體或粗體時添加到點陣字體字符的額外寬度量(邏輯單位)tmBreakChar:在調整文字時,Windows和程序用于確定單字斷開的字符。如果不用一些奇怪的東西(例如EBCDIC字體),它就是32-空格符tmPitchAndFamily:低四位是表示字體某些特征的旗標,例如是否定寬、是否矢量字體、是否設備字體等。由在WINGDI.H中定義的標識符指出格式化文本(1)確定后續(xù)文本坐標換行時確定下一行文本的坐標需要格式化處理的情況在文本行中確定后續(xù)文本的坐標確定后續(xù)文本的坐標,應先獲取當前的字符串的寬度,

該工作由GetTextExtentPoint32函數(shù)完成,并把它存儲于一個SIZE結構中。BooLGetTextExtentPoint32(

HDChdc,

LPCTSTRlpszString,//指定的字符串

intnLength, //字符串中的字符數(shù)

LPSIZElpSize

//返回字符串寬度及高度的SIZE數(shù)據(jù)結構的地址)SIZE數(shù)據(jù)結構的定義typedefstructtagSIZE{LONGcx;

LONGcy;

}SIZE;例如,X軸起始坐標為cx0,后續(xù)文本起始坐標cx1為:

cx1=cx0+size.cx;Return(2)確定換行時文本坐標字符的高度與行間隔均存儲在tm指向的TEXTMETRICS結構中,換行時Y軸上文本的起始坐標cy為:

cy=tm.tmHeight+tm.tmExternalLeading;Return通過計算當前行文本字符的高度與行間隔之和,即可得到換行時文本的起始坐標文本輸出

常用的文本輸出函數(shù)TextOut原型如下:BOOLTextOut(

HDChdc,

intX,intY, //X,Y為用戶區(qū)中字符串的起始坐標

LPCTSTRlpstring,//lpstring為顯示的字符串

intnCount //nCount為字符串中的字節(jié)數(shù)

);TextOut

以坐標X,Y為起點,輸出字節(jié)數(shù)為nCount、名為lpstring中的字符串例如:把一種字體選入DC,現(xiàn)在要寫入文字:TCHAR*szText[]=TEXT("Hello,howareyou?");希望文字從垂直坐標yStart開始,頁邊距由坐標xLeft和xRight設定。任務是計算文字開始處的水平坐標的xStart值。如果文字以定寬字體顯示,那么這項任務就相當容易,但通常不是這樣的。首先得到字符要串的文字寬度:GetTextExtentPoint32(hdc,szText,lstrlen(szText),&size);如果size.cx比(xRight-xLeft)大,這一行就太長了,不能放在頁邊距內(nèi)。假定它能放進去。要向左對齊文字,只要把xStart設定為與xLeft相等,然后寫入文字:TextOut(hdc,xStart,yStart,szText,lstrlen(szText));現(xiàn)在可以把size.cy加到y(tǒng)Start中寫下一行文字了。要向右對齊文字,用以下公式計算xStart:xStart=xRight-size.cx;

居中文字用以下公式:xStart=(xLeft+xRight-size.cx)/2;在左右頁邊距內(nèi)分散對齊文字。頁邊距之間的距離是(xRight-xLeft)。如不調整,文字寬度就是size.cx。兩者之差xRight-xLeft-size.cx,必須在字符串的三個空格字符處平均配置??梢哉{用SetTextJustification(hdc,xRight-xLeft-size.cx,3)第二個參數(shù)是字符串內(nèi)空格字符中需要分配的空間量。第三個參數(shù)是空格字符的數(shù)量,這里為3?,F(xiàn)在把xStart設定與xLeft相等,用TextOut寫入文字:TextOut(hdc,xStart,yStart,szText,lstrlen(szText));文字會在xLeft和xRight頁邊距之間分散對齊。無論何時調用SetTextJustification,如果空間量不能在空格字符中平均分配,它就會累積一個錯誤值。這將影響后面的GetTextExtentPoint32調用。每次開始新的一行,都必須通過調用SetTextJustification(hdc,0,0);來清除錯誤值。SetTextAlign函數(shù)用于對指定DC設置文本排列方式,其原型如下:UINTSetTextAlign(HDChdc,UINTfMode);TA_LEFT、TA_RIGHT和TA_CENTER旗標影響使用xStart在水平方向上定位字符串的方式。默認值是TA_LEFT。如果在SetTextAlign函數(shù)中指定了TA_RIGHT,則后面的TextOut調用會將字符串的最后一個字符定位于xStart,如果指定了TA_CENTER,則字符串的中心位于xStart。類似地,TA_TOP、TA_BOTTOM和TA_BASELINE旗標影響字符串的垂直位置。TA_TOP是默認值,它意味著字符串的字母頂端位于yStart,使用TA_BOTTOM意味著字符串位于yStart之上??梢允褂肨A_BASELINE定位字符串,使基準線位于yStart。基準線是如小寫字母p、q、y等字母下部的線。DrawText,不指定坐標的起始位置,而是通過RECT結構型態(tài)定義希望顯示文字的區(qū)域,其原型如下:

intDrawText(HDChDC,LPCTSTRlpString,intnCount,LPRECTlpRect,UINTuFormat);

DrawText需要指向字符串的指針和字符串的長度。在DrawText中使用以NULL結尾的字符串,可以將iCount設定為-1,Windows會自動計算字符串的長度。當uFormat設定為0時,Windows會將文字解釋為一系列由carriagereturn字符(‘\r’或0x0D)或linefeed字符(‘\n’或0x0A)分隔的行。文字從矩形的左上角開始,carriagereturn字符或linefeed字符被解釋為換行字符,因此Windows會結束目前行而開始新的一行。新的一行從矩形的左側開始,在上一行的下面空開一個字符的高度(沒有外部間隔)??梢允褂胾Format參數(shù)更改DrawText的缺省操作,uFormat由一個或多個旗標組成。DT_LEFT(默認值)指定了左對齊的行,DT_RIGHT指定了向右對齊的行,而DT_CENTER指定了位于矩形左邊和右邊中間的行。因為DT_LEFT的值是0,所以如果只需要左對齊,就不需要包含標識符。在顯示多行文字時,Windows通常只在carriagereturn字符或linefeed字符處換行。然而,如果行的長度超出了矩形的寬度,則可以使用DT_WORDBREAK旗標,它使Windows在行內(nèi)字的末尾換行。對于單行或多行文字的顯示,Windows會把超出矩形的文字部分截去。段落具有選擇并建立邏輯字體的能力后,就可以處理文字格式了。這個程序包括以四種方式之一來把文字的每一行放在頁邊距內(nèi):左對齊、向右對齊、居中或分散對齊-即從頁邊距的一端到另一端,文字間距相等。如果處理整個段落,就必須從頭開始并掃描字符串來尋找空格字符。每當碰到一個空格(或其它能用于斷開一行的字符),需調用GetTextExtentPoint32來確定文字是否能放入左右頁邊距之間。當文字超出允許的空間時,就要退回上一個空白?,F(xiàn)在,已經(jīng)能夠確定一行的字符串了。如果想要分散對齊該行,調用SetTextJustification和TextOut,清除錯誤值,并繼續(xù)下一行。5.3文本操作實例【例4-1】在用戶窗口上輸出幾行字符串,當窗口接收到WM_PAINT消息后,顯示的文本每次都被重新刷新。#include<windows.h>#include<stdlib.h>#include<string.h>longWINAPIWndProc(

HWNDhWnd,

UINTiMessage,

UINTwParam,

LONGlParam

);BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);HWNDhWndMain;//主函數(shù)intWINAPIWinMain(

HINSTANCEhInstance,

HINSTANCEhPrevInstance,

LPSTRlpCmdLine,

intnCmdShow){

MSGMessage;

if(!InitWindowsClass(hInstance)) returnFALSE;

if(!InitWindows(hInstance,nCmdShow))returnFALSE;

while(GetMessage(&Message,0,0,0))//消息循環(huán)

{

TranslateMessage(&Message);

DispatchMessage(&Message);

}

returnMessage.wParam;}//消息處理函數(shù)longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam){

staticlongnXChar,nCaps,nYChar;

HDChDC;//定義指向設備上下文的句柄

shortx;

TEXTMETRICtm;

shortLnCount=6;

PAINTSTRUCTPtStr;//定義指向包含繪圖信息的結構體變量

staticchar*textbuf[]= {

"ThisistheFirstline",

"Thisisthesecondline",

"Thisisthethirdline",

"Thisisthefourthline",

"Thisisthefifthline",

"Thisisthesixthline"

};輸出的文本內(nèi)容switch(iMessage)//處理消息

{caseWM_CREATE:

//處理窗口創(chuàng)建消息

hDC=GetDC(hWnd);

//獲取當前設備表句柄

GetTextMetrics(hDC,&tm); //獲取字體信息

nXChar=tm.tmAveCharWidth; //獲取字符寬度

nYChar=tm.tmHeight+tm.tmExternalLeading;

nCaps=(tm.tmPitchAndFamily&1?3:2)*nXChar/2;

ReleaseDC(hWnd,hDC); //釋放當前設備句柄

return0;

caseWM_PAINT: //處理重畫消息

hDC=BeginPaint(hWnd,&PtStr); //開始繪畫

for(x=0;x<LnCount;x=x+1) //輸出文本

TextOut(hDC,nXChar,nYChar*(1+x),textbuf[x],lstrlen(textbuf[x]));

EndPaint(hWnd,&PtStr); return0;

caseWM_DESTROY: //結束應用程序

PostQuitMessage(0); return0;default: //其他消息處理程序

return(DefWindowProc(hWnd,iMessage,wParam,lParam));

}}BOOLInitWindowsClass(HINSTANCEhInstance) //初始化窗口類{

WNDCLASSWndClass; …………;

WndClass.style=CS_HREDRAW|CS_VREDRAW;

returnRegisterClass(&WndClass);}BOOLInitWindows(HINSTANCEhInstance,intnCmdShow)//初始化窗口{

HWNDhWnd;

hWnd=CreateWindow("WinText",//生成窗口

"文本顯示示例程序",

WS_OVERLAPPEDWINDOW, …….; NULL);

if(!hWnd) returnFALSE;

hWndMain=hWnd;

ShowWindow(hWnd,nCmdShow); //顯示窗口

UpdateWindow(hWnd);

returnTRUE;}【例4-2】本程序通過在窗口中分五行分別顯示五行文本,以說明在窗口的用戶區(qū)中輸出文本的方法。本例題的源代碼如下:#include<windows.h>#include<string.h>#include<stdlib.h>#include<stdio.h>LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,

HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){

HWNDhwnd;

MSGMsg;

WNDCLASSwndclass;

charlpszClassName[]="文本輸出";

charlpszTitle[]="EXAMPLEFORTHETEXTOUTPUT";

wndclass.style=0;

…………;

wndclass.lpszClassName=lpszClassName;if(!RegisterClass(&wndclass)) {MessageBeep(0);returnFALSE; }hwnd=CreateWindow( lpszClassName,

lpszTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);while(GetMessage(&Msg,NULL,0,0)) {

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}returnMsg.wParam;}LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage, WPARAMwParam,LPARAMlParam){

HDChdc;HFONThF_black,hF_big; //定義兩種字體句柄PAINTSTRUCTps;TEXTMETRICtm; //定義一個TEXTMETRIC結構,用以記錄字體信息charlpsz_1[]=這是一行紅色的、字體為SYSTEM_FONT的文字,紅色代表未來。";charlpsz_2[]=現(xiàn)在顯示的是自定義字體,顏色為綠色,綠色代表生機勃勃。";charlpsz_3[]=現(xiàn)在展現(xiàn)在您面前的是藍色的粗體字,藍色代表廣闊的海洋和天空。";charlpsz_4[]="當前字體為大號、斜體并帶有下劃線的文字。";charlpsz_5[]="現(xiàn)在您掌握了字體的操作了嗎?";charlpsz_6[]="祝您成功!";intX=0,Y=0;SIZEsize; //定義一個SIZE類型的結構switch(message){

caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); SetTextColor(hdc,RGB(255,0,0)); //設置文本顏色為紅色

GetTextMetrics(hdc,&tm);//獲取缺省字體,寫入tm結構中

TextOut(hdc,X,Y,lpsz_1,strlen(lpsz_1));//用當前字體輸出文本

Y=Y+tm.tmHeight+100*tm.tmExternalLeading; //計算換行時下一行文本的輸出坐標

hF_black=CreateFont( //創(chuàng)建自定義字體

20, //字體的高度

0, //由系統(tǒng)根據(jù)高寬比選取字體最佳寬度值

0, //文本的傾斜度為0,表示水平

0, //字體的傾斜度為0

FW_HEAVY, //字體的粗度,F(xiàn)W_HEAVY為最粗

0, //非斜體字

0, //無下劃線

0, //無刪除線

ANSI_CHARSET, //表示所用的字符集為ANSI_CHARSET OUT_DEFAULT_PRECIS, //輸出精度為缺省精度

CLIP_DEFAULT_PRECIS, //剪裁精度為缺省精度

DEFAULT_QUALITY, //輸出質量為缺省值

DEFAULT_PITCH|FF_DONTCARE,//字間距和字體系列使用缺省值

"粗體字"); //字體名稱

SetTextColor(hdc,RGB(0,255,0)); //設置文本顏色為綠色

SelectObject(hdc,hF_black); //將自定義字體選入設備環(huán)境

GetTextMetrics(hdc,&tm);//獲取字體的信息,寫入tm結構中

TextOut(hdc,X,Y,lpsz_2,strlen(lpsz_2));//用當前字體輸出文本

//換行繼續(xù)輸出文本,計算新行的起始Y坐標位置

Y=Y+tm.tmHeight+10*tm.tmExternalLeading; GetTextExtentPoint32(hdc,lpsz_2,strlen(lpsz_2),&size); //獲取字符串/的寬度

SetTextColor(hdc,RGB(0,0,255)); //設置文本顏色為藍色

TextOut(hdc,X,Y,lpsz_3,strlen(lpsz_3));//當前字體輸出文本

X=0; //計算下一行文本的輸出起始坐標

Y=Y+tm.tmHeight+20*tm.tmExternalLeading;hF_big=CreateFont //引入新字體

(30, //字體高度

0, 0, 0,

FW_NORMAL, 1, //定義斜體

1, //定義輸出時帶下劃線

0,

ANSI_CHARSET, //所使用的字符集

OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "大號字"

);

SelectObject(hdc,hF_big);//將自定義字體選入設備環(huán)境

SetTextColor(hdc,RGB(155,155,155)); //設置文本顏色

Y=Y+tm.tmHeight+20*tm.tmExternalLeading;

TextOut(hdc,X,Y,lpsz_4,strlen(lpsz_4));//輸出文本

SetTextColor(hdc,RGB(255,0,0));//設置文本顏色為紅色

X=0; //設定輸出文本的X坐標位置

Y=Y+tm.tmHeight+30*tm.tmExternalLeading;

TextOut(hdc,X,Y,lpsz_5,strlen(lpsz_5)); //輸出文本

//在該行繼續(xù)輸出文本

GetTextExtentPoint32(hdc,lpsz_5,strlen(lpsz_5),&size); //獲取字符串的寬度

X=X+size.cx; //獲取起始坐標

TextOut(hdc,X,Y,lpsz_6,strlen(lpsz_6)); //輸出文本

EndPaint(hwnd,&ps); break;caseWM_DESTROY: DeleteObject(hF_black); //退出窗口時刪除自定義字體

DeleteObject(hF_big); PostQuitMessage(0); break;

default: returnDefWindowProc(hwnd,message,wParam,lParam);

}

return0;}【4-3】在窗口中顯示出26個英文字母,從左向右字母依次位置提高10個象素單位,并且顏色變?yōu)榧t色,然后回到正常位置;當?shù)竭_最右端后改變方向從右向左依次變成紅色并位置提高10個象素單位。在窗口的第二行顯示26個字母,字體從正常到斜體,顏色從黑色到天藍色不斷變換。如圖所示。用nChar標志紅色跳起字母在26個字母的位置用bRight,bLeft標志當前移動方向,初始化bRight=TRUE,bLeft=FALSE本例題要解決動態(tài)顯示問題:首先處理第一行字符:在WM_PAINT消息處理程序中,在得到了設備環(huán)境句柄hDC后,調用用戶自定義的函數(shù)CreateFont(hDC,nHeight,bItalic),第一個參數(shù)hDC是設備環(huán)境句柄,第2個參數(shù)nHeight是字體高度,第3個參數(shù)bItalic是斜字體的標志變量WM_CREATE消息處理程序定時器調用SetTimer(…)創(chuàng)建WM_TIMER消息處理程序調用InvalidateRect(…)刷新用戶區(qū)發(fā)送WM_PAINT消息實現(xiàn)動態(tài)顯示下面這段程序按照黑色的字體輸出從字符串開頭到當前位置的字符串:

Y=tm.tmExternalLeading+10; //設置輸出字符的Y坐標

for(i=0;i<nChar;i++){SetTextColor(hDC,RGB(0,0,0)); //設置字體的顏色為黑色

X=X+tm.tmAveCharWidth*2; //設置輸出字符的X坐標

TextOut(hDC,X,Y,&lpsz_1[i],1);//輸出從第0個到第nChar-1個字符

}下面輸出當前位置上的字符,當前位置的字符位置提高10個象素單位,字體顏色為紅色:

SetTextColor(hDC,RGB(255,0,0));//設置字體的顏色為紅色

X=X+tm.tmAveCharWidth*2; //設置輸出字符的X,Y坐標

Y=tm.tmExternalLeading; //提高10個像素

hF=CreateFont(hDC,40,0); //創(chuàng)建字體

SelectObject(hDC,hF); //選入字體

TextOut(hDC,X,Y,&lpsz_1[nChar],1);//輸出第nChar個字符

Y=tm.tmExternalLeading+10; for(i=nChar+1;i<nCharlen;i++) {SetTextColor(hDC,RGB(0,0,0));//設置字體的顏色為黑色

X=X+tm.tmAveCharWidth*2;//設置輸出字符的X坐標

TextOut(hDC,X,Y,&lpsz_1[i],1); //輸出后面的字符

}下面設置bRight和bLeft的值。

if(nChar==nCharlen) //當輸出到最后的一個字符時

{

bRight=FALSE; //改變紅色字移動的方向為向左

bLeft=TRUE; } else(nChar==0) //當輸出到第一個字時

{

bRight=TRUE; //改變紅色字移動的方向為向右

bLeft=FALSE; } if(bRight==TRUE)nChar++; elsenChar--;如果nChar==等于字符串長度=〉已到了字符串末尾,將bRight置為True字符長度==0時,已到了最左端,將bLeft置為True;當bRight=True時字符位置標志nChar加1,當bLeft=True時,字符位置標志變量減1。下面輸出第2行字符:在WM_PAINT處理程序中,加入下列代碼:

hF=CreateFont(hDC,40,bItalic); //創(chuàng)建字體.大小為40

SelectObject(hDC,hF); //選入字體

X=tm.tmAveCharWidth*2; //設置輸出位置

Y=tm.tmHeight*2; if(bItalic==TRUE)

SetTextColor(hDC,RGB(0,0,0)); else SetTextColor(hDC,RGB(0,255,255)); TextOut(hDC,X,Y,lpsz_1,strlen(lpsz_1)); //輸出

if(bItalic==TRUE)

bItalic=FALSE; else bItalic=TRUE;調用用戶自定義函數(shù)CreateFont(…)創(chuàng)建斜體字,確定輸出位置根據(jù)bItalic的狀態(tài)設置字體的顏色。當bItalic為真時,輸出斜體天藍色字符;為假時,輸出正常黑色字體最后對bItalic取反,在下一次顯示與此次不同的另一種效果?!纠?-4】將一首四句的古詩從右到左豎排輸出。要求窗口每次接收到WM_PAINT消息時都刷新顯示的文本。

#include<windows.h>#include<stdlib.h>#include<string.h>longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);HWNDhWndMain;

//主函數(shù)intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance, LPSTRlpCmdLine,intnCmdShow){ MSGMessage; if(!InitWindowsClass(hInstance))

returnFALSE; if(!InitWindows(hInstance,nCmdShow)) returnFALSE; while(GetMessage(&Message,0,0,0)) //消息循環(huán)

{TranslateMessage(&Message);

DispatchMessage(&Message); } returnMessage.wParam;}longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)1.{staticlongnXChar,nCaps,nYChar;2.

intpointx,pointy,inti,j;3.HDChDC;

//定義指向設備環(huán)境的句柄 4.TEXTMETRICtm;

//存放字體各種屬性的結構體變量5.PAINTSTRUCTPtStr;

//指向包含繪圖信息的結構體變量6.staticchar*textbuf[4]={{"故人西辭黃鶴樓"},{"煙花三月下?lián)P州"}, {"孤帆遠影碧空盡"},{"唯見長江天際流"}};7.switch(iMessage)

//處理消息8.{ caseWM_CREATE:

//處理窗口創(chuàng)建消息9.

hDC=GetDC(hWnd);

//獲取當前設備表句柄10.

GetTextMetrics(hDC,&tm);

//獲取字體信息11.

nXChar=tm.tmAveCharWidth;

//獲取字符寬度12.

nYChar=tm.tmHeight+tm.tmExternalLeading; //字符

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論