最近在做一個TStringGrid的自繪處理,在畫文字處理上遇到了高度的計算問題。後來經過一段時間還是找到了一些方法:
這個方法是有點繞路的,方法倒是簡單,就是使用AutoSize屬於來完成。。
DrawText的函數定義:
函數原型
int DrawText(HDC hDC, // 設備描述表句柄
LPCTSTR lpString, // 將要繪制的字符串
int nCount, // 字符串的長度
LPRECT lpRect, // 指向矩形結構RECT的指針
UINT uFormat // 正文的繪制選項
);
參數
hdc:[輸入]設備環境句柄。
lpString:
[輸入]指向將被寫入的字符串的指針,如果參數nCount是-1,則字符串必須是以\0結束的。 如果uFormat包含DT_MODIFYSTRING,則函數可為此字符串增加4個字符,存放字符串的緩沖區必須足夠大,能容納附加的字符。
nCount:
[輸入]指向字符串中的字符數。如果nCount為-1,則lpString指向的字符串被認為是以\0結束的,DrawText會自動計算字符數。
lpRect:
[輸入/輸出]指向結構RECT的指針,其中包含文本將被置於其中的矩形的信息(按邏輯坐標)。
uFormat:
[輸入]指定格式化文本的方法。它可以下列值的任意組合,各值描述如下:
DT_CALCRECT:這個參數比較重要,可以使DrawText函數計算出輸出文本的尺寸。如果輸出文本有多行,DrawText函數使用lpRect定義的矩形的寬度,並擴展矩形的底部以容納輸出文本的最後一行。如果輸出文本只有一行,則DrawText函數改變矩形的右邊界,以容納下正文行的最後一個字符。出現上述任何一種情況,DrawText函數將返回格式化文本的高度,而不是繪制文本。
DT_CENTER:指定文本水平居中顯示。
DT_VCENTER:指定文本垂直居中顯示。該標記只在單行文本輸出時有效,所以它必須與DT_SINGLELINE結合使用。
DT_SINGLELINE:單行顯示文本,回車和換行符都不斷行。
函數裡面最後面那段藍字標示的很重要,DT_CALCRECT就是用來計算文本尺寸的哦。。做個試驗吧:
procedure TForm1.Button1Click(Sender: TObject); var sData: string; cellRect: TRect; begin cellRect.Left := 10; cellRect.Top := 10; cellRect.Right := 200; cellRect.Bottom := 25; sData := '中中國國國 大'; DrawText(Canvas.Handle, PChar(sData), Length(sData), cellRect, DT_WORDBREAK or DT_CALCRECT); end;
//執行後沒有在界面上畫文本 procedure TForm1.Button2Click(Sender: TObject); var sData: string; cellRect: TRect; begin cellRect.Left := 10; cellRect.Top := 10; cellRect.Right := 200; cellRect.Bottom := 25; sData := '中中國國國 大'; DrawText(Canvas.Handle, PChar(sData), Length(sData), cellRect, DT_WORDBREAK); end;
//執行後在界面上顯示一行字
注意點: