国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

旋轉(zhuǎn)字體

2019-11-18 17:37:47
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
如何使自己設(shè)計(jì)的程序具有漂亮和友好的界面,是程序員間永恒的話題。這里,筆者向您介紹一種非常簡(jiǎn)單的技巧,使文字旋轉(zhuǎn)起來(lái)。
這里的“旋轉(zhuǎn)字體”指的是讓一行字體的水平基線(baseline)轉(zhuǎn)過(guò)一定的角度。正如您所看到的,旋轉(zhuǎn)字體會(huì)產(chǎn)生輕松、活潑的視覺(jué)效果,可以給觀者以特殊的聯(lián)想,是一種行之有效的顯示特技。
有一種很容易想到的辦法可以實(shí)現(xiàn)旋轉(zhuǎn)字體,即首先生成文字的點(diǎn)陣(位圖),然后利用坐標(biāo)旋轉(zhuǎn)變換生成新的位圖再輸出到屏幕或打印機(jī)上。這種辦法思路清晰,不但可以用于字體的旋轉(zhuǎn),也可以用于其他種種字體變形,如同WinWord中的WordArt或中文之星的“藝術(shù)漢字”。但這種辦法實(shí)現(xiàn)起來(lái)比較麻煩,需要一些計(jì)算機(jī)繪圖學(xué)方面的知識(shí),而且位圖變換過(guò)程中需要占用較多的內(nèi)存。而我們所要介紹的方法,可以有效地解決這些問(wèn)題,而且不需要什么專(zhuān)門(mén)的知識(shí),而是充分地利用WindowsAPI已有的功能實(shí)現(xiàn)旋轉(zhuǎn)字體的效果。
我們知道,邏輯字體是一類(lèi)非常重要的WindowsGDI對(duì)象。我們正是通過(guò)選擇不同的邏輯字體來(lái)輸出各種秀美的字體的。而所謂“旋轉(zhuǎn)字體”不過(guò)是一類(lèi)特殊的邏輯字體。如同其他的GDI對(duì)象(如畫(huà)筆、畫(huà)刷、調(diào)色板)一樣,字體對(duì)象不但具有固有的字體,我們也可以建立自己的邏輯字體。建立字體可以使用WindowsAPI的CreateFontIndirect()函數(shù)。在調(diào)用該函數(shù)之前,我們將字體的特征放入LOGFONT
結(jié)構(gòu)變量中。LOGFONT結(jié)構(gòu)是這樣定義的:
TypeLOGFONT
lfHeightAsInteger'字體的高度
lfWidthAsInteger'字體的寬度
lfEscapementAsInteger'字體旋轉(zhuǎn)的角度
lfOrientationAsInteger
lfWeightAsInteger'字體的輕重
lfItalicAsString*1'是否為斜體
lfUnderlineAsString*1'是否有下劃線
lfStrikeOutAsString*1'是否有強(qiáng)調(diào)線
lfCharSetAsString*1'字符集
lfOutlfClEndType

利用這個(gè)數(shù)據(jù)結(jié)構(gòu),你可以方便地設(shè)置各種字體參數(shù),比如高度、寬度等。該結(jié)構(gòu)中同我們所要討論的問(wèn)題關(guān)系最大的是lfEscapement,它表示字符的基線同坐標(biāo)的X軸之間的旋轉(zhuǎn)角度,從X軸正方向開(kāi)始沿逆時(shí)針?lè)较蛐D(zhuǎn),以十分之一度為單位(圖2)。蔡明志先生著的《Windows程序設(shè)計(jì)?繪圖篇--使用BorlandC forWindows》一書(shū)(科學(xué)出版社1993年9月出版)的482頁(yè)上指出旋轉(zhuǎn)角度以十度為單位,為此筆者查閱了SDK手冊(cè),其英文原文為:“measuredintenthsofadegree”,似應(yīng)為以十分之一度為單位。
lfFaceName指明字體的名稱(chēng),如“宋體”、“行楷”。需要指出的是,個(gè)別字體不支持字體旋轉(zhuǎn),主要是字體寬度不可變的種類(lèi),如FixedSys就不支持字體旋轉(zhuǎn),好在這樣的字體只有一兩種。
具體的實(shí)現(xiàn)參見(jiàn)文后所附的程序(用VisualBasic3.0編寫(xiě)),其中RotPrint過(guò)程用來(lái)輸出旋轉(zhuǎn)字體。其步驟如下:首先,利用GetObject()函數(shù)獲得當(dāng)前字體的LOGFONT結(jié)構(gòu),修改lfEscapement,設(shè)置旋轉(zhuǎn)角度,然后調(diào)用CreateFontIndirect()函數(shù)建立邏輯字體并選用之。接下來(lái),調(diào)用TextOut()函數(shù)輸出字符串。使用TextOut()函數(shù)可以使那些不支持Print方法的控制(如標(biāo)簽),同樣可以輸出旋轉(zhuǎn)字體。最后,用DeleteObject()函數(shù)刪除建立的邏輯字體并恢復(fù)原字體。
您可以通過(guò)示例程序的“選擇”菜單中的“字體”項(xiàng)來(lái)嘗試不同的字體效果,從中選出令人滿意的組合。

附錄:源程序
ROTFONT.BAS文件:
DefIntA-Z
'邏輯字體
GlobalConstLF_FACESIZE=32'最長(zhǎng)的字體名稱(chēng)
GlobalConstSYSTEM_FONT=13
TypeLOGFONT
lfHeightAsInteger
lfWidthAsInteger
lfEscapementAsInteger
lfOrientationAsInteger
lfWeightAsInteger
lfItalicAsString*1
lfUnderlineAsString*1
lfStrikeOutAsString*1
lfCharSetAsString*1
lfOutPrecisionAsString*1
lfClipPrecisionAsString*1
lfQualityAsString*1
lfPitchAndFamilyAsString*1
lfFaceNameAsString*LF_FACESIZE
EndType
'字體的族
GlobalConstFF_DONTCARE=0'無(wú)所謂
GlobalConstFF_ROMAN=16'字體寬度可變,TimesRoman,Century
'Schoolbook等
GlobalConstFF_SWISS=32'寬度可變,帶襯線,如Helvetica,Swiss等
GlobalConstFF_MODERN=48'具有規(guī)定的寬度,襯線可有可無(wú),
'如Pica,Elite,Courier等等.
GlobalConstFF_SCRIPT=64'手寫(xiě)體,如Cursive
GlobalConstFF_DECORATIVE=80'特殊字體,如OldEnglish
'GDI字體函數(shù)
DeclareFunctionCreateFontIndirectLib"GDI"(lpLogFontAsLOGFONT)As
Integer
DeclareFunctionSelectObjectLib"GDI"(ByValhDC,ByValObject)As
Integer
DeclareSubDeleteObjectLib"GDI"(ByValObject)
DeclareFunctionGetStockObjectLib"GDI"(ByValnIndexAsInteger)As
Integer
DeclareSubGDIGetObjectLib"GDI"Alias"GetObject"(ByValhObjectAs
Integer,ByValnCountAsInteger,lpObjectAsAny)
DeclareSubTextOutLib"GDI"(ByValhDCAsInteger,ByValXAsInteger,
ByValYAsInteger,ByVallpStringAsString,ByValnCountAsInteger)

ROTFONT.FRM文件:
VERSION2.00
BeginFormfrmRotDemo
Caption="旋轉(zhuǎn)字體演示"
ClientHeight=4980
ClientLeft=1095
ClientTop=1785
ClientWidth=4380
FontBold=-1'True
FontItalic=0'False
FontName="CourierNew"
FontSize=18
FontStrikethru=0'False
FontUnderline=0'False
Height=5670
Left=1035
LinkTopic="Form1"
ScaleHeight=332
ScaleMode=3'Pixel
ScaleWidth=292
Top=1155
Width=4500
BeginCommonDialogCMDialog1
Flags=257
Left=0
Top=0
End
BeginMenumnuOption
Caption="選擇(&O)"
BeginMenumnuFont
Caption="字體(&F)..."
Shortcut=^F
End
BeginMenumnuS1
Caption="-"
End
BeginMenumnuExit
Caption="退出(&X)"
Shortcut=^X
End
End
End
OptionExplicit

SubForm_Paint()
DimnAngle
Cls
FornAngle=20To80Step10
ForeColor=QBColor(nAngle/10-2)
RotPrinthDC,"熱情技術(shù)技巧旋轉(zhuǎn)字體",10,290,nAngle
Next
EndSub

SubmnuExit_Click()
End
EndSub

SubmnuFont_Click()
'初始化對(duì)話框控制
CMDialog1.FontName=FontName
CMDialog1.FontSize=FontSize
CMDialog1.FontItalic=FontItalic
CMDialog1.FontBold=FontBold
CMDialog1.FontUnderLine=FontUnderLine
CMDialog1.FontStrikeThru=FontStrikeThru
OnErrorGoToErrHandle
CMDialog1.Action=4
'設(shè)置窗體的字體屬性
FontName=CMDialog1.FontName
FontSize=CMDialog1.FontSize
FontItalic=CMDialog1.FontItalic
FontBold=CMDialog1.FontBold
FontUnderLine=CMDialog1.FontUnderLine
FontStrikeThru=CMDialog1.FontStrikeThru
Refresh
ErrHandle:
EndSub

SubRotPrint(ByValhDestDCAsInteger,Text$,xAsInteger,yAs
Integer,LineAngleAsInteger)
DimhFontAsInteger,hOldFontAsInteger,r
DimFontAsLOGFONT
hOldFont=SelectObject(hDestDC,GetStockObject(SYSTEM_FONT))
GDIGetObjecthOldFont,Len(Font),Font
'填充LOGFONT結(jié)構(gòu)
Font.lfEscapement=LineAngle*10'輸出字體行與水平頁(yè)底間的角度(以1/10
度為單位)
'必須是可變點(diǎn)字體
Font.lfPitchAndFamily=Chr$(VARIABLE_PITCHOrFF_DONTCARE)
'創(chuàng)建字體
hFont=CreateFontIndirect(Font)
'選擇旋轉(zhuǎn)字體
r=SelectObject(hDestDC,hFont)
'顯示字體
TextOuthDestDC,x,y,Text$,Len(Text$)
'恢復(fù)原字體
hFont=SelectObject(hDestDC,hOldFont)
'刪除創(chuàng)建的字體
DeleteObjecthFont
EndSub->


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 秦安县| 贞丰县| 东莞市| 托里县| 潞西市| 昌都县| 华池县| 谢通门县| 龙口市| 营口市| 沁源县| 四会市| 乌海市| 和政县| 东山县| 定兴县| 文登市| 项城市| 吴旗县| 固阳县| 丹东市| 霍州市| 永吉县| 灵丘县| 桂阳县| 缙云县| 临沭县| 九龙城区| 三河市| 华坪县| 辉县市| 鄂托克旗| 扎赉特旗| 皮山县| 湘乡市| 喀喇| 前郭尔| 镇远县| 靖州| 合山市| 大冶市|