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

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

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

Re[10]: DrawString で センタリング したい。


(過去ログ 111 を表示中)

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

■65678 / inTopicNo.1)  DrawString で センタリング したい。
  
□投稿者/ ひろ (17回)-(2013/03/14(Thu) 09:11:05)

分類:[C#] 

2013/03/14(Thu) 09:12:02 編集(投稿者)

下記のようにしていますが、A4用紙の中央より右にずれてしまいます。

// フォントオブジェクトの生成.
StringFormat strFmt = new StringFormat();
strFmt.Alignment = StringAlignment.Center; // X軸中央揃え.
strFmt.LineAlignment = StringAlignment.Center; // Y軸中央揃え.

string strPage = "xxx/xxx";

float xpos = e.PageBounds.Width / 2.0f;
float ypos = e.MarginBounds.Height;

e.Graphics.DrawString(strPage, fnt, Brushes.Black, xpos, ypos, strFmt);


e.PageBounds.Widthでは、A4サイズである 827 が取れているのは確認できたのですが…
何がいけないのでしょうか。
引用返信 編集キー/
■65686 / inTopicNo.2)  Re[1]: DrawString で センタリング したい。
□投稿者/ shu (226回)-(2013/03/14(Thu) 11:03:02)
2013/03/14(Thu) 11:05:39 編集(投稿者)
No65678 (ひろ さん) に返信
> 2013/03/14(Thu) 09:12:02 編集(投稿者)
>
> 下記のようにしていますが、A4用紙の中央より右にずれてしまいます。
>
> // フォントオブジェクトの生成.
> StringFormat strFmt = new StringFormat();
> strFmt.Alignment = StringAlignment.Center; // X軸中央揃え.
> strFmt.LineAlignment = StringAlignment.Center; // Y軸中央揃え.
>
> string strPage = "xxx/xxx";
>
> float xpos = e.PageBounds.Width / 2.0f;
StringFormatで中央を指定しているので2で割る必要はないです。
左上だけでなく描画する領域の幅と高さも渡すDrawstringを使用
するとよいです。
引用返信 編集キー/
■65687 / inTopicNo.3)  Re[2]: DrawString で センタリング したい。
□投稿者/ ひろ (18回)-(2013/03/14(Thu) 11:10:29)
No65686 (shu さん) に返信

>>float xpos = e.PageBounds.Width / 2.0f;
> StringFormatで中央を指定しているので2で割る必要はないです。

では、xposにはどんな値を設定するのが正しいのでしょうか。

0 だと左端の方によってしまいますし、e.PageBounds.Width だと見えなくなります。
引用返信 編集キー/
■65688 / inTopicNo.4)  Re[3]: DrawString で センタリング したい。
□投稿者/ howling (236回)-(2013/03/14(Thu) 11:25:49)
No65687 (ひろ さん) に返信
> 0 だと左端の方によってしまいますし、e.PageBounds.Width だと見えなくなります。

…?それはおかしいですね。
http://msdn.microsoft.com/en-us/library/332kzs7c.aspx
これ見る限り、RectAngleで指定すれば、少なくともうまくいきそうですが。
(0,0,e.PageBounds.Width,e.PageBounds.Height)
つまり、e.PageBoundsを第3引数にそのまま渡してあげれば良いと思いますが…?
引用返信 編集キー/
■65690 / inTopicNo.5)  Re[4]: DrawString で センタリング したい。
□投稿者/ ひろ (19回)-(2013/03/14(Thu) 11:42:14)
StringFormat strFmt = new StringFormat();
strFmt.Alignment = StringAlignment.Center; // X軸中央揃え.
Rectangle rectangle = new Rectangle(0, 0, e.PageBounds.Width, e.PageBounds.Height);
e.Graphics.DrawString(strPage, fnt, Brushes.Black, rectangle, strFmt);

上記を試してみたのですが、やはり中央より 1.5cm ほど右側に描画されてしまいました。
引用返信 編集キー/
■65692 / inTopicNo.6)  Re[5]: DrawString で センタリング したい。
□投稿者/ howling (237回)-(2013/03/14(Thu) 11:50:24)
No65690 (ひろ さん) に返信
> StringFormat strFmt = new StringFormat();
> strFmt.Alignment = StringAlignment.Center; // X軸中央揃え.
> Rectangle rectangle = new Rectangle(0, 0, e.PageBounds.Width, e.PageBounds.Height);
> e.Graphics.DrawString(strPage, fnt, Brushes.Black, rectangle, strFmt);
>
> 上記を試してみたのですが、やはり中央より 1.5cm ほど右側に描画されてしまいました。

ふーむ。念のため。
e.Graphics.DrawString(strPage, fnt, Brushes.Black, e.PageBounds, strFmt);
でも右側にズレることを確認して頂いても良いですか?

あと、気になったスレがこれ。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=48989&KLOG=83
余白設定とかが(バグが元からあって)おかしいのかもしんないですね。
引用返信 編集キー/
■65693 / inTopicNo.7)  Re[6]: DrawString で センタリング したい。
□投稿者/ howling (238回)-(2013/03/14(Thu) 11:53:21)
> あと、気になったスレがこれ。
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=48989&KLOG=83
> 余白設定とかが(バグが元からあって)おかしいのかもしんないですね。

これもか…というか今回と現象は一緒ですね。
古いですけど。
そういえば、環境書いてませんが、どんな環境ですか?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25964&forum=7&start=8
引用返信 編集キー/
■65694 / inTopicNo.8)  Re[7]: DrawString で センタリング したい。
□投稿者/ ひろ (20回)-(2013/03/14(Thu) 12:04:41)
No65693 (howling さん) に返信
>>あと、気になったスレがこれ。
>>http://bbs.wankuma.com/index.cgi?mode=al2&namber=48989&KLOG=83
>>余白設定とかが(バグが元からあって)おかしいのかもしんないですね。
>
> これもか…というか今回と現象は一緒ですね。
> 古いですけど。
> そういえば、環境書いてませんが、どんな環境ですか?
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25964&forum=7&start=8


開発環境はVS2008、OSはXPです。

確かに、余白設定等いろいろしているので、その影響かもしれません。
だめそうなら、座標決め打ちで出すか検討中です ><
引用返信 編集キー/
■65695 / inTopicNo.9)  Re[8]: DrawString で センタリング したい。
□投稿者/ howling (239回)-(2013/03/14(Thu) 12:34:05)
2013/03/14(Thu) 12:42:21 編集(投稿者)

No65694 (ひろ さん) に返信
うーん、送ったURLの内容が長かったので、わかりづらかったかもしれませんが…

//どうやらPrintDocumentのバグ(または仕様?)のように思えます。
//PrintDocumentはプリンターの場合OriginAtMargins=trueでないと正常に機能しないようです。
//一方、プレビュー画面では、マージンを無視してしまうようです。

という事が書いてあるので、この値によって変化させる感じかなと。

同様の回避方法がこちらにも記載されています。ただし、環境はC# VS2005のようですね。
前に送ったURLがVS2003のようですので、VS2005でも直っていなかった。ということは2008でもダメかも…

http://www.geocities.jp/gakaibon/tips/csharp2005/prtintpreview.html

このURLにも記載がある通り、
・プレビューは正しいけれども余白(実際に印刷時)はおかしい(OriginAtMargins=false)
・余白(実際に印刷時)は正しいけれどもプレビューはおかしい(OriginAtMargins=true)
の区分けを行っているようですね。

(ここだけ編集で追加しました)
ということは、実際に印刷してみるとうまくいかないけれども、プレビューだけ正しいかもしれません。
面倒ですが、実際に印刷/プレビューを見るだけの両方でテストする必要がありそうですね。
現状では、プレビューは正しそうだけれども、印刷はおかしいイメージでいますが、これは合っていますか?

…そもそも、どのように印刷自体を行っているのか書かれていないのでわかりませんが、
PrintDocumentで印刷している前提で書いています。違っていたらもう無理くりなのかなぁ(遠い目



引用返信 編集キー/
■65696 / inTopicNo.10)  Re[8]: DrawString で センタリング したい。
□投稿者/ shu (227回)-(2013/03/14(Thu) 12:53:52)
No65694 (ひろ さん) に返信

RectangleはintなのでRectangleFを使用したほうが正確です。

紙を基準に15mmの差とかを考えても仕方がないです。その差は
最近のスレでも回答しましたが調整機能により補正するようにした方が
よいと思います。基準点からの相対的な位置さえしっかりしておけば
よいのです。
引用返信 編集キー/
■65699 / inTopicNo.11)  Re[9]: DrawString で センタリング したい。
□投稿者/ shu (228回)-(2013/03/14(Thu) 13:33:51)
No65696 (shu さん) に返信
> ■No65694 (ひろ さん) に返信
>
> RectangleはintなのでRectangleFを使用したほうが正確です。
>
今回のケースでは必要なさそうですね。
引用返信 編集キー/
■65732 / inTopicNo.12)  Re[10]: DrawString で センタリング したい。
□投稿者/ ひろ (21回)-(2013/03/15(Fri) 12:05:03)
原因がわかりました。

float xpos = e.PageBounds.Width / 2.0f;

は、用紙幅の真ん中なのに対し、

e.Graphics.DrawString(strPage, FONT_KAHEN_9, Brushes.Black, xpos, ypos, strFmt);

の0,0起点が印刷可能領域の左上となっていました。

そこで、xpos から左余白分を差し引くことで、センタリングできました。

ありがとうございました!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -