我正在使用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. 計算在畫布邊界之外繪製的區域
- 4. 如何在創建CustomCell之前計算文本大小
- 5. 如何計算要繪製的HTML文本的大小
- 6. GraphicsMagick ++繪製文本並自動調整大小畫布
- 7. ABCPDF - 在繪製到PDF頁面之前計算文本所需的空間
- 8. 在畫布上繪製文本HTML會停止我的算法
- 9. 在畫布上垂直繪製文本
- 10. 繪製到畫布
- 11. 計算文本大小
- 12. 繪製大型圖像到畫布上
- 13. HTML5畫布:自動字體大小繪製包裹旋轉的文本
- 14. 在保存到PHP中的磁盤之前計算圖像文件的大小
- 15. 在相對大小的畫布上繪製形狀
- 16. 在壓縮文件夾之前和之後計算文件大小
- 17. 下載前計算文件大小
- 18. 在android中繪製與畫布四分之一計?
- 19. 繪製畫布到疊加
- 20. Android:繪製畫布到ImageView
- 21. HTML5響應式畫布:調整瀏覽器畫布的大小繪製消失
- 22. 如何在繪製之前獲取TableLayoutPanel的大小?
- 23. 在共享之前調整圖像大小(插入畫布)
- 24. 如何在繪製到畫布之前獲取Silverlight的bitmapimage像素高度?
- 25. 在調整大小之前計算調整大小的圖像的文件大小(例如JPEG)
- 26. 是否可以繪製比當前屏幕更大的畫布?
- 27. 我們可以放大縮小我們在畫布上繪製的圖畫嗎?
- 28. 如何獲取onDraw之前的畫布大小()
- 29. 如何計算TextBlock的字體大小以填充畫布?
- 30. 來自計算機的畫布上的繪畫圖像
使用的DrawText,並讓系統做自動換行 –