• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PrintDocumentでうまく印字ができません)

PrintDocumentでうまく印字ができません

このQ&Aのポイント
  • VB2008を使ってPrintDocumentを使って画面を伝票に出力しようとしています。
  • 「DrawString」は引数で指定する開始位置から左詰めで印字するのですが、数量,単価,金額は右詰めで印刷しないとならないわけです。
  • 右詰めで印字する方法を教えてください。もしできないとしたら、どんな方法があるでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

MeasureString()メソッドで印刷時のサイズを取得して、そのサイズでDrawString()の位置を補正します。 MeasureString()の使用例です。 ' Set up string. Dim measureString As String = "Measure String" Dim stringFont As New Font("Arial", 16) ' Measure string. Dim stringSize As New SizeF stringSize = e.Graphics.MeasureString(measureString, stringFont) ' Draw rectangle representing size of string. e.Graphics.DrawRectangle(New Pen(Color.Red, 1), 0.0F, 0.0F, stringSize.Width, stringSize.Height) ' Draw string to screen. e.Graphics.DrawString(measureString, stringFont, Brushes.Black, New PointF(0, 0))

panasobi
質問者

お礼

自己解決できました。 ご回答ありがとうございました。 StringFormatのAlignmentプロパティで「右詰め」フォーマットを設定する ことで、解決できました。 Dim drawFormat As New StringFormat drawFormat.Alignment = StringAlignment.Far e.Graphics.DrawString(tbKingakuArray(i).Text, f1, Brushes.Black, 300, 150 + 20 * i,drawFormat) いろいろありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

表示領域の終わりを示さないと、右揃えはできないはず。 まずドキュメントを読み、次にドキュメントを読み、さらにドキュメントを読んで、コードを書いて画像を出力してみた。 http://msdn.microsoft.com/en-us/library/21kdfbzs.aspx 以下のURIにコードと、画像の結果を置く。 http://cid-b89cb784f5346675.office.live.com/browse.aspx/TestCase/Q5986259?uc=3

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Visual Studio .NET 2003:右揃え印刷の設定(その2)

    フォーム上に表示されている各項目を印刷したいのですが、左揃えの文字は普通に座標指定するだけで問題ないのですが、桁数の違う数字を右揃えで統一して印刷したい場合の方法を教えていただきたく、よろしくお願いいたします。 以前、上記の内容の質問をさせていただきましたところ、String.Formatを使えばよいとのご回答をいただきました。いろいろと調べてみたのですが、実際にどのようにコードに記述すればよいのかがわからずにおります。現在、フォーム上の項目のうち、数値が入力されている項目を印刷するためのコードを次のように記述しています。 '数値の印刷位置 e.Graphics.DrawString(Suuchi1.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 100) e.Graphics.DrawString(Suuchi2.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 150) e.Graphics.DrawString(Suuchi3.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 200) e.Graphics.DrawString(Suuchi4.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 250) e.Graphics.DrawString(Suuchi5.Text, New Font("MS ゴシック", 12), New SolidBrush(Color.Black), 380, 300) 'ここまで これらの数値を右揃えで印刷したい場合、どのようにコードを記述したらよいのか、アドバイスを願います。上記のコードよりももっとスマートなコード記述で、私が望んでいる様な印刷結果を実現できるようでしたら、ご教授のほどよろしくお願いいたします。

  • 【VB2008】 .MouseEnter時にe.Graphics.DrawString~をする方法

     今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  ボタンの文字を見やすくするため影付き文字にいたしておりますが (下のコード1になります),このボタンにMouseEnterした際に, クリックできることが分かりやすいよう影の色を変えようと思ったのですが やり方が見つけられません...  <コード1>  Private Sub Button1_Paint(ByVal sender As   Object, ByVal e As System.Windows.Forms.PaintEventArgs) _   Handles Button1.Paint     e.Graphics.DrawString("TEST", _     New Font("MS Pゴシック", 10), Brushes.Black, 81, 11)     e.Graphics.DrawString("TEST", _     New Font("MS Pゴシック", 10), Brushes.Red, 80, 10) End Sub  <トライしたコード>  Private Sub Button1_MouseEnter(ByVal sender As   Object, ByVal e As System.EventArgs) _   Handles Button1.MouseEnter     e.Graphics.DrawString("Test", _     New Font("MS Pゴシック", 10), Brushes.White, 81, 11)     e.Graphics.DrawString("Test", _     New Font("MS Pゴシック", 10), Brushes.Red, 80, 10)  End Sub  エラー「'Graphics'は'System.EventArgs'のメンバではありません」と なるのは当然だと思うのでございますが,引数「e As ~」を書き直すなどいたしましても 通りませんorz  別の方法で「.Paint時に描いた文字色はそのままで,.MouseEnter時に .ForeColorを変えれば...」などと考えましたが,ButtonのTextが .Paintで描いた文字より上にくるのでうまくできませんでした...  もしとんちんかんなご質問でしたら申し訳ございません.何かよさそうな 方法がございましたらご紹介いただけないでしょうか.  もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたく お願い申し上げます.

  • VB2010DataGridView複数ページ印刷

    VB2010のDataGridViewで複数ページの印刷を試みています。 改ページに悩んでいます。「e.HasMorePages=True」で改ページは可能ですが、1ページ目も2ページ目も同じ内容が印刷されます。 1ページに30行を印刷する予定ですので、2ページ目には31行目から印刷をしたいのです。 現在、いろいろ参考にしまして、コーディングは進んでいますが、30行の指定がページ目いっぱいまで印刷される点と、2ページ目以降の印刷ができない点に悩んでいます。 書き上げたコードを記述しますので、ご存知の方が居られましたら、ご教授ください。 Dim reader As IO.StreamReader Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click PrintPreviewDialog1.ShowDialog() PrintPreviewDialog1.Document = PrintDocument1 'file() ' 印刷処理を実行 'PrintDocument1.Print() 'PrintForm1.Print(Me, PowerPacks.Printing.PrintForm.PrintOption.FullWindow) 'PrintDocumentオブジェクトの作成 Dim pd As New System.Drawing.Printing.PrintDocument 'PrintPageイベントハンドラの追加 AddHandler pd.PrintPage, AddressOf pd_PrintPage 'PrintDialogクラスの作成 Dim pdlg As New PrintDialog 'PrintDocumentを指定 pdlg.Document = pd '印刷の選択ダイアログを表示する If pdlg.ShowDialog() = DialogResult.OK Then 'OKがクリックされた時は印刷する pd.Print() End If End Sub Dim page As Integer = 0 '現在のページ Private Const MaxLine As Integer = 30 '1ページ30行 Private Sub pd_PrintPage(ByVal sender As Object, _ ByVal e As System.Drawing.Printing.PrintPageEventArgs) page += 1 'グラフィックの定義 Dim g As Graphics = e.Graphics '総行数をallrowとする Dim allrow As Integer = DataGridView1.Rows.Count - 1 '文字列を描く 'g.DrawString(DataGridView1(0, 0).Value, _ ' New Font("MS Pゴシック", 9), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top) Dim X As Integer Dim Y As Integer Y = e.MarginBounds.Top For i As Integer = 0 To DataGridView1.Rows.Count - 1 X = e.MarginBounds.Left For j As Integer = 0 To DataGridView1.Columns.Count - 1 Dim s As String If DataGridView1(j, i).Value Is Nothing Then s = "" Else s = DataGridView1(j, i).Value End If g.DrawString(s, New Font("MS Pゴシック", 9), Brushes.Black, X, Y) 'g.DrawString(DataGridView1(j, i).Value.ToString, _ ' New Font("MS Pゴシック", 9), Brushes.Black, X, Y) X += DataGridView1.Columns(j).Width Next j Y += DataGridView1.Rows(i).Height Next i '現在のページが総ページ数より少ない場合は、次ページへ If page < (allrow \ MaxLine + 1) Then e.HasMorePages = True Else 'このページで終了 e.HasMorePages = False End If End Sub

  • C# フォームプログラミングで

    public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { //Graphics grfx = CreateGraphics(); } private void Form2_Paint(object sender, PaintEventArgs e) { Form2 form2; form2.Paint += new PaintEventHandler(PaintHandler1); } static void PaintHandler1(object objSender,PaintEventArgs e) { Graphics grfx = e.Graphics; grfx.DrawString("test",Font font,Brushes.Black,0,0);//←ここでエラー } } このように書くと「引数を2個指定できる、メソッド DrawString のオーバーロードはありません」 というエラーがでてフォームに文字を表示できません 最初に「空のプロジェクト」で作れば普通にDrawStringで文字を表示できるのですが 「Windowsフォーム」を選んでからだと表示できないのはなぜでしょうか? 何がいけないのでしょう。

  • VB2010 でのPictureboxのフォント指定

    VB2010 でのPictureboxのフォント指定 現在 Pictureboxのフォントをプログラムの先頭で定義しているのですが、 '------------------------------------------------------------------------- Dim fnt As New Font("MS ゴシック", 9) With PictureBox1 .Image = New Bitmap(.Size.Width, .Size.Height) g1 = Graphics.FromImage(.Image) g1.Clear(.BackColor) End With g1.DrawString("TEST" fnt, Brushes.Black, IX,IY) '------------------------------------------------------------------------- 下記のようにループ内で指定したいのですが、どう定義すればいいでしょうか。 For i=1 to 10 <------------------------ここでfont指定したい g1.DrawString("TEST" fnt, Brushes.Black, IX,IY) next

  • Viual C++ 2010 でエラー

    Visual C++ 2010で学習中の初心者です。 あるサイトにあったWindows Form用のサンプルプログラムを作ってビルドしようとしていますが、link error 1104 というのが出てうまくいきません。 フォーム上に三角関数の値を表示するという簡単なもので、最初にやった時にはできたのですが、表示の書式を少し変更してみたら、このエラーメッセージが出てきてどうしてもビルドできません。 参考にしているサイトは次のものです。 http://ishidate.my.coocan.jp/vcpp10_2/vcpp10_2.htm この中のForm1_Paint() 関数のコードをそのまま入力したのが以下のコードです。 private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { Graphics^ g = e->Graphics; String^ string1; double radian; g->DrawString(" angle sin cos ", Font,                       Brushes::Black,10,20); g->DrawString("------------------------------ ------", Font, Brushes::Black, 10,35); for(int angle=0; angle<=90; angle += 10) { radian = angle*Math::PI/180.0; string1 = String::Format(" {0,3} {1,7:F7} {2,7:F7} ", angle, Math::Sin(radian), Math::Cos(radian)); g->DrawString(string1, Font, Brushes::Black, 10, 50+angle*2); } }// end function 最初に成功したときのフォームの出力の画面写真を添付してあります。 やりたかったことは String::Format() 関数の{ }の中の数字を変えて表示を確認したかっただけなのですが、このエラーはどうすれば修正できるのか、ご存知の方、どうぞよろしく教えてください。

  • 関数 「単価×売上数量」

           B     C      D        E      F     G      商品名   単価   売上数量   割引金額  消費税  箱代 5   E列の「割引金額」は、「単価」が200より小さい場合、または「売上数量」が100以上の場合は「単価×売上数量」の10%引きで表示し、それ以外の場合は「単価×売上数量」で表示。   「割引金額」の出し方を教えてください。   よろしくお願いします。

  • エクセル ISERROR

    エクセルでISERROR関数を使い、エラー表示されないようにした2つ以上のセルを他のセルで更に計算すると#DIV/0!が表示されます。 例) B2 4月数量 C2 4月金額 D2 4月単価 =IF(ISERROR(C2/B2),"",C2/B2) E2 5月数量 F2 5月金額 G2 5月単価 =IF(ISERROR(F2/E2),"",F2/E2) 4~3月までのセルが続き、各単価の平均・伸長率などを他のセルで計算しようとすると#VALUE!が表示されます。 上記のようにISERROR関数を使った複数のセルを参照させ計算し、更にエラー表示させないようにするにはどのような方法がありますか。 どなたか教えてください。

  • C#でピクチャーボックスへの文字列描画について

    C#でピクチャーボックスへの文字列描画について DOBON.NETからコピペです //PictureBox1のGraphicsオブジェクトを取得 Graphics g = PictureBox1.CreateGraphics(); string drawString= @"智に働けば角が立つ。情に棹させば流される。 意地を通せば窮屈だ。とかくに人の世は住みにくい。"; //Fontを作成 Font fnt = new Font("MS ゴシック", 12); //文字列を表示する範囲を指定する RectangleF rect = new RectangleF(10, 10, 100, 200); //rectの四角を描く g.FillRectangle(Brushes.White, rect); //文字を書く g.DrawString(drawString, fnt, Brushes.Black, rect); //リソースを開放する fnt.Dispose(); g.Dispose(); 自分で使ってるピクチャーボックスは動的生成してるので picbox[i] という感じになってます この場合 初めの宣言の時は picbox = new System.Windows.Forms.PictureBox[pic_cnt]; for (i = 0; i < n) { picbox[i] = new System.Windows.Forms.PictureBox(); Graphics g = picbox[i].CreateGraphics(); <中略> } で大丈夫なのでしょうか? 文字列は描画されないし、エラーもでないので どこが間違っているのかわかりません… 説明不足のところがあれば書いてください あと、修復場所を指摘してくださればありがたいです

  • 自動入力項目に手入力もできるようにしたい。

    簡単に説明します。 次の表を作成しています。 品名 単価 数量 金額 ーーーーーーーーーーー 品名を入れると次の単価表から単価を表示し、数量を入れると金額を計算して表示します。このとき特定のD、Fについては、その都度単価を 手で入力したい。D、Fの単価表には9999と仮にいれてあります。  単価表 ーーーーー A  10 B 100 C1000 D9999 E   1 F9999