![Visual-C++面向?qū)ο笈c可視化程序設(shè)計(jì)-windows-API-text-font_第1頁](http://file4.renrendoc.com/view/08493c45bfcecd6e0128872f3a8040ec/08493c45bfcecd6e0128872f3a8040ec1.gif)
![Visual-C++面向?qū)ο笈c可視化程序設(shè)計(jì)-windows-API-text-font_第2頁](http://file4.renrendoc.com/view/08493c45bfcecd6e0128872f3a8040ec/08493c45bfcecd6e0128872f3a8040ec2.gif)
![Visual-C++面向?qū)ο笈c可視化程序設(shè)計(jì)-windows-API-text-font_第3頁](http://file4.renrendoc.com/view/08493c45bfcecd6e0128872f3a8040ec/08493c45bfcecd6e0128872f3a8040ec3.gif)
![Visual-C++面向?qū)ο笈c可視化程序設(shè)計(jì)-windows-API-text-font_第4頁](http://file4.renrendoc.com/view/08493c45bfcecd6e0128872f3a8040ec/08493c45bfcecd6e0128872f3a8040ec4.gif)
![Visual-C++面向?qū)ο笈c可視化程序設(shè)計(jì)-windows-API-text-font_第5頁](http://file4.renrendoc.com/view/08493c45bfcecd6e0128872f3a8040ec/08493c45bfcecd6e0128872f3a8040ec5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
VisualC++面向?qū)ο笈c可視化程序設(shè)計(jì)--------WINDOWSAPI編程之textandfont第4講文本與字體使用定義好的與設(shè)備無關(guān)的字體集,
Windows就能維護(hù)它的設(shè)備無關(guān)性,提供“所見即所得”的好處,即屏幕所見與設(shè)備輸出的文本是一樣的
Windows經(jīng)常使用GDI進(jìn)行文本輸出。在一定意義上,任何內(nèi)容都可以看成圖形實(shí)體圖形和文本并沒有明顯的界限文本操作先要獲得文本句柄設(shè)置字體、字符大小、字符顏色等有關(guān)屬性將這些屬性選入設(shè)備環(huán)境5.1設(shè)置文本的設(shè)備環(huán)境字體邏輯字體定義的字符集是設(shè)備無關(guān)的,它可以精確標(biāo)度,因此得到廣泛應(yīng)用描述所要顯示的文本的大小、類型和外形物理字體是為特殊設(shè)備設(shè)計(jì)的,因而是設(shè)備相關(guān)的Win系統(tǒng)提供了七種基本字體字體 說明 ANSI_FIXED ANSI標(biāo)準(zhǔn)的固定寬度的字體ANSI_VAR ANSI標(biāo)準(zhǔn)的可變寬度的字體
DEFAULT_GUI
當(dāng)前GUI的缺省字體
OEM_FIXED
由標(biāo)準(zhǔn)原設(shè)備制造商(OEM)提供 DEVICE_DEFAULT 當(dāng)前圖形設(shè)備的字體 SYSTEM_FIXED Windows的標(biāo)準(zhǔn)固定寬度的字體SYSTEM Windows提供的可變寬度的字體
常作為缺省字體
Win用它作為系統(tǒng)界面字體在內(nèi)定的DC中選擇的字體稱為系統(tǒng)字體,能夠由GetStockObject的SYSTEM_FONT參數(shù)識(shí)別。這是固定的ANSI字符集字體。在GetStockObject中指定SYSTEM_FIXED_FONT,可以獲得等寬字體的句柄。在希望所有的字體都具有相同寬度時(shí),這是很方便的。備用字體OEM_FIXED_FONT也稱為終端機(jī)字體,是Windows在MS-DOS命令提示窗口中使用的字體,它包括與原始IBM-PC擴(kuò)展字符集兼容的字符集。Windows在窗口標(biāo)題列、菜單和對(duì)話框的文字中使用DEFULT_GUI_FONT。當(dāng)將新字體選入DC時(shí),必須使用GetTextMetrics計(jì)算字符的高度和平均寬度。如果選擇了固定字體,那么一定要注意,字符的平均寬度只是個(gè)平均值,某些字符會(huì)比它寬或比它窄。
字體型態(tài)Windows支持兩大類字體,即所謂的「GDI字體」和「設(shè)備字體」。GDI字體儲(chǔ)存在硬盤的文件中,而設(shè)備字體是輸出設(shè)備本來就有的。GDI字體有三種樣式:點(diǎn)陣字體,筆劃字體和TrueType字體。點(diǎn)陣字體的每個(gè)字符都以位圖像素圖案的形式儲(chǔ)存,每種點(diǎn)陣字體都有特定的縱橫比和字符大小。Windows通過簡單地復(fù)制圖素的行或列就可以由GDI點(diǎn)陣字體產(chǎn)生更大的字符。點(diǎn)陣字體的主要優(yōu)點(diǎn)是顯示性能(顯示速度很快)和可讀性(因?yàn)槭鞘止ぴO(shè)計(jì)的,所以盡可能清晰)。筆劃字體是以「連結(jié)點(diǎn)」的方式定義的一系列線段,筆劃字體可以連續(xù)地縮放,這意味著同樣的字體可以用于具有任何分辨率的圖形輸出設(shè)備,并且字體可以放大或縮小到任意尺寸。不過,它的性能不好,小字體的可讀性也很糟,而大字體由于筆劃是單根直線而顯得很單薄。筆劃字體有時(shí)也稱為繪圖機(jī)字體,因?yàn)樗鼈兲貏e適合于繪圖機(jī),但是不適合于別的場合。TrueType字體的單個(gè)字符是通過填充的直線和曲線的輪廓來定義的。Windows可以通過改變定義輪廓的坐標(biāo)對(duì)TrueType字體進(jìn)行縮放。當(dāng)程序開始使用特定大小的TrueType字體時(shí),Windows「點(diǎn)陣化」字體。這就是說Windows使用TrueType字體文件中包括的「提示」對(duì)每個(gè)字符的連結(jié)直線和曲線的坐標(biāo)進(jìn)行縮放。這些提示可以補(bǔ)償誤差,避免合成的字符變得很難看。然后,每個(gè)字符的合成輪廓用于建立字符的位圖,這些位圖儲(chǔ)存在內(nèi)存以備將來使用。(1)定義字體句柄變量:
HFONThF;//hF為字體的句柄(2)調(diào)函數(shù)GetStockObject獲得系統(tǒng)字體句柄它返回的是系統(tǒng)的缺省字體
hF=GetStockObject():(3)調(diào)用函數(shù)SelectObject將字體選入設(shè)備環(huán)境
SelectObject(hdc,hF);選擇系統(tǒng)字體的步驟邏輯字體邏輯字體是一個(gè)GDI對(duì)象,它的句柄儲(chǔ)存在HFONT型態(tài)的變量中,邏輯字體是字體的描述。和邏輯畫筆及邏輯畫刷一樣,它是抽象的對(duì)象,只有當(dāng)應(yīng)用程序調(diào)用SelectObject將它選入DC時(shí),它才成為真實(shí)的對(duì)象。邏輯字體的建立和選擇:可以透過調(diào)用CreateFont或CreateFontIndirect來建立邏輯字體。CreateFontIndirect函數(shù)接受一個(gè)指向LOGFONT結(jié)構(gòu)的指針,該結(jié)構(gòu)有14個(gè)字段。CreateFont函數(shù)接受14個(gè)參數(shù),它們與LOGFONT結(jié)構(gòu)的14個(gè)字段形式相同。它們是僅有的兩個(gè)建立邏輯字體的函數(shù)。因?yàn)楹茈y記住14個(gè)字段,所以很少使用CreateFont。5.1.2創(chuàng)建自定義字體若需要定義系統(tǒng)以外的字體,可以調(diào)用函數(shù)GreateFont自行創(chuàng)建HFont=CreateFont(intifHeight, //字體高度,0采用系統(tǒng)缺省值,使用邏輯單位
intifWidth, //字體寬度,取0則由系統(tǒng)根據(jù)高寬比取最佳值
intifEscapement, //每行文字相對(duì)于頁底的角度,單位為0.1度
intifOrienation, //每個(gè)文字相對(duì)于頁底的角度,單位為0.1度
DWORDifWeight, //字體粗細(xì)度,范圍為0~1000DWORDifltalic, //如果要求字體傾斜,則取非零
DWORDifUnderline, //如果要求下劃線,則取非零
DWORDifStrikeout, //如果要求中劃線,則取非零
DWORDifCharset, //字體所屬字符集
DWORDifOutputPrecision,//輸出精度,一般取缺省值OUT_DEFAULT_PRECISDWORDifClipPrecision,//剪裁精度,常取缺省值CLIP_DEFAULT_PRECISDWORDifQuality, //輸出質(zhì)量,一般取缺省值DEFAULT_QUALITYDWORDifPitchAndFamily,//字體間距及系列缺省值DEFAULT_PITCH
DWORDifFaceName//字體名)可選的系統(tǒng)字符集:ANSI_CHARSETOEM_CHARSETSYMBOL_CHARSETDEFAULT_CHARSETSHIFTJIS_CHARSETifHeight,如果為正,就是設(shè)置單元高度;如果為負(fù),就是設(shè)置字符高度。ifEScapement使字符串能夠以一定的角度書寫(但每個(gè)字符的基準(zhǔn)線仍與水平軸平行),而ifOrientation使單個(gè)字符傾斜。要注意單位是十分之一度,逆時(shí)針方向旋轉(zhuǎn)。它很容易輸入一個(gè)值使范例字符串消失!因此,請(qǐng)使用0到-600或3000到3600之間的值。
lfWeight這個(gè)字段能夠指定粗體。WINGDI.H表頭文件定義了可用于這個(gè)字段的一組值.可以對(duì)標(biāo)準(zhǔn)字使用0或400,對(duì)粗體使用700。注意lfCharSet字段是唯一不用零表示默認(rèn)值的字段。零值相當(dāng)于ANSI_CHARSET,ANSI字符在美國和西歐使用。DEFAULT_CHARSET代碼等于1,表示程序執(zhí)行的機(jī)器上內(nèi)定的字符集。ifFaceName這是關(guān)于字樣的實(shí)際文字名稱。這個(gè)字段是寬度為LF_FACESIZE(或32個(gè)字符)的字節(jié)數(shù)組。如果要得到TrueType的斜體或粗體字體,有兩種方法。在lfFaceName字段中使用完整的字體名稱(如TimesNewRomanItalic),或者可以使用基本名稱(即TimesNewRoman),并設(shè)定lfItalic字段。例:lf.lfFaceName=“黑體”邏輯字體結(jié)構(gòu)可以調(diào)用CreateFont來建立邏輯字體,它是具有14個(gè)參數(shù)的函數(shù)。一般,定義一個(gè)LOGFONT型態(tài)的結(jié)構(gòu)LOGFONTlf;然后再定義該結(jié)構(gòu)的字段會(huì)更容易一些。完成后,可以使用指向該結(jié)構(gòu)的指針調(diào)用CreateFontIndirect: hFont=CreatFontIndirect(&lf);不必設(shè)定LOGFONT結(jié)構(gòu)的每個(gè)字段。如果邏輯字體結(jié)構(gòu)定義為靜態(tài)變量,那么所有的字段都會(huì)初始化為0,0一般是默認(rèn)值。然后,可以不用更改而直接使用這個(gè)結(jié)構(gòu),CreateFontIndirect會(huì)傳回字體的句柄。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.通過調(diào)用CreateFont或CreateFontIndirect建立邏輯字體,這些函數(shù)傳回HFONT型態(tài)的邏輯字體句柄。2.使用SelectObject將邏輯字體選入設(shè)備內(nèi)容,Windows會(huì)選擇與邏輯字體最匹配的真實(shí)字體。3.使用GetTextMetrics(及可能用到的其它函數(shù))確定真實(shí)字體的大小和特征。在該字體選入設(shè)備內(nèi)容后,可以使用這些信息來適當(dāng)?shù)卦O(shè)定文字的間距。4.在使用完邏輯字體后,調(diào)用DeleteObject刪除邏輯字體,當(dāng)字體選入有效的設(shè)備內(nèi)容時(shí),不要?jiǎng)h除字體,也不要?jiǎng)h除備用字體。5.1.3設(shè)置字體和背景顏色設(shè)置字體顏色:SetTextColor(hdc,crColor);設(shè)置背景顏色:SetBkColor(hdc,crColor);crColor為設(shè)置的顏色字體及背景顏色的設(shè)置在開發(fā)過程中非常重要設(shè)置背景模式
:SetBkMode(hdc,iMode);SetBkMode(hdc,iMode);更改背景模式,其中iMode的值為OPAQUE或TRANSPARENT。內(nèi)定的背景模式為OPAQUE,它表示W(wǎng)indows使用背景顏色來填充矩形的背景。SetBkColor(hdc,rgbColor);來改變背景顏色。rgbColor的值是轉(zhuǎn)換為純色的值。內(nèi)定背景色是白色。如果兩行文字靠得太近,其中一個(gè)的背景矩形就會(huì)遮蓋另一個(gè)的文字。由于這種原因,通常希望內(nèi)定的背景模式是TRANSPARENT。在背景模式為TRANSPARENT的情況下,Windows會(huì)忽略背景色,也不對(duì)矩形背景區(qū)域著色。Windows也使用背景模式和背景色對(duì)點(diǎn)和虛線之間的空隙及陰影刷中陰影間的區(qū)域著色。
5.2文本的輸出過程確定后續(xù)文本坐標(biāo)確定換行時(shí)文本坐標(biāo)文本輸出過程獲取字體信息格式化文本調(diào)用函數(shù)輸出文本獲取字體信息輸出文本之前要獲取字體的信息,如字符高度等,以確定輸出格式和下一行字符的位置
GetTextMetrics(hdc,&tm);//tm為TEXTMETRICS結(jié)構(gòu)獲取當(dāng)前使用字體信息調(diào)用該函數(shù)時(shí),系統(tǒng)將當(dāng)前字體的信息拷貝到tm標(biāo)識(shí)的TEXTMETRICS結(jié)構(gòu)中系統(tǒng)定義的TEXTMETRICS的結(jié)構(gòu)如下:typedefstructtagTEXTMETRIC{
//tmLONGtmHeight;
//字符高度LONGtmAscent;
//字符基線以上高度LONGtmDescent; //字符基線以下高度LONGtmInternalLeading; //tmHeight制訂的字符高度頂部的控件LONGtmExternalLeading; //行與行之間的間隔LONGtmAveCharWidth; //平均字符寬度LONGtmMaxCharWidth; //最大字符寬度LONGtmWeight; //字符的粗細(xì)度LONGtmOverhang; //合成字體間附加的寬度LONGtmDigitizedAspectX; //為輸出設(shè)備設(shè)計(jì)的X軸尺寸LONGtmDigitizedAspectY; //為輸出設(shè)備設(shè)計(jì)的Y軸尺寸BCHARtmFirstChar; //字體中第一個(gè)字符值BCHARtmLastChar; //字體中最后一個(gè)字符值BCHARtmDefaultChar; //代替不在字體中字符的字符BCHARtmBreakChar; //作為分割符的字符BYTEtmItalic; //非0則表示字體為斜體BYTEtmUnderlined; //非0則表示字體有下劃線BYTEtmStruckOut; //非0則表示字符為刪除字體BYTEtmPitchAndFamily; //字體間距和字體族BYTEtmCharSet; //字符集}TEXTMETRICReturn字體選入DC后從GetTextMetrics函數(shù)中獲得的信息。除了數(shù)值化的縱橫比以外,Windows復(fù)制到TEXTMETRIC結(jié)構(gòu)的所有大小值都以邏輯單位表示。tmInternalLeading
用于顯示重音符號(hào);基線上的高度為tmAscent;基線下的高度為tmDescent;tmHeight=tmAscent+tmDescent被稱為單元高度(cellheight);tmHeight-tmInternalLeading被稱為字符高度(characterheight)CreateFont的第1個(gè)參數(shù)ifHeight,如果為正,就是設(shè)置單元高度;如果為負(fù),就是設(shè)置字符高度。tmWeight范圍從0到999。實(shí)際上,這個(gè)字段為400時(shí)是標(biāo)準(zhǔn)字體,700時(shí)是粗體。tmOverhang:Windows在合成斜體或粗體時(shí)添加到點(diǎn)陣字體字符的額外寬度量(邏輯單位)tmBreakChar:在調(diào)整文字時(shí),Windows和程序用于確定單字?jǐn)嚅_的字符。如果不用一些奇怪的東西(例如EBCDIC字體),它就是32-空格符tmPitchAndFamily:低四位是表示字體某些特征的旗標(biāo),例如是否定寬、是否矢量字體、是否設(shè)備字體等。由在WINGDI.H中定義的標(biāo)識(shí)符指出格式化文本(1)確定后續(xù)文本坐標(biāo)換行時(shí)確定下一行文本的坐標(biāo)需要格式化處理的情況在文本行中確定后續(xù)文本的坐標(biāo)確定后續(xù)文本的坐標(biāo),應(yīng)先獲取當(dāng)前的字符串的寬度,
該工作由GetTextExtentPoint32函數(shù)完成,并把它存儲(chǔ)于一個(gè)SIZE結(jié)構(gòu)中。BooLGetTextExtentPoint32(
HDChdc,
LPCTSTRlpszString,//指定的字符串
intnLength, //字符串中的字符數(shù)
LPSIZElpSize
//返回字符串寬度及高度的SIZE數(shù)據(jù)結(jié)構(gòu)的地址)SIZE數(shù)據(jù)結(jié)構(gòu)的定義typedefstructtagSIZE{LONGcx;
LONGcy;
}SIZE;例如,X軸起始坐標(biāo)為cx0,后續(xù)文本起始坐標(biāo)cx1為:
cx1=cx0+size.cx;Return(2)確定換行時(shí)文本坐標(biāo)字符的高度與行間隔均存儲(chǔ)在tm指向的TEXTMETRICS結(jié)構(gòu)中,換行時(shí)Y軸上文本的起始坐標(biāo)cy為:
cy=tm.tmHeight+tm.tmExternalLeading;Return通過計(jì)算當(dāng)前行文本字符的高度與行間隔之和,即可得到換行時(shí)文本的起始坐標(biāo)文本輸出
常用的文本輸出函數(shù)TextOut原型如下:BOOLTextOut(
HDChdc,
intX,intY, //X,Y為用戶區(qū)中字符串的起始坐標(biāo)
LPCTSTRlpstring,//lpstring為顯示的字符串
intnCount //nCount為字符串中的字節(jié)數(shù)
);TextOut
以坐標(biāo)X,Y為起點(diǎn),輸出字節(jié)數(shù)為nCount、名為lpstring中的字符串例如:把一種字體選入DC,現(xiàn)在要寫入文字:TCHAR*szText[]=TEXT("Hello,howareyou?");希望文字從垂直坐標(biāo)yStart開始,頁邊距由坐標(biāo)xLeft和xRight設(shè)定。任務(wù)是計(jì)算文字開始處的水平坐標(biāo)的xStart值。如果文字以定寬字體顯示,那么這項(xiàng)任務(wù)就相當(dāng)容易,但通常不是這樣的。首先得到字符要串的文字寬度:GetTextExtentPoint32(hdc,szText,lstrlen(szText),&size);如果size.cx比(xRight-xLeft)大,這一行就太長了,不能放在頁邊距內(nèi)。假定它能放進(jìn)去。要向左對(duì)齊文字,只要把xStart設(shè)定為與xLeft相等,然后寫入文字:TextOut(hdc,xStart,yStart,szText,lstrlen(szText));現(xiàn)在可以把size.cy加到y(tǒng)Start中寫下一行文字了。要向右對(duì)齊文字,用以下公式計(jì)算xStart:xStart=xRight-size.cx;
居中文字用以下公式:xStart=(xLeft+xRight-size.cx)/2;在左右頁邊距內(nèi)分散對(duì)齊文字。頁邊距之間的距離是(xRight-xLeft)。如不調(diào)整,文字寬度就是size.cx。兩者之差xRight-xLeft-size.cx,必須在字符串的三個(gè)空格字符處平均配置??梢哉{(diào)用SetTextJustification(hdc,xRight-xLeft-size.cx,3)第二個(gè)參數(shù)是字符串內(nèi)空格字符中需要分配的空間量。第三個(gè)參數(shù)是空格字符的數(shù)量,這里為3?,F(xiàn)在把xStart設(shè)定與xLeft相等,用TextOut寫入文字:TextOut(hdc,xStart,yStart,szText,lstrlen(szText));文字會(huì)在xLeft和xRight頁邊距之間分散對(duì)齊。無論何時(shí)調(diào)用SetTextJustification,如果空間量不能在空格字符中平均分配,它就會(huì)累積一個(gè)錯(cuò)誤值。這將影響后面的GetTextExtentPoint32調(diào)用。每次開始新的一行,都必須通過調(diào)用SetTextJustification(hdc,0,0);來清除錯(cuò)誤值。SetTextAlign函數(shù)用于對(duì)指定DC設(shè)置文本排列方式,其原型如下:UINTSetTextAlign(HDChdc,UINTfMode);TA_LEFT、TA_RIGHT和TA_CENTER旗標(biāo)影響使用xStart在水平方向上定位字符串的方式。默認(rèn)值是TA_LEFT。如果在SetTextAlign函數(shù)中指定了TA_RIGHT,則后面的TextOut調(diào)用會(huì)將字符串的最后一個(gè)字符定位于xStart,如果指定了TA_CENTER,則字符串的中心位于xStart。類似地,TA_TOP、TA_BOTTOM和TA_BASELINE旗標(biāo)影響字符串的垂直位置。TA_TOP是默認(rèn)值,它意味著字符串的字母頂端位于yStart,使用TA_BOTTOM意味著字符串位于yStart之上??梢允褂肨A_BASELINE定位字符串,使基準(zhǔn)線位于yStart?;鶞?zhǔn)線是如小寫字母p、q、y等字母下部的線。DrawText,不指定坐標(biāo)的起始位置,而是通過RECT結(jié)構(gòu)型態(tài)定義希望顯示文字的區(qū)域,其原型如下:
intDrawText(HDChDC,LPCTSTRlpString,intnCount,LPRECTlpRect,UINTuFormat);
DrawText需要指向字符串的指針和字符串的長度。在DrawText中使用以NULL結(jié)尾的字符串,可以將iCount設(shè)定為-1,Windows會(huì)自動(dòng)計(jì)算字符串的長度。當(dāng)uFormat設(shè)定為0時(shí),Windows會(huì)將文字解釋為一系列由carriagereturn字符(‘\r’或0x0D)或linefeed字符(‘\n’或0x0A)分隔的行。文字從矩形的左上角開始,carriagereturn字符或linefeed字符被解釋為換行字符,因此Windows會(huì)結(jié)束目前行而開始新的一行。新的一行從矩形的左側(cè)開始,在上一行的下面空開一個(gè)字符的高度(沒有外部間隔)??梢允褂胾Format參數(shù)更改DrawText的缺省操作,uFormat由一個(gè)或多個(gè)旗標(biāo)組成。DT_LEFT(默認(rèn)值)指定了左對(duì)齊的行,DT_RIGHT指定了向右對(duì)齊的行,而DT_CENTER指定了位于矩形左邊和右邊中間的行。因?yàn)镈T_LEFT的值是0,所以如果只需要左對(duì)齊,就不需要包含標(biāo)識(shí)符。在顯示多行文字時(shí),Windows通常只在carriagereturn字符或linefeed字符處換行。然而,如果行的長度超出了矩形的寬度,則可以使用DT_WORDBREAK旗標(biāo),它使Windows在行內(nèi)字的末尾換行。對(duì)于單行或多行文字的顯示,Windows會(huì)把超出矩形的文字部分截去。段落具有選擇并建立邏輯字體的能力后,就可以處理文字格式了。這個(gè)程序包括以四種方式之一來把文字的每一行放在頁邊距內(nèi):左對(duì)齊、向右對(duì)齊、居中或分散對(duì)齊-即從頁邊距的一端到另一端,文字間距相等。如果處理整個(gè)段落,就必須從頭開始并掃描字符串來尋找空格字符。每當(dāng)碰到一個(gè)空格(或其它能用于斷開一行的字符),需調(diào)用GetTextExtentPoint32來確定文字是否能放入左右頁邊距之間。當(dāng)文字超出允許的空間時(shí),就要退回上一個(gè)空白?,F(xiàn)在,已經(jīng)能夠確定一行的字符串了。如果想要分散對(duì)齊該行,調(diào)用SetTextJustification和TextOut,清除錯(cuò)誤值,并繼續(xù)下一行。5.3文本操作實(shí)例【例4-1】在用戶窗口上輸出幾行字符串,當(dāng)窗口接收到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;//定義指向設(shè)備上下文的句柄
shortx;
TEXTMETRICtm;
shortLnCount=6;
PAINTSTRUCTPtStr;//定義指向包含繪圖信息的結(jié)構(gòu)體變量
staticchar*textbuf[]= {
"ThisistheFirstline",
"Thisisthesecondline",
"Thisisthethirdline",
"Thisisthefourthline",
"Thisisthefifthline",
"Thisisthesixthline"
};輸出的文本內(nèi)容switch(iMessage)//處理消息
{caseWM_CREATE:
//處理窗口創(chuàng)建消息
hDC=GetDC(hWnd);
//獲取當(dāng)前設(shè)備表句柄
GetTextMetrics(hDC,&tm); //獲取字體信息
nXChar=tm.tmAveCharWidth; //獲取字符寬度
nYChar=tm.tmHeight+tm.tmExternalLeading;
nCaps=(tm.tmPitchAndFamily&1?3:2)*nXChar/2;
ReleaseDC(hWnd,hDC); //釋放當(dāng)前設(shè)備句柄
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: //結(jié)束應(yīng)用程序
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; //定義一個(gè)TEXTMETRIC結(jié)構(gòu),用以記錄字體信息charlpsz_1[]=這是一行紅色的、字體為SYSTEM_FONT的文字,紅色代表未來。";charlpsz_2[]=現(xiàn)在顯示的是自定義字體,顏色為綠色,綠色代表生機(jī)勃勃。";charlpsz_3[]=現(xiàn)在展現(xiàn)在您面前的是藍(lán)色的粗體字,藍(lán)色代表廣闊的海洋和天空。";charlpsz_4[]="當(dāng)前字體為大號(hào)、斜體并帶有下劃線的文字。";charlpsz_5[]="現(xiàn)在您掌握了字體的操作了嗎?";charlpsz_6[]="祝您成功!";intX=0,Y=0;SIZEsize; //定義一個(gè)SIZE類型的結(jié)構(gòu)switch(message){
caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); SetTextColor(hdc,RGB(255,0,0)); //設(shè)置文本顏色為紅色
GetTextMetrics(hdc,&tm);//獲取缺省字體,寫入tm結(jié)構(gòu)中
TextOut(hdc,X,Y,lpsz_1,strlen(lpsz_1));//用當(dāng)前字體輸出文本
Y=Y+tm.tmHeight+100*tm.tmExternalLeading; //計(jì)算換行時(shí)下一行文本的輸出坐標(biāo)
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, //輸出質(zhì)量為缺省值
DEFAULT_PITCH|FF_DONTCARE,//字間距和字體系列使用缺省值
"粗體字"); //字體名稱
SetTextColor(hdc,RGB(0,255,0)); //設(shè)置文本顏色為綠色
SelectObject(hdc,hF_black); //將自定義字體選入設(shè)備環(huán)境
GetTextMetrics(hdc,&tm);//獲取字體的信息,寫入tm結(jié)構(gòu)中
TextOut(hdc,X,Y,lpsz_2,strlen(lpsz_2));//用當(dāng)前字體輸出文本
//換行繼續(xù)輸出文本,計(jì)算新行的起始Y坐標(biāo)位置
Y=Y+tm.tmHeight+10*tm.tmExternalLeading; GetTextExtentPoint32(hdc,lpsz_2,strlen(lpsz_2),&size); //獲取字符串/的寬度
SetTextColor(hdc,RGB(0,0,255)); //設(shè)置文本顏色為藍(lán)色
TextOut(hdc,X,Y,lpsz_3,strlen(lpsz_3));//當(dāng)前字體輸出文本
X=0; //計(jì)算下一行文本的輸出起始坐標(biāo)
Y=Y+tm.tmHeight+20*tm.tmExternalLeading;hF_big=CreateFont //引入新字體
(30, //字體高度
0, 0, 0,
FW_NORMAL, 1, //定義斜體
1, //定義輸出時(shí)帶下劃線
0,
ANSI_CHARSET, //所使用的字符集
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, "大號(hào)字"
);
SelectObject(hdc,hF_big);//將自定義字體選入設(shè)備環(huán)境
SetTextColor(hdc,RGB(155,155,155)); //設(shè)置文本顏色
Y=Y+tm.tmHeight+20*tm.tmExternalLeading;
TextOut(hdc,X,Y,lpsz_4,strlen(lpsz_4));//輸出文本
SetTextColor(hdc,RGB(255,0,0));//設(shè)置文本顏色為紅色
X=0; //設(shè)定輸出文本的X坐標(biāo)位置
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; //獲取起始坐標(biāo)
TextOut(hdc,X,Y,lpsz_6,strlen(lpsz_6)); //輸出文本
EndPaint(hwnd,&ps); break;caseWM_DESTROY: DeleteObject(hF_black); //退出窗口時(shí)刪除自定義字體
DeleteObject(hF_big); PostQuitMessage(0); break;
default: returnDefWindowProc(hwnd,message,wParam,lParam);
}
return0;}【4-3】在窗口中顯示出26個(gè)英文字母,從左向右字母依次位置提高10個(gè)象素單位,并且顏色變?yōu)榧t色,然后回到正常位置;當(dāng)?shù)竭_(dá)最右端后改變方向從右向左依次變成紅色并位置提高10個(gè)象素單位。在窗口的第二行顯示26個(gè)字母,字體從正常到斜體,顏色從黑色到天藍(lán)色不斷變換。如圖所示。用nChar標(biāo)志紅色跳起字母在26個(gè)字母的位置用bRight,bLeft標(biāo)志當(dāng)前移動(dòng)方向,初始化bRight=TRUE,bLeft=FALSE本例題要解決動(dòng)態(tài)顯示問題:首先處理第一行字符:在WM_PAINT消息處理程序中,在得到了設(shè)備環(huán)境句柄hDC后,調(diào)用用戶自定義的函數(shù)CreateFont(hDC,nHeight,bItalic),第一個(gè)參數(shù)hDC是設(shè)備環(huán)境句柄,第2個(gè)參數(shù)nHeight是字體高度,第3個(gè)參數(shù)bItalic是斜字體的標(biāo)志變量WM_CREATE消息處理程序定時(shí)器調(diào)用SetTimer(…)創(chuàng)建WM_TIMER消息處理程序調(diào)用InvalidateRect(…)刷新用戶區(qū)發(fā)送WM_PAINT消息實(shí)現(xiàn)動(dòng)態(tài)顯示下面這段程序按照黑色的字體輸出從字符串開頭到當(dāng)前位置的字符串:
Y=tm.tmExternalLeading+10; //設(shè)置輸出字符的Y坐標(biāo)
for(i=0;i<nChar;i++){SetTextColor(hDC,RGB(0,0,0)); //設(shè)置字體的顏色為黑色
X=X+tm.tmAveCharWidth*2; //設(shè)置輸出字符的X坐標(biāo)
TextOut(hDC,X,Y,&lpsz_1[i],1);//輸出從第0個(gè)到第nChar-1個(gè)字符
}下面輸出當(dāng)前位置上的字符,當(dāng)前位置的字符位置提高10個(gè)象素單位,字體顏色為紅色:
SetTextColor(hDC,RGB(255,0,0));//設(shè)置字體的顏色為紅色
X=X+tm.tmAveCharWidth*2; //設(shè)置輸出字符的X,Y坐標(biāo)
Y=tm.tmExternalLeading; //提高10個(gè)像素
hF=CreateFont(hDC,40,0); //創(chuàng)建字體
SelectObject(hDC,hF); //選入字體
TextOut(hDC,X,Y,&lpsz_1[nChar],1);//輸出第nChar個(gè)字符
Y=tm.tmExternalLeading+10; for(i=nChar+1;i<nCharlen;i++) {SetTextColor(hDC,RGB(0,0,0));//設(shè)置字體的顏色為黑色
X=X+tm.tmAveCharWidth*2;//設(shè)置輸出字符的X坐標(biāo)
TextOut(hDC,X,Y,&lpsz_1[i],1); //輸出后面的字符
}下面設(shè)置bRight和bLeft的值。
if(nChar==nCharlen) //當(dāng)輸出到最后的一個(gè)字符時(shí)
{
bRight=FALSE; //改變紅色字移動(dòng)的方向?yàn)橄蜃?/p>
bLeft=TRUE; } else(nChar==0) //當(dāng)輸出到第一個(gè)字時(shí)
{
bRight=TRUE; //改變紅色字移動(dòng)的方向?yàn)橄蛴?/p>
bLeft=FALSE; } if(bRight==TRUE)nChar++; elsenChar--;如果nChar==等于字符串長度=〉已到了字符串末尾,將bRight置為True字符長度==0時(shí),已到了最左端,將bLeft置為True;當(dāng)bRight=True時(shí)字符位置標(biāo)志nChar加1,當(dāng)bLeft=True時(shí),字符位置標(biāo)志變量減1。下面輸出第2行字符:在WM_PAINT處理程序中,加入下列代碼:
hF=CreateFont(hDC,40,bItalic); //創(chuàng)建字體.大小為40
SelectObject(hDC,hF); //選入字體
X=tm.tmAveCharWidth*2; //設(shè)置輸出位置
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;調(diào)用用戶自定義函數(shù)CreateFont(…)創(chuàng)建斜體字,確定輸出位置根據(jù)bItalic的狀態(tài)設(shè)置字體的顏色。當(dāng)bItalic為真時(shí),輸出斜體天藍(lán)色字符;為假時(shí),輸出正常黑色字體最后對(duì)bItalic取反,在下一次顯示與此次不同的另一種效果?!纠?-4】將一首四句的古詩從右到左豎排輸出。要求窗口每次接收到WM_PAINT消息時(shí)都刷新顯示的文本。
#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;
//定義指向設(shè)備環(huán)境的句柄 4.TEXTMETRICtm;
//存放字體各種屬性的結(jié)構(gòu)體變量5.PAINTSTRUCTPtStr;
//指向包含繪圖信息的結(jié)構(gòu)體變量6.staticchar*textbuf[4]={{"故人西辭黃鶴樓"},{"煙花三月下?lián)P州"}, {"孤帆遠(yuǎn)影碧空盡"},{"唯見長江天際流"}};7.switch(iMessage)
//處理消息8.{ caseWM_CREATE:
//處理窗口創(chuàng)建消息9.
hDC=GetDC(hWnd);
//獲取當(dāng)前設(shè)備表句柄10.
GetTextMetrics(hDC,&tm);
//獲取字體信息11.
nXChar=tm.tmAveCharWidth;
//獲取字符寬度12.
nYChar=tm.tmHeight+tm.tmExternalLeading; //字符
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年超小型鈕子開關(guān)項(xiàng)目可行性研究報(bào)告
- 2025年離子噴霧機(jī)項(xiàng)目可行性研究報(bào)告
- 2025年玻璃圓形切割臺(tái)項(xiàng)目可行性研究報(bào)告
- 2025年汽車不解體探傷儀項(xiàng)目可行性研究報(bào)告
- 2025年普通型鋼珠滑軌項(xiàng)目可行性研究報(bào)告
- 2025年承接式管道密封圈項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國啟動(dòng)機(jī)油泵試驗(yàn)臺(tái)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國保溫冰袋行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年亞麻粘項(xiàng)目可行性研究報(bào)告
- 2025年P(guān)ET耐高溫瓶吹瓶機(jī)項(xiàng)目可行性研究報(bào)告
- 2023年菏澤醫(yī)學(xué)??茖W(xué)校單招綜合素質(zhì)模擬試題及答案解析
- 常見食物的嘌呤含量表匯總
- 人教版數(shù)學(xué)八年級(jí)下冊(cè)同步練習(xí)(含答案)
- SB/T 10752-2012馬鈴薯雪花全粉
- 2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語)試題庫含答案解析
- 濕型砂中煤粉作用及檢測全解析
- 積累運(yùn)用表示動(dòng)作的詞語課件
- 機(jī)動(dòng)車登記證書英文證書模板
- 第8課《山山水水》教學(xué)設(shè)計(jì)(新人教版小學(xué)美術(shù)六年級(jí)上冊(cè))
- T∕ZSQX 008-2020 建設(shè)工程全過程質(zhì)量行為導(dǎo)則
- 質(zhì)量管理體系基礎(chǔ)知識(shí)培訓(xùn)-2016
評(píng)論
0/150
提交評(píng)論