質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

390閲覧

.Net FrameWorkのPanelのみ印刷されるが、Panel上のコントロールが印刷されない

shinobuKouno

総合スコア31

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

1グッド

0クリップ

投稿2023/12/01 08:45

実現したいこと

Form内のコントロールをプリンターで印刷したい。

前提

次のコードでは印刷するとPanelのprintPanelが印刷(白い画面だけ)されるだけで
printPanelの上に設置したLabelやLabel内の文字が印刷されません。
printPanel内のコントロールまで印刷する方法をご指南願います。

発生している問題・エラーメッセージ

エラーメッセージは出ておりません。

該当のソースコード

C#

1 2using System; 3using System; 4using System.Collections.Generic; 5using System.ComponentModel; 6using System.Data; 7using System.Drawing; 8using System.Drawing.Text; 9using System.Linq; 10using System.Text; 11using System.Threading.Tasks; 12using System.Windows.Forms; 13using System.Diagnostics; 14using System.Drawing.Printing; 15using gv = AccountingBooks.GlobalVariablesA; 16 17namespace AccountingBooks 18{ 19 public partial class Form13 : Form 20 { 21 private Panel printPanel; 22 23 private Label[] labelArrayA = new Label[3]; 24 private Label[,] labelArrayB = new Label[10,9]; 25 26 [STAThread] 27 static void Main() 28 { 29 Application.EnableVisualStyles(); 30 Application.SetCompatibleTextRenderingDefault(false); 31 Application.Run(new Form13()); 32 } 33 34 35 public Form13() 36 { 37 InitializeComponent(); 38 Text = "印刷"; 39 Size = new System.Drawing.Size(1010, 600); 40 BackColor = Color.White; 41 42 printPanel = new Panel // 印刷範囲 43 { 44 Name = "printerPanel", 45 Location = new System.Drawing.Point(0, 0), 46 Size = new System.Drawing.Size(800, 540), 47 BackColor = Color.White 48 49 }; 50 this.Controls.Add(printPanel); 51 52 Panel panel_a = new Panel 53 { 54 Name = "panel_a", 55 Location = new System.Drawing.Point(30, 0), 56 Size = new System.Drawing.Size(800, 40), 57 BackColor = Color.White 58 }; 59 printPanel.Controls.Add(panel_a); 60 61 62 Panel panel_b = new Panel 63 { 64 Name = "panel_a", 65 Location = new System.Drawing.Point(30, 40), 66 Size = new System.Drawing.Size(800, 500), 67 BackColor = Color.Black 68 }; 69 printPanel.Controls.Add(panel_b); 70 71 72 string strA = "日 付:2022年12月31日"; 73 74 var lbl_aa = new Label 75 { 76 Location = new Point(0, 5), 77 Width = 180, 78 Height = 25, 79 Font = new Font("BIZ UDGothic", 12), 80 Text = strA, 81 TextAlign = ContentAlignment.MiddleLeft, 82 BackColor = Color.White, 83 ForeColor = Color.Black 84 }; 85 labelArrayA[0] = lbl_aa; 86 panel_a.Controls.Add(lbl_aa); 87 88 89 strA = "1234567891"; 90 91 var lbl_ab = new Label 92 { 93 Location = new Point(200, 5), 94 Width = 160, 95 Height = 25, 96 Font = new Font("BIZ UDGothic", 12), 97 Text = strA, 98 TextAlign = ContentAlignment.MiddleLeft, 99 BackColor = Color.White, 100 ForeColor = Color.Black 101 }; 102 labelArrayA[1] = lbl_ab; 103 panel_a.Controls.Add(lbl_ab); 104 105 106 strA = "*****"; 107 108 var lbl_ac = new Label 109 { 110 Location = new Point(360, 5), 111 Width = 120, 112 Height = 25, 113 Font = new Font("BIZ UDGothic", 12), 114 Text = strA, 115 TextAlign = ContentAlignment.MiddleRight, 116 BackColor = Color.White, 117 ForeColor = Color.Black 118 }; 119 labelArrayA[2] = lbl_ac; 120 panel_a.Controls.Add(lbl_ac); 121 122 var lbl_ad = new Label 123 { 124 Location = new Point(650, 5), 125 Width = 150, 126 Height = 25, 127 Font = new Font("BIZ UDGothic", 18), 128 Text = "プリンター", 129 TextAlign = ContentAlignment.MiddleRight, 130 BackColor = Color.White, 131 ForeColor = Color.Black 132 }; 133 panel_a.Controls.Add(lbl_ad); 134 135 string[] titleArray = { "タイトル1", "タイトル2", "タイトル3", "タイトル4", "タイトル5" }; 136 string[] lastTitle = { "000000", "", "Total", "", "000000"}; 137 int[] widthArray = { 120, 200, 300, 200, 120}; 138 139 int xStandardPosition = 1; 140 int yStandardPosition = 1; 141 int xPos = xStandardPosition; 142 int yPos = yStandardPosition; 143 int xSpace = 1; 144 int ySpace = 1; 145 int height = 50; 146 int maxWidth = 0; 147 ContentAlignment align = ContentAlignment.MiddleCenter; 148 149 150 for (int i = 0; i < 10; i++) 151 { 152 for (int j = 0; j < titleArray.Length; j++) 153 { 154 if (i == 0) // 先頭行のタイトル 155 { 156 strA = titleArray[j]; 157 align = ContentAlignment.MiddleCenter; 158 } 159 160 else if (i == 9) // 最終行 161 { 162 strA = lastTitle[j]; 163 align = ContentAlignment.MiddleCenter; 164 } 165 166 else 167 { 168 strA = "テスト"; 169 if (j == 0 || j == 4) 170 { align = ContentAlignment.MiddleRight; } 171 else { align = ContentAlignment.MiddleLeft; } 172 } 173 174 var lbl_ba = new Label 175 { 176 Location = new Point(xPos, yPos), 177 Width = widthArray[j], 178 Height = height, 179 Font = new Font("BIZ UDGothic", 14), 180 Text = strA, 181 TextAlign = align, 182 BackColor = Color.White, 183 ForeColor = Color.Black 184 }; 185 labelArrayB[i,j] = lbl_ba; 186 panel_b.Controls.Add(lbl_ba); 187 xPos += widthArray[j] + xSpace; 188 } 189 maxWidth = xPos; 190 xPos = xStandardPosition; 191 yPos += height + ySpace; 192 } 193 panel_b.Size = new System.Drawing.Size(maxWidth,yPos); 194 printPanel.Size = new System.Drawing.Size(maxWidth+30,yPos+40); 195 PanelPrinting(); 196 197 } // public Form13 の最後 198 199 200 201 private void PanelPrinting() 202 { 203 PrintDocument pd = new PrintDocument(); 204 205 pd.PrintPage += (s, ev) => 206 { 207 // printPanelの部分だけを印刷する 208 Bitmap bmp = new Bitmap(printPanel.Width, printPanel.Height); 209 printPanel.DrawToBitmap(bmp, new Rectangle(0, 0, printPanel.Width, printPanel.Height)); 210 ev.Graphics.DrawImage(bmp, 0, 0); 211 }; 212 213 PrintDialog printDialog = new PrintDialog(); 214 printDialog.Document = pd; 215 216 if (printDialog.ShowDialog() == DialogResult.OK) 217 { 218 pd.Print(); 219 } 220 } 221 222 } // public partial class Form13 : Form の最後 223} // namespaceの最後

試したこと

持っているプリンター2機種とPdfで試しましたが、結果は同じでした

補足情報(FW/ツールのバージョンなど)

C# 10.0
.NetFramework 4.8
Visualstudio 2022

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

コンストラクタ内でやっているのが問題である,という可能性はありませんか?

試しに以下のようなメソッド Test() を書いてみたところ,これをどこで呼ぶかによって結果が変わりました.

C#

1private void Test() 2{//※panelのDrawToBitmap で描画した結果を pixtureBox に表示して確認 3 var BMP = new Bitmap( panel1.Width, panel1.Height ); 4 panel1.DrawToBitmap( BMP, new Rectangle(0,0, panel1.Width, panel1.Height ) ); 5 pictureBox1.Image = BMP; 6}

※適当に panel1 上にラベルを2つほど配置し,panel1 の BorderStyle は FixedSingle にしてテストした.

  • コンストラクタ : panel 上に配置したラベルは描画されない.panel の border も描画されない.
  • フォームの Load イベント : panel 上に配置したラベルも描画されるが,panel の border が描画されない.
  • 適当なボタンを用意してそれを押したときのイベント : 想定通りの描画になった.

投稿2023/12/01 10:25

編集2023/12/01 10:27
fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2023/12/01 10:29

何故このような違いが生じるのか? については知りません.
shinobuKouno

2023/12/02 00:29

回答ありがとうございます。"PanelPrinting();" を "Load += (s, e) => PanelPrinting();"に変更して実現できました。
guest

0

ベストアンサー

PanelPrinting();が早すぎるんじゃないですかね?

Load += (s, e) => PanelPrinting();としたら印刷されました(Microsoft Print to PDF)

投稿2023/12/01 10:21

TN8001

総合スコア9326

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinobuKouno

2023/12/02 00:28

ありがとうござざいます。 私の環境でもできました。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問