喫茶XRAYトップページ

[スレッド全体
]

[2208] Re:90度回転メタフィル文字返信 削除
2009/3/3 (火) 23:10:56 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> > 回転できれば、右90度や左90度にも対応できるので...。
>
> これは印刷プレビューのCanas直接ではなく,
> 今やったメタファイルに描画するということでしょうか.
> どちらにしても同じような方法でできると思うのですが.


「メタファイル」に対しての方が良いような...?

「同じような方法」について教えて頂けないでしょうか?



[2209] Re2:90度回転メタフィル文字返信 削除
2009/3/4 (水) 00:47:04 Mr.XRAY
▼ KSCさん

> 「同じような方法」について教えて頂けないでしょうか?

印刷プレビューコンポのソースにもありますが,
とりあえず以下を参考にしてください.後で時間がとれたら
具体的なことはやってみます.

http://mrxray.on.coocan.jp/Halbow/Notes/N003.html#List2

[2210] Re3:90度回転メタフィル文字返信 削除
2009/3/4 (水) 02:04:12 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> > 「同じような方法」について教えて頂けないでしょうか?
>
> 印刷プレビューコンポのソースにもありますが,
> とりあえず以下を参考にしてください.後で時間がとれたら
> 具体的なことはやってみます.
>
> http://mrxray.on.coocan.jp/Halbow/Notes/N003.html#List2


回答を有難うございます。

上記のページを参照して、下記のようにソースに
TLogFontの部分を挿入したのですが、

RightRotateが、
 「0」なら今までに教えて頂いた反転文字(180度)
 「1」なら右90度
 「上記以外の数値(とりあえずー1)」なら左90度

procedure TCustomplPrev.InverseString(X1, Y1, X2, Y2, RightRotate: Integer; Text: String; AFont: TFont);
var
    AMetaFile : TMetafile;
    ACanvas   : TMetaFileCanvas;
    AWidth    : Integer;
    AHeight   : Integer;
    LF        : TLogFont;
begin

    AMetaFile      := TMetafile.Create;
    AMetaFile.Inch := 0;

    try
      ACanvas  := TMetafileCanvas.Create(AMetaFile,0);
      try
        //メタファイルに必要なサイズを求める
        ACanvas.Font.Assign(AFont);
        //フォントを正しく設定
        AdjustFont(ACanvas);
        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;

        if RightRotate <> 0 then begin
          GetObject(ACanvas.Font.Handle, SizeOf( LF ), @LF);
          if RightRotate = 1 then LF.lfEscapement := 2700 else LF.lfEscapement := 900;
          ACanvas.Font.Handle := CreateFontIndirect( LF );
        end;

        ACanvas.TextOut(0,0,Text);
      finally
        ACanvas.Free;
      end;

      StretchDrawMetaFile(Rect(X1,Y1,X2,Y2),AMetaFile);
    finally
      AMetaFile.Free;
    end;
end;

確かに右90度及び左90度を再現できましたが、AMetaFileの縦横サイズの値が
角度「0」の時の文字の縦横サイズなので、うまくいきませんでした。(当然か...)


あと、もう少しかな...?

[2211] Re4:90度回転メタフィル文字返信 削除
2009/3/4 (水) 16:14:01 Mr.XRAY
▼ KSCさん

むむむっ.

> あと、もう少しかな...?

回転した文字のミラー文字は難しいですね.
画像というより,数学的なものでしょうか.座標の変換が必要ですね.
でも面白いかな?
Junkiさんのところに参考となるのがあったかも(ガセネタ?)


[2212] Re5:90度回転メタフィル文字返信 削除
2009/3/4 (水) 17:02:42 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> むむむっ.
>
> > あと、もう少しかな...?
>
> 回転した文字のミラー文字は難しいですね.
> 画像というより,数学的なものでしょうか.座標の変換が必要ですね.
> でも面白いかな?
> Junkiさんのところに参考となるのがあったかも(ガセネタ?)


#2211の実行結果は、StretchDrawMetaFileを実施せず、ただ回転させただけですよね?
それともStretchDrawMetaFile実施後? ... なら ... 成功したと言う事ですか?

それと「Junkiさんのところって」どこですか?

[2213] Re6:90度回転メタフィル文字返信 削除
2009/3/4 (水) 18:08:20 Mr.XRAY
▼ KSCさん

> それともStretchDrawMetaFile実施後?

当然実行前です.
回転した文字列をStretchDrawrするわけですから.
KSCさんのコードで,引数を角度に変更してみました.

//====================================================================
//  先読み方式のコード
//  ミラー文字列(反転文字列)のテスト1
//
//  TPrinerによる印刷同様,BeginDoc〜EndDocメソッドを使用する
//  動作確認
//  Windows XP(SP3) + Delphi7 Pro
//  Windows Vista + Delphi2007-R2 Pro
//====================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
     AFont : TFont;
     X1    : Integer;
     X2    : Integer;
     Y1    : Integer;
     Y2    : Integer;
     L     : Integer;
     TestText : String;
     H : Integer;
     R  : Integer;
begin
     TestText := 'テスト';

     plPrev1.plSetPrinter.Orientation:=poLandscape;
     plPrev1.BeginDoc;
     try
       AFont := TFont.Create;
       H := 200;
       try
         X1 := 1000;
         Y1 := 800;
         Y2 := Y1+H;

         //通常の文字の描画
         plPrev1.Canvas.Font.Height := Y2-Y1;
         plPrev1.TextOut(X1,Y1,TestText);
         //文字列の長さを求める
         L  := plPrev1.Canvas.TextWidth(TestText);
         X2 := X1+L;
         //文字列を囲む枠を描画
         plPrev1.Rectangle(X1,X2,Y1,Y2);

         //反転文字の描画
         AFont.Assign(plPrev1.Canvas.Font);
         AFont.Color := clGreen;
         plPrev1.Canvas.Pen.Color := clRed;
         //左右反転ミラーの指定
         if CheckBox1.Checked then SwapIntValue(X1,X2);
         //上下反転ミラーの指定
         if CheckBox2.Checked then SwapIntValue(Y1,Y2);
         R := 90;
         InverseString(X1,Y1,X2,Y2,R,TestText,AFont);
         //文字列を囲む枠を描画
         plPrev1.Canvas.Rectangle(Rect(X1,Y1,X2,Y2));
       finally
         FreeAndNil(AFont);
       end;
     finally
       plPrev1.EndDoc;
     end;
     plPrev1.ShowModal;
end;
//=============================================================================
//  引数で指定する文字列をメタファイルに描画して,
//  それを印刷プレビュー制御コンポーネントのCanvasに描画する関数
//============================================================================
procedure TForm1.InverseString(X1, Y1, X2, Y2, RightRotate: Integer; Text:
  String; AFont: TFont);
var
    AMetaFile : TMetafile;
    ACanvas   : TMetaFileCanvas;
    AWidth    : Integer;
    AHeight   : Integer;
    LF        : TLogFont;
begin

    AMetaFile      := TMetafile.Create;
    AMetaFile.Inch := 0;

    try
      ACanvas  := TMetafileCanvas.Create(AMetaFile,0);
      try
        //メタファイルに必要なサイズを求める
        ACanvas.Font.Assign(AFont);
        //フォントを正しく設定
        AdjustFont(ACanvas);


        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;

        //回転文字を作成(RightRotateはこの関数の引数で,単位は度
        GetObject(ACanvas.Font.Handle, SizeOf( LF ), @LF);
        LF.lfEscapement := RightRotate*10;
        ACanvas.Font.Handle := CreateFontIndirect( LF );

        ACanvas.TextOut(0,0,Text);
      finally
        ACanvas.Free;
      end;

      plPrev1.StretchDrawMetaFile(Rect(X1,Y1,X2,Y2),AMetaFile);
    finally
      AMetaFile.Free;
    end;
end;
//=============================================================================
//  フォントの縦横サイズが正確に取得できない現象の回避関数
//  フォント幅が0の時に文字幅を設定する
//  中村拓男著「Delphi Graphic Secrets」P141のコードそのまま
//============================================================================
procedure TForm1.AdjustFont(Canvas: TCanvas);
var
    tm : TTextMetric;
    lf : TLogFont;
begin
    Windows.GetObject(Canvas.Font.Handle, SizeOf(lf), @lf);
    if lf.lfWidth=0 then begin
      GetTextMetrics(Canvas.Handle, tm);
      lf.lfWidth := - Trunc(lf.lfHeight * tm.tmAveCharWidth/tm.tmHeight);
      Canvas.Font.Handle := CreateFontIndirect(lf);
    end;
end;
//=============================================================================
//  変数の交換(入替え)関数
//=============================================================================
procedure TForm1.SwapIntValue(var A, B: Integer);
var
    Temp : Integer;
begin
    Temp := A;
    A := B;
    B := Temp;
end;

end.

> それと「Junkiさんのところって」どこですか?

junkiさんは,GDI+を含めた画像処理のシンプルなコードを提供
して下さっています.参考になりまよ.
当サイトのリンクのページで[めもニャンだむ]を探してください.

http://blog.livedoor.jp/junki560/
Delphiのサンプルは,このページの右上の[Delphi]をクリックです

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