C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 印刷時の余白設定について


(過去ログ 83 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■48989 / inTopicNo.1)  印刷時の余白設定について
  
□投稿者/ アイアムレジェンド (1回)-(2010/04/20(Tue) 03:05:28)

分類:[.NET 全般] 

VS2005で印刷をプログラムしていますが質問です

みなさんは印刷をプログラムするときに余白の設定はどのようにされていますか

・プリンタ設定ダイアログの余白設定はバグがあるとかで使えないようです
・e.Graphics.VisibleClipBounds ←今はこれで印刷可能範囲を取得しています
・e.PageBounds ←これで全体を取得するとはみ出します
・e.MarginBounds ←これを使うと微妙にずれます

ということで自作で余白を取得する関数を使っていました(下記参照)
ところが、高精細印刷の場合にはどうもMarginBoundsが機能しないようです
余白なしに印刷が実行されてしまいます

MarginBoundsを使わずに余白をそのまま数値指定したら希望の動作はできますが、
今まではMarginBoundsを使ったほうが動作が安定すると考えて使っていました
こうなったら「MarginBoundsやMarginって何よ?」と思ってしまいます。
ひょっとしたら、みなさんも直接余白指定して印刷しているのでしょうか



■参考■
Private Function 自作マージン(ByVal e As System.Drawing.Printing.PrintPageEventArgs) As Rectangle
Dim 調整代 As Integer = (e.PageBounds.Width - e.Graphics.VisibleClipBounds.Width) / 2
自作マージン = New Rectangle(e.MarginBounds.X - 調整代, e.MarginBounds.Y - 調整代, e.MarginBounds.Width, e.MarginBounds.Height)
End Function
引用返信 編集キー/
■48990 / inTopicNo.2)  Re[1]: 印刷時の余白設定について
□投稿者/ 中博俊 (1391回)-(2010/04/20(Tue) 08:44:26)
http://blogs.wankuma.com/naka/archive/2010/04/20/188184.aspx

面倒なので全部張っておきました。

利用は以下の感じ

		/// <summary>
		/// プリンタのマージンを取得します。
		/// 用紙の縦モードで取得です。
		/// </summary>
		/// <param name="PrinterName"></param>
		/// <param name="PageBounds">ページバウンズ</param>
		/// <returns>取得したマージン</returns>
		public static Rectangle MarginBounds( string PrinterName, Rectangle PageBounds )
		{
			//PrinterNameがnullや""だと例外
			if ( PrinterName == null || PrinterName == "" )
			{
				throw new ArgumentNullException("PrinterName");
			}


			//デバイスキャップラッパオブジェクトを作成
			using ( GetDeviceCapsWrapper devicecaps = new GetDeviceCapsWrapper() )
			{
				//各マージンは.NetFrameworkのデフォルトと同じ1inchとする
				int TopMargin = 100;
				int LeftMargin = 100;
				int RightMargin = 100;
				int BottomMargin = 100;

				if ( devicecaps.Init(PrinterName) == true )
				{

					int XRes = devicecaps.GetData(GetDeviceCapsWrapper.CommandIndex.LOGPIXELSX);
					int YRes = devicecaps.GetData(GetDeviceCapsWrapper.CommandIndex.LOGPIXELSY);

					LeftMargin = (int)((float)devicecaps.GetData(GetDeviceCapsWrapper.CommandIndex.PHYSICALOFFSETX) / (float)XRes * 100.0);
					TopMargin = (int)((float)devicecaps.GetData(GetDeviceCapsWrapper.CommandIndex.PHYSICALOFFSETY) / (float)YRes * 100.0);
					int Width = (int)((float)devicecaps.GetData(GetDeviceCapsWrapper.CommandIndex.PHYSICALWIDTH) / (float)XRes * 100.0);
					int Height = (int)((float)devicecaps.GetData(GetDeviceCapsWrapper.CommandIndex.PHYSICALHEIGHT) / (float)YRes * 100.0);

					int HorzRes = (int)((float)devicecaps.GetData(GetDeviceCapsWrapper.CommandIndex.HORZRES) / (float)XRes * 100.0);
					int VertRes = (int)((float)devicecaps.GetData(GetDeviceCapsWrapper.CommandIndex.VERTRES) / (float)YRes * 100.0);

					RightMargin = Width - HorzRes - LeftMargin;
					BottomMargin = Height - VertRes - TopMargin;

				}
				if ( PageBounds.Width > PageBounds.Height )
				{
					//返却用構造体の作成
					return new Rectangle(TopMargin, LeftMargin, PageBounds.Width - TopMargin - BottomMargin, PageBounds.Height - LeftMargin - RightMargin);
				}
				else
				{
					//返却用構造体の作成
					return new Rectangle(LeftMargin, TopMargin, PageBounds.Width - LeftMargin - RightMargin, PageBounds.Height - TopMargin - BottomMargin);
				}
				
			}
		}

引用返信 編集キー/
■49181 / inTopicNo.3)  Re[2]: 印刷時の余白設定について
□投稿者/ アイアムレジェンド (2回)-(2010/04/26(Mon) 00:45:09)
素敵なコードを教えていただきありがとうございました
vb.netに変換してなんとなく理解できました

結局のところ、marginというのは使われていないのでしょうね



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -