全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2343
推到 Plurk!
推到 Facebook!

如何繪製 Halo 文字效果

答題得分者是:jow
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-24 22:59:59 IP:116.76.xxx.xxx 未訂閱
我希望在Canvas上Draw光暈效果文字(Halo Text, 見附圖), 請問該如何繪製呢.

Halo 效果說明:
在文字筆畫的邊上套上一個像素寬度的白邊.
也即每一個文字像素點(黑色)的周圍有八個像素點, 如果不屬於文字像素點, 則要作爲光暈點而繪爲白色. (不知道描述明白沒有, 也許看樣圖更明白
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
jow
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-24 23:36:21 IP:123.193.xxx.xxx 訂閱



[code delphi]

procedure TForm1.FormCreate(Sender: TObject);
begin
Color := clNavy;
end;

procedure TForm1.FormPaint(Sender: TObject);
const
S = '泰安產物保險公司';
var
I, TW, TH: Integer;
R: TRect;
begin
Canvas.Font.Name := '標楷體';
Canvas.Font.Height := 36;
Canvas.Font.Color := clWhite;
Canvas.Font.Style := [];
Canvas.Brush.Color := clWhite;
Canvas.Brush.Style := bsClear;
TW := Canvas.TextWidth(S);
TH := Canvas.TextHeight(S);
R := Rect(0, 0, TW, TH);
OffsetRect(R, 10, 10);
for I := 0 to 8 do
begin
case I of
0: OffsetRect(R, -1, -1);
1: OffsetRect(R, 1, 0);
2: OffsetRect(R, 1, 0);
3: OffsetRect(R, 0, 1);
4: OffsetRect(R, 0, 1);
5: OffsetRect(R, -1, 0);
6: OffsetRect(R, -1, 0);
7: OffsetRect(R, 0, -1);
8:begin
Canvas.Font.Color := clRed;
OffsetRect(R, 1, 0);
end;
end;
DrawText(Canvas.Handle, S, Length(S), R, DT_CENTER or DT_SINGLELINE);
end;

end;
[/code]
編輯記錄
jow 重新編輯於 2007-10-24 23:40:06, 註解 無‧
jow 重新編輯於 2007-10-25 07:47:58, 註解 無‧
taishyang
站務副站長


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-25 10:30:38 IP:122.124.xxx.xxx 未訂閱
借用JOW前輩的程式改成BCB版

[code cpp]
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Color = clNavy;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)
{
const String S = "泰安產物保險公司";
int I, TW, TH;
TRect R;

Canvas->Font->Name = "標楷體";
Canvas->Font->Height = 36;
Canvas->Font->Color = clWhite;
Canvas->Brush->Color = clWhite;
Canvas->Brush->Style = bsClear;
TW = Canvas->TextWidth(S);
TH = Canvas->TextHeight(S);
R = Rect(0, 0, TW, TH);
OffsetRect(R, 10, 10);
for (I=0; I<=8; I )
{
switch (I)
{
case 0: OffsetRect(R, -1, -1); break;
case 1: OffsetRect(R, 1, 0); break;
case 2: OffsetRect(R, 1, 0); break;
case 3: OffsetRect(R, 0, 1); break;
case 4: OffsetRect(R, 0, 1); break;
case 5: OffsetRect(R, -1, 0); break;
case 6: OffsetRect(R, -1, 0); break;
case 7: OffsetRect(R, 0, -1); break;
case 8:
{
Canvas->Font->Color = clRed;
OffsetRect(R, 1, 0);
}
}
DrawText(Canvas->Handle, S.c_str(), S.Length(), &R , DT_CENTER | DT_SINGLELINE);
}
}

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