線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2993
推到 Plurk!
推到 Facebook!

如何在Canvas內顯示多行置中文字

答題得分者是:jow
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-06 18:42:02 IP:125.230.xxx.xxx 訂閱
我用TCustomControl,自己寫了一個button,想要顯示多行置中的文字郤show不出來(單行是可以喔) !!

canvas.Lock;
try
Canvas.Font := Font;
with Canvas do
begin
if FMonitor then
begin
Brush.Color := FOnColor; // Draw paper background.
s1 := FCaptionForOn;
end
else
begin
Brush.color := FOffColor;
s1 := FCaptionForOff;
end;
FillRect(ClientRect);
//
// draw edge
if CanOperation then
pen.Style := psSolid
else
pen.Style := psDot;
Pen.Color := FBorderColor;
Pen.Width := 1;
Rectangle(0, 0, ClientWidth, ClientHeight);
if FMouseDown or (not CanOperation) then
pen.Color := clGray;
Rectangle(1, 1, ClientWidth - 1, ClientHeight - 1);
// draw caption1
Brush.Style := bsClear;
Rect.Left := integer(FMouseDown) 1;
Rect.Top := integer(FMouseDown) 1;
Rect.Bottom := ClientHeight - 1;
Rect.right := ClientWidth - 1;
DrawText(Handle, PChar(s1), -1, Rect, DT_VCENTER or DT_CENTER or DT_WORDBREAK ); // strlen(pchar(s1))
end; {with}
finally
canvas.Unlock;
end;
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-06 23:12:47 IP:123.193.xxx.xxx 未訂閱
用一個TStringList來分離所要繪製的文字
以下程式碼,提供你參考...

[code delphi]
var
s1: string;
r: TRect;
L: TStringList;
I, h: Integer;
begin
canvas.Lock;
try
// Canvas.Font := Font;
Canvas.Font.Assign(Font);
with Canvas do
begin
if FMonitor then
begin
Brush.Color := FOnColor; // Draw paper background.
s1 := FCaptionForOn;
end
else begin
Brush.color := FOffColor;
s1 := FCaptionForOff;
end;
FillRect(ClientRect);
// draw edge
if CanOperation then
pen.Style := psSolid
else
pen.Style := psDot;
Pen.Color := FBorderColor;
Pen.Width := 1;
Rectangle(0, 0, ClientWidth, ClientHeight);
if FIsMouseDown or (not CanOperation) then
pen.Color := clGray;
Rectangle(1, 1, ClientWidth - 1, ClientHeight - 1);
// draw caption1
Brush.Style := bsClear;
h := Canvas.TextHeight('0');
r := Rect(1,1,ClientWidth-1,h);
L := TStringList.Create;
try
L.Delimiter := #$20;
L.DelimitedText := s1;
for I := 0 to L.Count-1 do
begin
DrawText(Handle,PChar(L[I]),-1,r,
DT_VCENTER or DT_CENTER or DT_WORDBREAK );
OffsetRect(r,0,h 1);
end;
finally
FreeAndNil(L);
end;
end;
finally
canvas.Unlock;
end;
end;

[/code]
編輯記錄
jow 重新編輯於 2008-07-06 23:13:23, 註解 無‧
jow 重新編輯於 2008-07-06 23:14:17, 註解 無‧
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-07 10:09:55 IP:220.130.xxx.xxx 訂閱
那DT_WORDBREAK還需要寫嗎!
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-07 10:19:37 IP:61.222.xxx.xxx 訂閱
原因:
通常使用 DT_WordBreak 就會斷字,像是中文或英文單字(空白區分)。如果為單字超過邊界如 AAAAAAAAAAAAAAAAAAAAAAAAAAA 當然無法截斷。

解決:
DT_CENTER or DT_WORDBREAK or DT_EDITCONTROL
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-07 15:02:38 IP:220.130.xxx.xxx 訂閱
另外一個問題是,若我一樣用TCustomControl要寫一個仿led元件帶caption,底色要跟owner一樣要如何寫(Transparent)!
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-07 15:29:00 IP:61.222.xxx.xxx 訂閱
若底色與Parent 底色一致,這很簡單。Parent.Color  或 ParentColor  = True

當然你想要的一定不是那麼簡單。
若要做到 TransParent 透空。可取消 WM_ERASEBKGND 具體搜索一下。
不過大體來說這種作法都不漂亮。多少會有殘影問題。

建議繼承 TGraphicControl 比較好處理透空問題。


===================引 用 bill534 文 章===================
另外一個問題是,若我一樣用TCustomControl要寫一個仿led元件帶caption,底色要跟owner一樣要如何寫(Transparent)!
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-07-07 20:50:12 IP:125.230.xxx.xxx 訂閱
像我現在用Tcustomcontrol的方式寫了一個led元件,其裏面居然可以放元件,我可以關掉嗎!
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-07-07 21:48:11 IP:61.222.xxx.xxx 訂閱
在 Create 時。
ControlStyle := ControlStyle - [csAcceptsControls];

===================引 用 bill534 文 章===================
像我現在用Tcustomcontrol的方式寫了一個led元件,其裏面居然可以放元件,我可以關掉嗎!
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-07-09 11:41:07 IP:61.222.xxx.xxx 訂閱
搞不懂現在的人 ...。耍我啊。....
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-07-09 12:09:07 IP:118.169.xxx.xxx 訂閱

希望RootKit前輩繼續燃燒您的熱情 ^^


===================引 用 RootKit 文 章===================
搞不懂現在的人 ...。耍我啊。....
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-07-18 16:49:03 IP:61.222.xxx.xxx 訂閱
感謝安慰。thank you !(拳頭拍胸二下)

===================引 用 taishyang 文 章===================

希望RootKit前輩繼續燃燒您的熱情 ^^


===================引 用 RootKit 文 章===================
搞不懂現在的人 ...。耍我啊。....
系統時間:2024-03-28 22:56:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!