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

如何做到像WORD一樣,同一字串中,中文/英文分別有不同的字體

答題得分者是:hagar
小蚊子
中階會員


發表:55
回覆:267
積分:94
註冊:2002-06-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-06-11 00:59:31 IP:211.74.xxx.xxx 未訂閱
...... BMP1.Canvas.Font.Name := '新細明體'; BMP1.canvas.TextOut(0, 0, '中山路2段101號28樓' ); ........... 請問網友,用上述方式產生的 BMP 圖,結果字體全部是 新細明體 但我發現 WORD 的字體可以一行中,中/英文分別有不同的字體, DELPHI 的繪圖指令 ,不知是否可以一樣的完成 簡言之,我的需求是讓圖形的字體,中文部分是 新細明體, 英文的部分是其它字體 不知如何做到?? 謝謝您了 !!
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-06-11 01:41:14 IP:61.64.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-06-11 06:13:06 IP:203.67.xxx.xxx 未訂閱
sorry,可能是我沒說清楚,我用 word 示範一個範例,張3李4  在 canvas.TextOut 的字體中,可以有如範例中的變化嗎??
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-11 08:02:03 IP:202.39.xxx.xxx 未訂閱
試試(中文用新細明體, 半形字用 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-11 09:29:49 IP:147.8.xxx.xxx 未訂閱
You need to do a little bit coding by changing your font and drawing the string parts by parts... Calculate needed width using Canvas.TextWidth...
小蚊子
中階會員


發表:55
回覆:267
積分:94
註冊:2002-06-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-11 11:21:18 IP:210.244.xxx.xxx 未訂閱
引言: ...... 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-06-11 12:19:13 IP:202.39.xxx.xxx 未訂閱
試試:
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-06-12 00:43:57 IP:61.64.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-06-12 01:27:33 IP:210.64.xxx.xxx 未訂閱
引言: 試試:
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 的部份.
http://www.hosp.ncku.edu.tw/~cww/html/q00367.html 這裡有中文說明,大家參考參考 !!
系統時間:2024-05-05 19:23:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!