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

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

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

Re[4]: c# コンソールアプリケーションでの印刷プログラム


(過去ログ 136 を表示中)

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

■80319 / inTopicNo.1)  c# コンソールアプリケーションでの印刷プログラム
  
□投稿者/ kazubou (3回)-(2016/07/06(Wed) 15:22:42)

分類:[C#] 

Visual Studio 2015 でC# の勉強をしています。
コンソールアプリケーションで、
例えば文字列をコンソールに表示させる方法は下記の通りですが、
この文字列をプリンターで印刷する方法がわかりません。
どなたか教えてください。

using System;

namespace 印刷
{
class Program
   {
static void Main(string[] args)
{
string str = "Hello World";

// 表示
Console.WriteLine(str);

// 印刷(プログラムができてません)

}
}
}

*もしかしたら文字がすべて左よりで見にくいかもしれませんが
 よろしくお願いします。

引用返信 編集キー/
■80320 / inTopicNo.2)  Re[1]: c# コンソールアプリケーションでの印刷プログラム
□投稿者/ furu (58回)-(2016/07/06(Wed) 16:36:19)
ネットで調べたほうが早いと思うけど
とりあえず、これで印字できます。

static void Main(string[] args)
{
  string str = "Hello World";

  // 表示
  Console.WriteLine(str);

  // 印刷(とりあえず印字できるプログラム)
  var pd = new System.Drawing.Printing.PrintDocument();

  pd.PrintPage +=
    (object sender, System.Drawing.Printing.PrintPageEventArgs e) =>
        {
          e.Graphics.DrawString(
              str,
              new System.Drawing.Font("MS Pゴシック", 10),
              System.Drawing.Brushes.Black,
              10.0F,
              10.0F);

          e.HasMorePages = false;
        };

  pd.Print();
}
 

引用返信 編集キー/
■80323 / inTopicNo.3)  Re[2]: c# コンソールアプリケーションでの印刷プログラム
□投稿者/ kazubou (4回)-(2016/07/06(Wed) 21:50:16)
No80320 (furu さん) に返信

furuさん、さっそく教えていただきありがとうございます。
昔C言語は一通りやってプログラムも組んだことはありますが、今はすっかり忘れてしまいました。
C#はまったくの初心者です。Windows Formをやる前にまず文法など基礎的なことを
コンソールアプリケーションからやっています。

さて、ご回答のコードを追加してデバッグを開始しますと、エラーがでます。
System.Drawing.Printingに問題があるとのことです。
何分素人のことなので意味は分りません。

疑問点が2つあるのですが、1つは印刷プログラムの中に Hello World と出力をするような
コーディングが見当たらないのですが?

2つめはもしかしたら(間違っていたらすみません)これはコンソールアプリケーション用の
プログラムコードではなく、Windows Form アプリケーション用のものなのではないですか?

目的は、コンソールアプリケーションでただ単純に Hello Wold と印刷したいだけなのですが、
コンソール表示用のSystem.Console.WriteLine();に対応する印刷用コマンド(c言語風に言うと)
はないのかな?と思うのです。

再度教えていただけたらありがたいです。


引用返信 編集キー/
■80324 / inTopicNo.4)  Re[3]: c# コンソールアプリケーションでの印刷プログラム
□投稿者/ Azulean (661回)-(2016/07/06(Wed) 22:19:01)
No80323 (kazubou さん) に返信
> さて、ご回答のコードを追加してデバッグを開始しますと、エラーがでます。
> System.Drawing.Printingに問題があるとのことです。
> 何分素人のことなので意味は分りません。

C 言語で特定の関数を使うためにヘッダーのインクルードが必要だったように、.NET では外部のクラスを使うためには参照設定の追加が必要です。
該当のクラスのドキュメントをみれば、どの DLL に含まれているかは書いてあります。
https://msdn.microsoft.com/ja-jp/library/system.drawing.printing.printdocument

この場合だと、System.Drawing.dll に対して参照の追加が必要ですから、プロジェクトメニューから参照の追加を選び、アセンブリ - フレームワークの中から System.Drawing を選んでチェックをつけてください。


> 疑問点が2つあるのですが、1つは印刷プログラムの中に Hello World と出力をするような
> コーディングが見当たらないのですが?

C 言語をやったことがあるのであれば、変数の概念を思い出してください。
"Hello World" という文字列がソースコード中にどのように出現してるのか?その文字列はどのような処理をされているのか?を考えてみてください。


> 2つめはもしかしたら(間違っていたらすみません)これはコンソールアプリケーション用の
> プログラムコードではなく、Windows Form アプリケーション用のものなのではないですか?

わからない状況で、推測は言わない方がいいと思います。
悪気がなくても、相手にいやな気持ちを抱かせる可能性があるので…。


> コンソール表示用のSystem.Console.WriteLine();に対応する印刷用コマンド(c言語風に言うと)
> はないのかな?と思うのです。

ありません。
引用返信 編集キー/
■80327 / inTopicNo.5)  Re[3]: c# コンソールアプリケーションでの印刷プログラム
□投稿者/ 魔界の仮面弁士 (757回)-(2016/07/07(Thu) 11:16:21)
No80323 (kazubou さん) に返信
> C#はまったくの初心者です。
表記は C#(全角)ではなく、C# であると定められています。[JIS X 3015]
Unicode で言えば U+0043, U+0023 です。


> System.Drawing.Printingに問題があるとのことです。
このあたりは、Azulean さんが説明してくださっていますね。


> 目的は、コンソールアプリケーションでただ単純に Hello Wold と印刷したいだけなのですが、
Hello Wold (こんにちは原野)ではなく
Hello World (こんにちは世界)ですよね。


> 疑問点が2つあるのですが、1つは印刷プログラムの中に Hello World と出力をするような
> コーディングが見当たらないのですが?
furu さんのコードについて補足いたします:

・PrintDocument は、印刷処理のためのクラスです。

・PrintDocumentの Print メソッドを呼ぶことで、印刷処理が開始されます。

・印刷する内容は、PrintDocument の PrintPage イベントで指示します。

・印刷処理が開始されると、ページ印刷のたびに PrintPage イベントが
 呼ばれますので、引数 e.Graphics に対して描画処理を指示します。

・今回のケースでは、e.Graphics.DrawString メソッドを通じて、
 変数 str の内容を出力しています。この str にはあらかじめ、
 "Hello World" という文字列が入っていますね。

・1 ページ印刷したら、次のページも印刷するかどうかを、
 e.HasMorePages で指示します。今回は単ページなので false を
 セットしています。


もしも複数ページの印刷を行いたい場合は、イベント終了時に
e.HasMorePages = true; をセットしておきます。こうすると、
次のページの印刷のために、再度 PrintPage イベントが
呼び出されます。n 回目に PrintPage が呼ばれたときには
n ページ目を印刷するように記述し、最終ページに至った時点で
e.HasMorePages = false; をセットするようにするという流れです。


> 2つめはもしかしたら(間違っていたらすみません)これはコンソールアプリケーション用の
> プログラムコードではなく、Windows Form アプリケーション用のものなのではないですか?
コンソールアプリかどうかを決めるのは、プロジェクトのプロパティの
[アプリケーション]タブの[出力の種類]です。

コンソール アプリケーションのプロジェクトの場合、初期設定では
System.Drawing.Printing.PrintDocument クラスが使えるようになっていませんが、
該当するアセンブリへの参照設定を追加する事で利用可能になります。
(この点は、Azulean さんが解説してくださっていますね)



> コンソール表示用のSystem.Console.WriteLine();に対応する印刷用コマンド(c言語風に言うと)
> はないのかな?と思うのです。

印刷用のTextWriterを Console.SetOut メソッドに渡すことで、
Console.WriteLine による印刷が行えます。


namespace ConsoleApplication1
{
  class Program
  {
    [STAThread] // 印刷処理を行う場合は STAThread 属性が必要です
    static void Main(string[] args)
    {
      System.IO.TextWriter stdOut = System.Console.Out;

      // どこにも出力されなくなる
      System.Console.SetOut(System.IO.TextWriter.Null);
      System.Console.WriteLine("Hello World");

      // ファイル出力に変更
      System.IO.TextWriter fileOut = new System.IO.StreamWriter(@"C:\TEMP\SAMPLE.TXT");
      System.Console.SetOut(fileOut);
      Console.WriteLine("Hello World");
      fileOut.Close();

      // 印刷出力に変更
      System.IO.TextWriter printOut = new Util.LPrintWriter();
      System.Console.SetOut(printOut);
      System.Console.WriteLine("Hello World");
      printOut.Close();

      // 標準出力に戻す
      System.Console.SetOut(stdOut);
      Console.WriteLine("Hello World");
    }
  }
}


ただし、印刷用の TextWriter は標準では用意されていません。
上記で用いた LPrintWriter クラスは、James Curran さん作のアセンブリです。
(このクラスも、内部で PrintDocument クラスを呼び出しています)
http://www.codeproject.com/Articles/14385/Writing-Text-to-a-Printer-with-LPrintWriter


また、James さん作の LPrintWriter.cs は、そのままだと
コンソールからの呼び出しに対応していませんので、これを用いる場合、
74行目付近を下記のように書き換える必要があります。

PrintDialog printDialog = new PrintDialog();
printDialog.UseEXDialog = true; // ★UseEXDialog の指定を追加★
printDialog.Document = new System.Drawing.Printing.PrintDocument();


> 再度教えていただけたらありがたいです。
エディションによっては、ドラッグ&ドロップで印刷イメージを構築できる、
Visual Studio レポートデザイナー という機能も利用できます。
https://msdn.microsoft.com/ja-jp/library/bb558708.aspx
引用返信 編集キー/
■80328 / inTopicNo.6)  Re[3]: c# コンソールアプリケーションでの印刷プログラム
□投稿者/ furu (59回)-(2016/07/07(Thu) 15:56:39)
No80323 (kazubou さん) に返信

Azuleanさん、魔界の仮面弁士さん、フォローありがとうございます。

> C#はまったくの初心者です。Windows Formをやる前にまず文法など基礎的なことを
> コンソールアプリケーションからやっています。
文法など基礎的なことをやるにしても
Windows Formでやったほうがテストしやすく、理解が早いかも


> System.Drawing.Printingに問題があるとのことです。
申し訳ない。参照設定をしなければいけないことを書くのが漏れました。

> 2つめはもしかしたら(間違っていたらすみません)これはコンソールアプリケーション用の
> プログラムコードではなく、Windows Form アプリケーション用のものなのではないですか?
C#の印刷は、イベントドリブンなので、Formアプリケーションに見えてしまいますね。

印刷開始,印字1,印字2,印字3,改ページ,印字4,印字5,印刷終了

ではなく、

印刷実行

だけで、後は印刷クラスからページ印刷のメソッドが呼び出されます。
ページ印刷のメソッドでは、

1回目の呼び出し → 印字1,印字2,印字3,次のページあるよ
2回目の呼び出し → 印字4,印字5,次のページないよ

です。
考え方が逆なので、最初結構大変です。
コンソールのように、ラインプリンタとして使うならば、
そういう印刷クラスを作った方がいいです。

WriteLine();

で印刷できるように

引用返信 編集キー/
■80340 / inTopicNo.7)  Re[4]: c# コンソールアプリケーションでの印刷プログラム
□投稿者/ kazubou (5回)-(2016/07/08(Fri) 15:09:06)
No80328 (furu さん) に返信

furuさん、Azuleanさん、魔界の仮面弁士さん。
こんにちは、この場を借りてお三方にお礼申し上げます。

◎furuさんへ
 大変失礼な返信で申し訳ありませんでした。お詫び致します。
 プログラムのデバッグについてはAzuleanさんから教えて頂いた方法で解決し、
 無事に Hello World が印刷できました。
 どうもありがとうございました。

◎Azuleanさんへ
 System.Drawing.Printingの件、ご教示頂きましてありがとうございました。
 おかげさまで印刷ができました。
 またfuruさんへの返信が少々不快な書き方であったと反省しています。
 お許し下さい。

◎魔界の仮面弁士さんへ
 先日に引き続きご親切なご回答ありがとうございます。
 正直に言って私にはほとんど理解できませんが、いずれ分る日が来ればいいなと
 思います。

以上どちらさまにもお礼申し上げます。
またつたない質問を書き込むことがあると思いますが、その際はよろしく
お願い致します。

                           from kazubou

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -