如何做到像WORD一樣,同一字串中,中文/英文分別有不同的字體 |
答題得分者是:hagar
|
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
......
BMP1.Canvas.Font.Name := '新細明體';
BMP1.canvas.TextOut(0, 0, '中山路2段101號28樓' ); ........... 請問網友,用上述方式產生的 BMP 圖,結果字體全部是 新細明體
但我發現 WORD 的字體可以一行中,中/英文分別有不同的字體,
DELPHI 的繪圖指令 ,不知是否可以一樣的完成 簡言之,我的需求是讓圖形的字體,中文部分是 新細明體,
英文的部分是其它字體
不知如何做到?? 謝謝您了 !!
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
Panel1 Image1 Label
動態元件 技巧 可以看看
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28622
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37690
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33755
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=32021
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=31513
其他 忘記了 自己找看看把
|
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
試試(中文用新細明體, 半形字用 Arial)
xPos 用來記錄每個字畫的時候的 x 座標
iTxtWidth 記錄每個字畫的寬度
IsDBCSLeadByte 函式判斷是否為全形中文
const str = '中山路2段101號28樓'; var i, xPos, iTxtWidth: integer; bmp: TBitmap; begin bmp := TBitmap.Create; try i := 1; xPos := 0; while i <= Length(str) do begin if IsDBCSLeadByte(Byte(str[i])) then begin bmp.Canvas.Font.Name := '新細明體'; bmp.Canvas.TextOut(xPos, 0, str[i] str[i 1]); iTxtWidth := bmp.Canvas.TextWidth(str[i] str[i 1]); Inc(i, 2); end else begin bmp.Canvas.Font.Name := 'Arial'; bmp.Canvas.TextOut(xPos, 0, str[i]); iTxtWidth := bmp.Canvas.TextWidth(str[i]); Inc(i); end; xPos := xPos iTxtWidth; end; bmp.SaveToFile('c:\xx.bmp'); finally bmp.Free; end; end;發表人 - hagar 於 2004/06/11 08:03:07 |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
引言: ...... BMP1.Canvas.Font.Name := '新細明體'; BMP1.canvas.TextOut(0, 0, '中山路2段101號28樓' ); ........... 請問網友,用上述方式產生的 BMP 圖,結果字體全部是 新細明體 但我發現 WORD 的字體可以一行中,中/英文分別有不同的字體, DELPHI 的繪圖指令 ,不知是否可以一樣的完成 簡言之,我的需求是讓圖形的字體,中文部分是 新細明體, 英文的部分是其它字體 不知如何做到?? 謝謝您了 !!終於弄懂了 , 感謝 conundrum ,hagar ,william 前輩的提醒 小妹用 hagar 的範例,稍加修正,有些小小的心得,與大家分享 另外有一問題是, windows 的字體,個別單字,好像無法控制寬度 ?? 簡言之,就是 字都是 寬,高的點數均相同,這裡真的有點遺憾 !! procedure TForm1.Button1Click(Sender: TObject); // BMP1.Width := ((BMP1.Canvas.TextWidth var i, xPos, iTxtWidth ,nWidth : integer; bmp: TBitmap; str : string; aFont : array[0..9] of string; aSize : array[0..9] of integer; begin aFont[0] := '新細明體'; aFont[1] := '@標楷體'; aFont[2] := '華康粗黑體'; aFont[3] := '@華康新特黑體'; aFont[4] := '@新細明體'; aFont[5] := '標楷體'; aFont[6] := '新細明體'; aFont[7] := 'Arial'; aFont[8] := '@細明體'; aFont[9] := '細明體'; aSize[0] := 20; aSize[1] := 40; aSize[2] := 15; aSize[3] := 35; aSize[4] := 30; aSize[5] := 8; aSize[6] := 18; aSize[7] := 40; aSize[8] := 20; aSize[9] := 22; bmp := TBitmap.Create; str := '中山路2段85號93樓'; try i := 1; xPos := 0; nWidth:=0; // 先預設一張大的空白圖 bmp.Width := length(str)*40; bmp.Height := 40; // 預設圖高度就是 40 while i <= Length(str) do begin if IsDBCSLeadByte(Byte(str[i])) then begin bmp.Canvas.Font.Name := aFont[i mod 10]; bmp.canvas.Font.Height := aSize[i mod 10]; bmp.Canvas.TextOut(xPos, 0, str[i] + str[i+1]); iTxtWidth := bmp.Canvas.TextWidth(str[i] + str[i+1]); Inc(i, 2); end else begin bmp.Canvas.Font.Name := aFont[i mod 10]; bmp.canvas.Font.Height := aSize[i mod 10]; bmp.Canvas.TextOut(xPos, 0, str[i]); iTxtWidth := bmp.Canvas.TextWidth(str[i]); Inc(i); end; xPos := xPos + iTxtWidth; end; // 有圖的區域才存檔 bmp.Width := xPos; bmp.SaveToFile('xx.bmp'); finally bmp.Free; end; end; |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
試試:
var lf: TLogFont; bmp: TBitmap; begin GetObject(Form1.Font.Handle, SizeOf(TLogFont), @lf); bmp := TBitmap.Create; try bmp.Width := 900; lf.lfWidth := 12; bmp.Canvas.Font.Handle := CreateFontIndirect(lf); bmp.Canvas.Font.Textout(0, 0, 'A'); lf.lfWidth := 24; bmp.Canvas.Font.Handle := CreateFontIndirect(lf); bmp.Canvas.Font.Textout(30, 0, 'B'); finally bmp.Free; end; end;其它還有 lfHeight, lfWeight.. 等可以玩, 詳情看 win 32 SDK help 內有關 LOGFONT 的部份. |
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
http://www.wer-weiss-was.de/theme159/article644778.html
http://homepages.borland.com/efg2lab/Graphics/CircleWordWrap.htm
http://www.festra.com/wwwboard/messages/4133.html http://www.digitalcoding.com/programming/delphi/tutorial/tuteg18.htm
http://www.citforum.netis.ru/programming/advice/advice04.shtml http://www.yesky.com/20011222/211127.shtml
http://www.ntsf.edu.cn/cjp/tutorial/delphi/delphi4.2.htm 還有殺咪好點子 讓庵亂PO一通 抱歉借用一下 發表人 - conundrum 於 2004/06/12 00:46:02
|
小蚊子
中階會員 發表:55 回覆:267 積分:94 註冊:2002-06-08 發送簡訊給我 |
引言: 試試:http://www.hosp.ncku.edu.tw/~cww/html/q00367.html 這裡有中文說明,大家參考參考 !!var lf: TLogFont; bmp: TBitmap; begin GetObject(Form1.Font.Handle, SizeOf(TLogFont), @lf); bmp := TBitmap.Create; try bmp.Width := 900; lf.lfWidth := 12; bmp.Canvas.Font.Handle := CreateFontIndirect(lf); bmp.Canvas.Font.Textout(0, 0, 'A'); lf.lfWidth := 24; bmp.Canvas.Font.Handle := CreateFontIndirect(lf); bmp.Canvas.Font.Textout(30, 0, 'B'); finally bmp.Free; end; end;其它還有 lfHeight, lfWeight.. 等可以玩, 詳情看 win 32 SDK help 內有關 LOGFONT 的部份. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |