▼ 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]をクリックです
|