GDI中獲取字串精確繪製範圍的兩種做法比較

2021-08-27 01:46:51 字數 1205 閱讀 6785

應該說這不是乙個高深的問題,不過研究下來還是有一點收穫。首先說說為什麼要獲取字串的精確繪製範圍,這個主要是為了提高繪圖效率,比如我們繪圖時只是修改某個區域的字串,在這種情況下更新整個客戶區肯定是不合理,因此獲取精確的範圍進行更新是一種通行的做法。

經過搜尋,我發現gdi中獲取字串精確繪製範圍的做法有兩種,一是使用cdc類的gettextextent函式;另一種方法是petzod的《windows程式設計》中的第四章輸出文字介紹的方法,簡單來說就是獲取每個字元的寬高,然後進行計算。為此我寫了兩個函式:

/*! * @brief 使用cdc類gettextextent介面獲取字串的精確的區域大小 * * @param nxstart [in]區域的起點x座標 * @param nystart [in]區域的起點y座標 * @param pdc [in]裝置dc指標 * @param str [in]字串 * @return 該字串的精確區域 */ crect cfontsizeview::getcharextent(int nxstart,int nystart,cdc *pdc,const cstring &str) /*! * @brief 使用petzod的《windows程式設計》中的第四章輸出文字介紹的方法, * 簡單來說就是獲取每個字元的寬高,然後進行計算。具體大家可以看該書的第四章。 * * @param nxstart [in]區域的起點x座標 * @param nystart [in]區域的起點y座標 * @param pdc [in]裝置dc指標 * @param str [in]字串 * @return 該字串的精確區域 */ crect cfontsizeview::getcharextent2(int nxstart,int nystart,cdc *pdc,const cstring &str) 一般來說大家可能傾向於使用第一種方法,即使用cdc類gettextextent介面獲取字串的精確的區域大小。但是我經過多次測試發現,如果繪製的字串為全英文是,第二種方法的效果更好。在全英文的情況下,在常規字形下通過兩種方法獲取區域進行繪製效果沒有差別,但是在斜體字形下,使用cdc類gettextextent介面是下面的效果:

而使用getcharextent2是下面的效果:

顯然使用getcharextent2函式的效果更好。

接著進行更多的測試,發現如果字串是全中文的話一定要用cdc類gettextextent介面,petzold的方法看來是不適用中文,另外如果字串是中英文結合的話,也必須用cdc類gettextextent介面。

獲取字串

package cn.itcast.day08.demo02 public int length 獲取字串當中含有的字元個數,拿到字串長度。public string concat string str 將當前字串和引數字串拼接成為返回值新的字串。public char charat int ind...

獲取字串中的子字串

如真彩色的red,green,blue的值組成乙個字串,用逗號分開。但是逗號的位置是非固定的,因為r,g,b的各個值可以是1 3位數。下面是乙個將r,g,b的值組成的字串,通過逗號來將其分割,並分別放到陣列中。並算出其真彩色的值。sub test dim ss as string ss 12,156...

獲取字串中的子串

輸入乙個連續的字串,輸出乙個字串陣列,規則是相鄰的字元如果相同,那麼就認為是同乙個子串。我的實現如下 using system using system.collections.generic using system.linq using system.text using system.thre...