- PR -

C# 印刷位置の指定方法(DrawString)

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-05-15 13:35
PrintDocumentクラスを使って左上端を基準に下10mm、右10mmに文字列を描画します。
期待に反して"abc"を基準にした時の"def"の位置は下10mm、右10mmで無く
下36mm、右36mmに印刷されてしまいます。
縮尺の相違が生じた原因が分かりません。

単位の換算方法が誤っているのでしょうか?
あるいは、解像度の値が誤っているのでしょうか?
試みにg.DpiX,g.DpiYをPrinterResolution.X,PrinterResolution.Yに
置き換えてみましたが結果は同じでした。

// PrintDocumentクラスのPrintPageイベント内部の処理

PrintPageEventArgs e
....
Graphics g = e.Graphics;

// (x1,y1) = (0mm,0mm)
float x1 = 0f;
float y1 = 0f;
// (x2,y2) = (10mm,10mm)
float x2 = 10f;
float y2 = 10f;

// 単位の換算 mm → 画素数
PointF p1 = new PointF(x1 / 25.4 * g.DpiX , y1 / 25.4 * g.DpiY);
PointF p2 = new PointF(x2 / 25.4 * g.DpiX , y2 / 25.4 * g.DpiY);

g.DrawString("abc" , font , brush , p1);
g.DrawString("def" , font , brush , p2);
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-05-15 14:13
こんにちは。

引用:

ひろしさんの書き込み (2007-05-15 13:35) より:
PrintDocumentクラスを使って左上端を基準に下10mm、右10mmに文字列を描画します。
期待に反して"abc"を基準にした時の"def"の位置は下10mm、右10mmで無く
下36mm、右36mmに印刷されてしまいます。



余白1インチ(25.4mm) + 10mm
なんてことはないんですよね?

念のため、下0mm、右0mmに印字した結果がどうなるか知りたいです。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-05-15 14:30
こんにちは。

引用:

Tdnr_Symさんの書き込み (2007-05-15 14:13) より:
念のため、下0mm、右0mmに印字した結果がどうなるか知りたいです。



"abc"が下0mm、右0mmなんですね。
よく読んでませんでした。ごめんなさい。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-05-15 15:41
こんにちは。

私の環境で試してみたところ、
どうもデフォルトではスケール(マップモード)が0.01インチ単位になってますね。

縦・横10mmずらすには、下記のようなコードでできました。

コード:
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{

	Graphics g = e.Graphics; 

	// (x1,y1) = (0mm,0mm) 
	float x1 = 0f; 
	float y1 = 0f; 
	// (x2,y2) = (10mm,10mm) 
	float x2 = 10f; 
	float y2 = 10f; 

	Font font = new Font("MS 明朝", 10);

	// スケール変換ファクター
	float fact = 100f / 25.4f;

	// 単位の換算 mm → 画素数 
	PointF p1 = new PointF(x1 * fact, y1 * fact); 
	PointF p2 = new PointF(x2 * fact, y2 * fact); 

	g.DrawString("abc" , font , Brushes.Black , p1); 
	g.DrawString("def" , font , Brushes.Black , p2);

}

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-05-15 16:00
計算不要

ヒント
pageunit
_________________
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-05-15 16:48
ご回答ありがとうございます。GraphicsUnitで問題が解決できました。

例えば、
g.PageUnit = GraphicsUnit.Millimeter;
と設定することで、PointFがミリ単位として解釈されるようになりました。
1

スキルアップ/キャリアアップ(JOB@IT)