我正在使用Delphi 7.我比使用畫布和繪製文本到畫布以及使用TCanvas.TextHeight等要熟悉的多。問題出現在我想要的時候實施Word Wrap。我不僅需要最好的方法來將文本繪製到畫布上,並且它會自動包裝到給定的寬度約束,但是我還需要知道它在包裝後有多高(或多少行)。在繪製文本之前,我需要準備另一張圖像,這個圖像需要足夠大才能放置包裝文本。這是試圖複製iPhone顯示SMS消息的方式,在可變高度滾動框(TScrollingWinControl是我的基礎)的屏幕兩側都有一個氣球。在繪製到畫布之前計算文本的大小
回答
使用(幾乎)萬能DrawText
使用初始矩形DT_CALCRECT
功能,和標誌DT_WORDBREAK
(意味着字符串應該是自動換行)和:
procedure TForm1.FormPaint(Sender: TObject);
const
S = 'This is a sample text, I think, is it not?';
var
r: TRect;
begin
r := Rect(10, 10, 60, 60);
DrawText(Canvas.Handle,
PChar(S),
Length(S),
r,
DT_LEFT or DT_WORDBREAK or DT_CALCRECT);
DrawText(Canvas.Handle,
PChar(S),
Length(S),
r,
DT_LEFT or DT_WORDBREAK);
end;
由於標誌DT_CALCRECT
,第一DrawText
將不會繪製任何東西,但只會改變r
的高度,以便它可以包含整個字符串S
(或者如果S
恰好適合單行,則會減少r
的寬度;此外,如果S
包含的字詞n不適合在一條線上,則會增加r
的寬度)。然後你可以用r
做任何你想做的事情,然後你就可以繪製真正的字符串。
試試這個,例如:
procedure TForm1.FormPaint(Sender: TObject);
const
S: array[0..3] of string = ('Hi! How are you?',
'I am fine, thanks. How are you? How are your kids?',
'Fine!',
'Glad to hear that!');
Colors: array[boolean] of TColor = (clMoneyGreen, clSkyBlue);
Aligns: array[boolean] of integer = (DT_RIGHT, DT_LEFT);
var
i, y, MaxWidth, RectWidth: integer;
r, r2: TRect;
begin
y := 10;
MaxWidth := ClientWidth div 2;
for i := low(S) to high(S) do
begin
Canvas.Brush.Color := Colors[Odd(i)];
r := Rect(10, y, MaxWidth, 16);
DrawText(Canvas.Handle,
PChar(S[i]),
Length(S[i]),
r,
Aligns[Odd(i)] or DT_WORDBREAK or DT_CALCRECT);
if not Odd(i) then
begin
RectWidth := r.Right - r.Left;
r.Right := ClientWidth - 10;
r.Left := r.Right - RectWidth;
end;
r2 := Rect(r.Left - 4, r.Top - 4, r.Right + 4, r.Bottom + 4);
Canvas.RoundRect(r2, 5, 5);
DrawText(Canvas.Handle,
PChar(S[i]),
Length(S[i]),
r,
Aligns[Odd(i)] or DT_WORDBREAK);
y := r.Bottom + 10;
end;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Invalidate;
end;
+1失望的談話是不是在瑞典...... ;-) –
真棒,實際上我發現這只是在找到這個答覆之前...謝謝你一堆,這將在這個組件很好。現在,如果我能得到一些建議什麼是這個組件的最佳繼承 - TScrollingWinControl/TImage(直接畫布)或TScrollingWinControl/TDrawGrid(Grid畫布)?它當然需要能夠輕鬆地上下滾動 - 我有一個使用TScrollBox中的TDrawGrid的版本 - 但需要更直接的繼承。 –
嗨安德烈亞斯 - 很好的答案像往常一樣! – Ampere
- 1. Infoviz。在繪製之前計算樹的畫布大小
- 2. 在繪製文本之前計算文本的寬度
- 3. VB.NET:在繪製到控件之前查找要繪製的文本的大小
- 4. 計算在畫布邊界之外繪製的區域
- 5. 如何在創建CustomCell之前計算文本大小
- 6. 如何計算要繪製的HTML文本的大小
- 7. GraphicsMagick ++繪製文本並自動調整大小畫布
- 8. GWT:放大和縮小畫布繪製
- 9. ABCPDF - 在繪製到PDF頁面之前計算文本所需的空間
- 10. 在畫布上繪製文本HTML會停止我的算法
- 11. 在畫布上繪製文本
- 12. 在畫布上垂直繪製文本
- 13. HTML5 - 畫布:繪製文本在梯度
- 14. pygame:在屏幕上繪製文本之前繪製文本
- 15. 繪製到畫布
- 16. 計算文本大小
- 17. 將位圖繪製到畫布的大小
- 18. 大字體大小HTML5畫布文本行程不繪製正確
- 19. 繪製大型圖像到畫布上
- 20. 如何繪製文本的畫布上
- 21. 計算呈現的文本字符串的大小(在呈現它之前)
- 22. 如何調整在畫布上繪製的形狀的大小
- 23. 調整在cnvas上繪製形狀的html5畫布的大小
- 24. 如何在發送到服務器之前減小畫布圖像的大小
- 25. 在保存到PHP中的磁盤之前計算圖像文件的大小
- 26. 計算最小矩形的大小,以覆蓋畫布旋轉
- 27. HTML5畫布:自動字體大小繪製包裹旋轉的文本
- 28. 在相對大小的畫布上繪製形狀
- 29. 畫布繪製文本寬度
- 30. 如何動畫自定義繪製文本的大小?
使用的DrawText,並讓系統做自動換行 –