名前 題名 ▼ 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]をクリックです GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link