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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

2357閲覧

レシートの印刷方法について

kmsk_daijin

総合スコア9

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/01/28 17:10

現在C#・VisualStudioにおいてレジシステムの開発を行っています。
その中でレシートの印刷を行いたいのですが、現状印刷をするとお店のロゴマーク(画像ファイル)と商品やお金の情報が重なって印刷されてしまいます。
理想では
ロゴ
商品情報(会計)
の順に表示をしたいと考えています。
コードは以下のようになっています

private void pd_Print_img(object sender, PrintPageEventArgs e) { //画像を読み込む Image img = Properties.Resources.ロゴ_レシート; //画像を描画する e.Graphics.DrawImage(img, 0, 0, 270, 90); //次のページがないことを通知する e.HasMorePages = false; //後始末をする img.Dispose(); printingPosition = 0; } private void pd_Print_Info(object sender, PrintPageEventArgs e) { string pText = ""; if (printingPosition == 0) { //改行記号を'\n'に統一する pText = HeadText.Replace("\r\n", "\n"); pText = HeadText.Replace("\r", "\n"); } int bwidth = e.MarginBounds.Width; //1ページに収まらなくなるか、印刷する文字がなくなるかまでループ while (e.MarginBounds.Bottom > y + printFont.Height && printingPosition < pText.Length) { string line = ""; for (; ; ) { //印刷する文字がなくなるか、 //改行の時はループから抜けて印刷する if (printingPosition >= pText.Length || pText[printingPosition] == '\n') { if (e.Graphics.MeasureString(line, printFont).Width < width) { int l = 0; double p = (width - e.Graphics.MeasureString(line, printFont).Width) / 2; int xp = (int)(Math.Floor(p) / e.Graphics.MeasureString(" ", printFont).Width); while (l < xp) { line = line.Insert(0, " "); l++; } } printingPosition++; break; } //一文字追加し、印刷幅を超えるか調べる line += pText[printingPosition]; if (e.Graphics.MeasureString(line, printFont).Width > width) { //印刷幅を超えたため、折り返す line = line.Substring(0, line.Length - 1); break; } //印刷文字位置を次へ printingPosition++; } //一行書き出す e.Graphics.DrawString(line, printFont, Brushes.Black, x, y); //次の行の印刷位置を計算 y += (int)printFont.GetHeight(e.Graphics); } e.HasMorePages = true; printingPosition = 0; y += (int)printFont.GetHeight(e.Graphics); }

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

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

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

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

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

Q71

2019/01/29 01:44

リソース中の画像をDisposeして大丈夫ですか?2回目の印刷ができますか?
kmsk_daijin

2019/01/29 05:23

一回の実行で一回の印刷をするので連続の印刷を行わないのでそこは考慮していません。
guest

回答3

0

気になるところとしては、

pText = HeadText.Replace("\r\n", "\n");

pText = HeadText.Replace("\r", "\n");

前の行が無意味になってますがこれでいいんでしょうか

投稿2019/01/28 20:16

y_waiwai

総合スコア87719

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

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

kmsk_daijin

2019/01/29 05:55

別の部分で改行記号が二つ混ざって使われているのでそのための統一処理としています
y_waiwai

2019/01/29 06:01

VisualStudioのデバッガで、ここの動作を確認してみましょう それがその記述の通りの意図したものであるといいですが。
Zuishin

2019/01/29 06:09

Windows では改行記号は \r\n, Unix だと \n, Mac だと \r になります。これが混在しているときに統一するコードとしてはこれで間違いないのではないかと思いますが、何か問題ありますか? 一行目で Windows の改行コードを直し、二行目で Mac の改行コードを直しています。一行目が無ければ \r\n が \n\n になってしまいます。
Zuishin

2019/01/29 06:13

この質問の問題は y が初期化されていないのでテキストがどの位置から書かれるかわからないというところにあると思います。 y == 0 であるなら画像と文字が重なってしまいます。
y_waiwai

2019/01/29 06:19

ええっと、文字列のバックスラッシュのエスケープがどーとかはよこにおいといても、 HeapTextが"なんたらかんたら\r\n"だった場合、 pTextは"なんたらかんたら\n\n" にしかならないですが
Zuishin

2019/01/29 06:20

失礼しました。私が間違っています。確かに一行目が無駄になっています。
Zuishin

2019/01/29 06:21

pText = HeadText.Replace("\r", "\n"); ではなく pText = pText.Replace("\r", "\n"); が正解ですね。
guest

0

pd_Print_imgでyを繰り下げてないからではないでしょうか?

投稿2019/01/29 00:23

papinianus

総合スコア12705

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

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

kmsk_daijin

2019/01/29 09:01

yを繰り下げることはわかったのですが、繰り下げる方法がわからないです。 メソッド内の //一行書き出す e.Graphics.DrawString(line, printFont, Brushes.Black, x, y); //次の行の印刷位置を計算 y += (int)printFont.GetHeight(e.Graphics); を画像のところでも使いそうな感じはするのですが...
guest

0

ベストアンサー

pd_print_info と pd_print_img の実行順序はどうなっているのでしょうか。どちらもイベントハンドラーのようですが、追加順に実行されます。
pd_print_img の最後で printingPosition を0にしていますが、これが最低限、イメージの高さですね、多分。

プログラムは、コンピュータの動作を指示する命令書です。期待通りの動作をしない時は、まず、自分が期待通りの指示を出しているか、確認しましょう。

投稿2019/01/29 09:32

Q71

総合スコア995

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問