喫茶XRAYトップページ

[スレッド全体
]

[2148] 左右反転文字列の描画返信 削除
2009/2/13 (金) 20:51:42 Mr.XRAY
> 大変遅くなりましたが,こんな方法はどうでしょう.
> メタファイルで描画するやり方です.


おおっと,コードを示していませんでした.
[170_MetaFile描画でImageサイズ調整]
http://mrxray.on.coocan.jp/Delphi/plSamples/170_ImageMetaFile.htm
を利用したものです.
私のWindows XP(SP3)で文字幅が正常に表示しませんので,今回修正しました.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  plPrev, StdCtrls, plSetPrinter,ExtCtrls,Printers;

type
  TForm1 = class(TForm)
    Button1: TButton;
    plPrev1: TplPrev;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure InverseString(Text : String; AFont: TFont);
    procedure AdjustFont(Canvas : TCanvas);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//====================================================================
//  先読み方式のコード
//  反転文字のテスト1
//
//  TPrinerによる印刷同様,BeginDoc〜EndDocメソッドを使用する.
//  (必要に応じてNewPageメソッドを使用)
//  印刷(描画)コードは本コンポーネントのCanvasを使用する.
//====================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
     APos  : TPoint;
     AFont : TFont;
begin
     plPrev1.plSetPrinter.Orientation:=poLandscape;
     plPrev1.BeginDoc;
     try
       plPrev1.Canvas.Font.Height:=100;
       plPrev1.Canvas.Pen.Width:=5;
       plPrev1.Line(200,1000,600,600);
       plPrev1.TextOutRT(1000,600,'喫茶XRAY');

       //反転文字の描画
       AFont := TFont.Create;
       try
         AFont.Assign(plPrev1.Canvas.Font);
         AFont.Color := clGreen;
         InverseString('左右反転文字',AFont);
       finally
         FreeAndNil(AFont);
       end;
     finally
       plPrev1.EndDoc;
     end;
     plPrev1.ShowModal;
end;
//=============================================================================
//  反転文字作成メソッド
//  メタファイルに描画して,それを印刷プレビュー制御コンポーネントのCanvasに
//  描画する
//============================================================================
procedure TForm1.InverseString(Text: String; AFont: TFont);
var
    AMetaFile : TMetafile;
    ACanvas   : TMetaFileCanvas;
    AWidth    : Integer;
    AHeight   : Integer;
    ARect     : TRect;
begin
    AMetaFile      := TMetafile.Create;
    AMetaFile.Inch := 0;

    try
      ACanvas:=TMetafileCanvas.Create(AMetaFile,0);
      try
        //メタファイルに必要なサイズを求める
        ACanvas.Font.Assign(AFont);
        AWidth :=ACanvas.TextWidth(Text);
        AHeight:=ACanvas.TextHeight(Text);
        //一旦描画を終了してメタファイルのサイズを設定
        ACanvas.Free;
        AMetaFile.Width :=AWidth;
        AMetaFile.Height:=AHeight;
        //メタファイルCanvasを再生成
        ACanvas  :=TMetafileCanvas.Create(AMetaFile,0);
        ACanvas.Font.Assign(AFont);
        //フォントを正しく設定
        AdjustFont(ACanvas);

        ACanvas.Brush.Style:=bsClear;
        ACanvas.TextOut(0,0,Text);
      finally
        ACanvas.Free;
      end;
      //ARect.Left   := 200;
      //ARect.Right  := 2200;
      //左右を反転させるために右と左の座標を入替える
      ARect.Left   := 2200;
      ARect.Right  := 200;
      ARect.Top    := 800;
      ARect.Bottom := 1500;
      plPrev1.StretchDrawMetaFile(ARect,AMetaFile);
    finally
      AMetaFile.Free;
    end;
end;
//=============================================================================
//  フォントの縦横サイズが正確に取得できない現象の回避関数
//  フォント幅が0の時に文字幅を設定する
//  中村拓男著「Delphi Graphic Secrets」P141のコードそのまま
//============================================================================
procedure TForm1.AdjustFont(Canvas: TCanvas);
var
    tm : TTextMetric;
    lf : TLogFont;
begin
    GetObject(Canvas.Font.Handle, SizeOf(lf), @lf);
    if lf.lfWidth=0 then begin
      GetTextMetrics(Canvas.Handle, tm);
      lf.lfWidth := -lf.lfHeight * tm.tmAveCharWidth div tm.tmHeight;
      Canvas.Font.Handle := CreateFontIndirect(lf);
    end;
end;

end.


[2149] コントロール移動リサイズ返信 削除
2009/2/14 (土) 14:31:01 Mr.XRAY
このメタファイルを使用したコードで思い出しました.
コントロール移動リサイズコンポーネントにも,文字サイズ可能なテストを
追加しようと思い立ち開いたら.

もう数年前に修正版を作成していたんです.
Delphiの新しいバージョンでテストしようとしてそのままでした(苦笑).
動作が少しはよくなっているハズです.
今日の日付でUPしました.今現在マニュアル修正中です.

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82