cfont詳解:
windows提供了多種與裝置無關的不同尺寸的字型。有效地使用這些windows字型,不用在程式設計時下很大功夫,就可以明顯地增強各種應用程式的功能。字型是windows gdi必要的組成部分,這意味字型的使用與其他gdi物件一樣。它們可以縮放和剪下,可以像選取畫筆或者畫刷一樣選取裝置環境。所有關於撤消選中和刪除的gdi規則都適用於字型。
字型由cfont類進行管理,建立cfont類必須使用cfont類的成員函式,這點與cpen和cbrush有所不同。
1.cfont提供的建立字型的成員函式
利用cfont建立字型的方法有兩種,它們是:
(1)bool createfontindirect(const logfont* lplogfont )
該物件通過logfont結構建立字型,logfont結構的定義如下:
typedef struct taglogfont logfont;
logfont結構中各個成員的含義如下:
lfheight:設定字型的高度。
lfwidth:設定字型的平均寬度。
lfescapement:設定字串底線與水平線的夾角,夾角是以0.1度為單位。
lforientation:設定每乙個字元的底線與水平線的夾角,夾角是以0.1度為單位。
lfweight:設定字型的粗細,其取值範圍為0~1000,通常400為正常粗細,700為粗,如果取值為0,則選擇預設粗細。
lfitalic:如果為true,則字型為斜體。
lfunderline:如果為true,則字型帶下劃線。
lfstrikeout:如果為true,則字型帶刪除線。
lfcharset:指定字符集。
lfoutprecision:指定輸出時字型的精度。
lfclipprecision:指定輸出時字型被裁剪的精度。
lfquality:指定輸出質量。
lfpitchandfamily:設定字型的斜度和字型型別。
lffacename[lf_facesize]:設定字型字樣。
(2)createfont()成員函式
createfont()成員函式的原型:
bool createfont(
int nheight, //以邏輯單位方式指定字型的寬度
int nwidth, //以邏輯單位方式指定字型中字元的平均寬度
int nescapement, //指定偏離垂線和x軸在顯示面上的夾角(單位:0.1度)
int norientation, //指定符串基線和x軸之間的夾角(單位:0.1度)
int nweight, //指定字型鎊數
byte bitalic, //指定字型是否為斜體
byte bunderline, //指定字型是否帶下劃線
byte cstrikeout, //指定是否是字型字元突出
byte ncharset, //指定字型的字符集
byte noutprecision, //指定所需的輸出精度
byte nclipprecision, //指定所需的剪貼精度
byte nquality, //指示字型的輸出質量
byte npitchandfamily, //指定字型的間距和家族
lpctstr lpszfacename //指定字型字樣的名稱 )
引數說明:
nheight:其取值範圍可以大於0、等於0或小於0。nheight以邏輯單位方式指定字型的高度,字型的高度可任選下列值。
² 大於0:此時高度被轉化為裝置單位,與可用字型的網格高度做比較。
² 等於0:使用合理的預設大小。
² 小於0:此時高度被轉化為裝置單位,而絕對值與可用字型的字元高度做比較。
注意:nheight絕對值在轉化後不可超過16384裝置單位。
nescapement:指定偏離垂線與x軸在顯示面上的夾角。偏離垂線是從一行中開始到最後乙個字元的線,此角從x軸逆時針方向度量。
norientation:指定字元基線和x軸之間的夾角。此度數在座標軸中由x軸逆時針方向度量時座標系中y軸向下,順時針方向從x軸旋轉時,y軸向上。
用法舉例:
(一)顯示傾斜的文字
上文中的圖一顯示了通過顯示一系列的傾斜字串來實現環繞顯示的效果,下面來詳細說明如何實現這個效果。
實現上述的效果其實很容易,只要使用cfont類和logfont結構來靈活的建立字型,設定字型的屬性,就可以實現傾斜文字的效果。logfont結構中包含了所要建立的字型中的全部資訊,其中的ifescapement 成員制定了所建立的字型與水平方向所傾斜的角度,需要讀者注意的是該成員變數角度的單位是十分之一度而不是度,例如,如果ifescapement定義為 450,它表示字型的傾斜角度為45度。為了保證所有的字型按照乙個方向旋轉,一定要設定ifescapenent的clip_lh_angles位,否則字型有可能向反方向旋轉。
如同使用其它gdi(圖形使用者介面介面)物件一樣,在使用你定義的字型以前,必須要將建立的字型選入dc中(裝置上下文)。
(二)實現3d文字
計算機螢幕是平面二維的,我們之所以能欣賞到真如實物般的三維影象,是因為顯示在計算機螢幕上時色彩灰度的不同而使人眼產生視覺上的錯覺,而將二維的計算機螢幕感知為三維影象。基於色彩學的有關知識,三維物體邊緣的凸出部分一般顯高亮度色,而凹下去的部分由於受光線的遮擋而顯暗色。這一認識被廣泛應用於網頁或其他應用中對按鈕、3d線條的繪製。對於本文所要繪製的3d文字同樣也適用,即在原始位置顯示高亮度顏色,而在左下或右上等位置用低亮度顏色勾勒出其輪廓,這樣在視覺上便會產生3d文字的效果。具體實現時,可用完全一樣的字型在不同的位置分別繪製兩個不同顏色的2d文字,只要使兩個文字的座標合適,就完全可以在視覺上產生出不同效果的3d文字。
具體實現的思想是通過cdc::settextcolor()分別設定文字的顏色為高亮(3dhilight)和陰影(3dshadow)的狀態下顯示文字;同時注意在兩次顯示文字時要錯開幾個畫素,這樣才能達到預期的效果。實現的效果上文的圖二所示。
(三)文字的漸變效果
為了實現文字的漸變效果,需要設定乙個定時器(使用settimer()函式),在定時器響應函式處理過程中,通過呼叫cdc: settextcolor()函式不斷改變裝置上下文中文字的顯示顏色,從而實現文字的漸變效果。文字的顏色是通過rgb(紅、綠、蘭)三種基本顏色的混合所形成的最終結果,rgb三基色的變化範圍都是(0,255),r=g=b時,顏色的效果是灰色的,所謂灰色,就是在純白和純黑之間的一種過渡色,當r =g=b=0時,顏色為黑色,當r=g=b=255時,顏色為純白色,可以定義乙個修正變數,不斷的對該三基色進行遞增或遞減,從而實現文字的漸變顯示。這裡僅僅給出實現的思路,讀者自己可以很容易的實現**。
(四)其它
另外,還可以通過設定路徑物件來對普通的文字進行輪廓勾勒,使之具備特殊的效果。路徑是win32中新增的乙個gdi物件,下面先從概念上談起。
1)路徑的概念
在windows 95/nt 這樣的win32作業系統中,除了已有的點陣圖,畫筆,畫刷,字型,調色盤和區域之外,還增加了乙個新的gdi物件:路徑。路徑是可以被填充,畫出輪廓或同時被畫出輪廓並填充的乙個或多個圖形。路徑的引入,大大地豐富了windows的圖形功能,使得應用程式可以方便地建立複雜區域,繪製和填充不規則圖形。這裡說的不規則圖形是指由直線和貝塞爾曲線組成的圖形(相對於矩形,多邊形,橢圓等規則圖形)。
2)路徑的使用
與其它原有的gdi物件不同的是,mfc類庫沒有專門用乙個c++類來封裝路徑物件(或許在以後的版本中會得到支援)。有關路徑的定義和使用等各種操作都必須通過呼叫api函式(或cdc類中對應的成員函式)來實現。路徑的使用過程大致如下:
(1)呼叫beginpath()函式開始路徑定義;
(2)呼叫gdi繪圖函式來定義路徑;在win32中,可以用於定義路徑的gdi繪圖函式包括:anglearc()、 arc()、 arctochord()、ellipse ()、lineto()、textout()等函式;
(3)呼叫endpath()函式結束路徑定義;
完成路徑定義後,所定義的路徑即被同時選進裝置描述表,裝置描述表中原有的路徑物件在呼叫beginpath()函式開始路徑定義時即被廢棄。
(4)使用路徑物件。
完成路徑定義工作之後,應用程式便可以利用有關gdi函式來使用路徑,這些函式包括繪製路徑輪廓strokepath(),填充路徑fillpath (),繪製輪廓並填充strokeandfillpath(),把路徑轉換成區域pathtoregion(),把路徑直線化flattenpath (),提取路徑資料getpath(),加寬路徑widenpath()和設定裁剪路徑selectclippath()等。這些函式的具體使用方法可參閱有關的sdk文件。
下面的**演示了如何實現字型的空心效果
// 應用程式主視窗的重繪函式
void cmywnd::onpaint()
vc 字型類CFont詳解及用法例項《轉》
cfont詳解 windows提供了多種與裝置無關的不同尺寸的字型。有效地使用這些windows字型,不用在程式設計時下很大功夫,就可以明顯地增強各種應用程式的功能。字型是windows gdi必要的組成部分,這意味字型的使用與其他gdi物件一樣。它們可以縮放和剪下,可以像選取畫筆或者畫刷一樣選取裝...
C stringstream類用法詳解
本文主要介紹 c 中 stringstream 類的常見用法。定義了三個類 istringstream ostringstream 和 stringstream,分別用來進行流的輸入 輸出和輸入輸出操作。本文以 stringstream 為主,介紹流的輸入和輸出操作。主要用來進行資料型別轉換,由於 ...
Datable 詳解,及用法
一 dataset datatable datarow datacolumn 1 在dataset中新增datatable dataset.tables.add datatable 例項 dataset ds new dataset datatable table new datatable 學生表...