ホーム >プログラム >Delphi 6 ローテクTips

Windows APIメモ TextOutW ExtTextOutW DrawTextW

Windows APIのメモ。
TextOutW ExtTextOutW DrawTextW。

procedure TForm1.Button1Click(Sender: TObject);
var
  lrc_Rect: TRect;
  ls_Text: WideString;
begin
  ls_Text := '';
  ls_Text := ls_Text + WideChar($BBF8) + WideChar($C548);  //미안

  Image1.Canvas.Font.Assign(Edit1.Font);
  Image2.Canvas.Font.Assign(Edit1.Font);
  Image3.Canvas.Font.Assign(Edit1.Font);

  Image1.Canvas.FillRect(Image1.ClientRect);
  TextOutW(Image1.Canvas.Handle, 0, 0, PWideChar(ls_Text), Length(ls_Text));

  Image2.Canvas.FillRect(Image2.ClientRect);
  lrc_Rect := Image2.ClientRect;
  DrawTextW(Image2.Canvas.Handle, PWideChar(ls_Text), -1, lrc_Rect, DT_NOPREFIX);

  Image3.Canvas.FillRect(Image3.ClientRect);
  ExtTextOutW(Image3.Canvas.Handle, 0, 0, 0, @lrc_Rect, PWideChar(ls_Text), Length(ls_Text), nil);
end;

ハングルだけの文字列を出力した場合TextOutWとExtTextOutWは文字化けします。
DrawTextWはちゃんと表示します。
ただしFontのNameが'MS UI Gothic'の場合はどれもちゃんと表示されます。
反対に'MS Pゴシック'の場合はどれも文字化けします。
さらにフォントのCharsetプロパティに以下の四つを指定するとどれもちゃんと表示されます。

CHINESEBIG5_CHARSET
GB2312_CHARSET
HANGEUL_CHARSET
THAI_CHARSET

またハングルにひらがなや漢字などが混じるとどれもちゃんと表示されます。
半角アルファベットや半角数字・記号などが混じっただけでは文字化けは直りません。
#13などの制御文字が混じるとちゃんと表示されます。

ややこしいです。
なので文字列の出力にはDrawTextW推奨。