麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

旋轉字體

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

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

附錄:源程序
ROTFONT.BAS文件:
DefIntA-Z
'邏輯字體
GlobalConstLF_FACESIZE=32'最長的字體名稱
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'無所謂
GlobalConstFF_ROMAN=16'字體寬度可變,TimesRoman,Century
'Schoolbook等
GlobalConstFF_SWISS=32'寬度可變,帶襯線,如Helvetica,Swiss等
GlobalConstFF_MODERN=48'具有規定的寬度,襯線可有可無,
'如Pica,Elite,Courier等等.
GlobalConstFF_SCRIPT=64'手寫體,如Cursive
GlobalConstFF_DECORATIVE=80'特殊字體,如OldEnglish
'GDI字體函數
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="旋轉字體演示"
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,"熱情技術技巧旋轉字體",10,290,nAngle
Next
EndSub

SubmnuExit_Click()
End
EndSub

SubmnuFont_Click()
'初始化對話框控制
CMDialog1.FontName=FontName
CMDialog1.FontSize=FontSize
CMDialog1.FontItalic=FontItalic
CMDialog1.FontBold=FontBold
CMDialog1.FontUnderLine=FontUnderLine
CMDialog1.FontStrikeThru=FontStrikeThru
OnErrorGoToErrHandle
CMDialog1.Action=4
'設置窗體的字體屬性
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結構
Font.lfEscapement=LineAngle*10'輸出字體行與水平頁底間的角度(以1/10
度為單位)
'必須是可變點字體
Font.lfPitchAndFamily=Chr$(VARIABLE_PITCHOrFF_DONTCARE)
'創建字體
hFont=CreateFontIndirect(Font)
'選擇旋轉字體
r=SelectObject(hDestDC,hFont)
'顯示字體
TextOuthDestDC,x,y,Text$,Len(Text$)
'恢復原字體
hFont=SelectObject(hDestDC,hOldFont)
'刪除創建的字體
DeleteObjecthFont
EndSub->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 13一14毛片免费看 | 911色_911色sss主站色播 | 一级裸体视频 | omofun 动漫在线观看 | 欧美精品色精品一区二区三区 | 色999国产| 精品中文视频 | 国产亚洲欧美日韩高清 | 免费观看国产精品视频 | av免费av | xnxx 日本免费 | 激情久久一区二区 | 一级毛片在线免费观看视频 | 思思久而久而蕉人 | av在线免费播放网站 | 国产精品免费在线 | 国产成人在线网址 | 欧美日韩高清在线观看 | 369看片你懂的小视频在线观看 | 亚洲视频在线一区二区 | 一级毛片真人免费播放视频 | av免费在线播放网址 | 免费在线观看国产精品 | 国产免费黄色 | 日本黄色免费观看视频 | 成人毛片视频免费看 | 狠狠色成色综合网 | 黄色片免费在线 | 毛片大全免费看 | 国产一区二区精品免费 | 亚洲国产精品久久久 | 免费黄色小网站 | 蜜桃久久一区二区三区 | 夜夜夜操操操 | 国产精品久久久久久久av | 国产精品久久久久久久久久久久久久久 | 九七在线视频 | 电影91 | 久久一级 | 有色视频在线观看 | 国产精品免费一区二区 |