印刷中のプリンターのダイアログにファイル名を表示する方法

[戻る]
ゲキアツ 2014/03/16(日) 15:32:44
お世話になります。
印刷アプリを作っています。

一般に、印刷が始まるとプリンターのダイアログが現れ、進捗バーやインク残量等が表示
されます。
ワード文書などのときは、印刷中のファイル名も表示されます。
しかし、自分のアプリではコードを入れていないために「無題」と表示されます。

ファイル名が表示されるようにしたいのですが、方法が解りません。

MFC、SDI アプリで、標準印刷です。
Viewクラスに次の3つの関数が入ります。
@ OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
A OnPreparePrinting(CPrintInfo* pInfo)
B OnPrint(CDC* pDC, CPrintInfo* pInfo)

OnPrint に次のコードを入れてみましたが、「無題」と表示されます。

void CMyPrintAppView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
    DOCINFO di;
    memset(&di, 0, sizeof(di));
    di.cbSize = sizeof(di);
    di.lpszDocName = _T("STOP細胞"); ←ファイル名のつもりです
    pDC->StartDoc(&di);

    pDC->DrawText(・・・・); ←印刷内容です(Docクラスは使っていません)

    pDC->EndDoc();
}

何か足りない、何か間違っていると思うのですが、どうぞ教えてください。
よろしくお願いいたします。

蒼の洞窟 2014/03/17(月) 11:50:56
ドキュメントクラスのSetTitleで設定したらどうなりますか?

ゲキアツ 2014/03/17(月) 16:17:25
有り難うございます。

このアプリでは、ドキュメントクラスを使っていません。
ファイルはビュークラスで読み込んで、その中のデータを pDC->DrawText などで印刷す
るようにしています。

教えて戴きましたので、

CMyPrintAppDoc::CMyPrintAppDoc()
{
    SetTitle(_T("STAAAAP細胞"));
}

としてみましたが、プリンターのダイアログには反映されません。「無題」となります。

ITO 2014/03/17(月) 17:14:14
うーーん、
ドキュメントクラスを使っていなくても、MFCのスケルトンを使っている以上、
リソース→ストリングテーブルの設定はしないとだめだと思います。

ゲキアツ 2014/03/17(月) 18:33:18
ストリングテーブルには、

AFX_IDS_APP_TITLE    "MyPrintApp"

と、プロジェクト名が入っています。
あとはメニュー項目に対するポップアップメッセージ等を設定しています。

印刷時に使うことを目的とするストリングというものがあるのでしょうか?

仲澤@失業者 2014/03/18(火) 10:39:58
OnPrint()に来てからでは遅すぎるのかもしれません。
MFCの一般的な印刷手順は

1.CView::OnPreparePrinting()が呼ばれ、印刷DLGの表示。
2.CView::OnBeginPrinting()が呼ばれる。
3.CDC::StartDoc()を実行
4.CView::OnPrepareDC()が呼ばれる。
5.CDC::StartPage()の実行
6.CView::OnPaint()が呼ばれる。
7.CDC::EndPage()の実行
8.CDC::EndDoc()の実行
9.OnEndPrinting()が呼ばれる。

てな感じなので、
> di.lpszDocName = _T("STOP細胞"); ←ファイル名のつもりです
> pDC->StartDoc(&di);
の行は、CView::OnBeginPrinting()あたりで行わなければ
ならないのかもしれません。

MFCのソース CView::OnFilePrint() 関数が参考になると思います。

ITO 2014/03/19(水) 11:47:38
>AFX_IDS_APP_TITLE    "MyPrintApp"
これでいいはずですね。

>ファイル名が表示されるようにしたいのですが、方法が解りません。
印刷のダイアログは「CPrintDialog」です。
CPrintDialogの
CPrintDialog::m_pdのFLAG「PD_PRINTTOFILE」を有効にしないと、
DOCINFOを設定してもうまくいかないみたいです。

ゲキアツ 2014/03/19(水) 16:37:50
仲澤@失業者様、有り難うございます。
何はともあれ、::OnBeginPrinting()に次のコードを入れてみました。
    DOCINFO di;
    memset(&di, 0, sizeof(di));
    di.cbSize = sizeof(di);
    di.lpszDocName = _T("STAAAP細胞");
    pDC->StartDoc(&di);
そして、OnEndPrinting()の中に pDC->EndDoc();
結果は、印刷ダイアロが出る前に「印刷を開始できませんでした」というメッセージが出
て、その先には進みません。

ITO様、いつも有り難うございます。
このアプリは、MFCで作っていて標準印刷コードで構成されるため、自分では CPrintDial
og を呼び出しません。
それでも、”CPrintDialog::m_pdのFLAG「PD_PRINTTOFILE」を有効にする”とはどういう
ことか知りたくて調べました。
印刷ダイアログの中にあるチェックボックス「ファイルへ出力」のことだろうと思いまし
た。
これについては、こんなページがありました。
http://windows.microsoft.com/ja-jp/windows/print-to-file#1TC=windows-7
失礼ながら、自分がお訊ねしている問題とは違うような気がします。

ITO 2014/03/19(水) 18:05:58
>失礼ながら、自分がお訊ねしている問題とは違うような気がします。
そうみたいですね、失礼しました。

見たことありますか?
http://msdn.microsoft.com/ja-jp/library/hx1625y5.aspx

ゲキアツ 2014/03/21(金) 09:50:29
CDC::StartDoc(LPDOCINFO lpDocInfo) の説明を見ました。
この関数の役目は「ドキュメントが他のジョブにより、1 ページ混在しないようにします
。」となっています。
ということは、DOCINFO構造体の lpszDocName が「印刷中のプリンターのダイアログ」(
プリントダイアログではなく)の表示情報として使われることではないと理解しました。

では、「印刷中のプリンターのダイアログ」に表示される「アプリ名+ファイル名」はど
うやってプリンターに渡したいいのか? という基本から考えなければなりません。
PRINTDLG構造体のメンバーには、そのようなものは見当たりません。
PRINTDLGEX構造体にもありません。

EPSONプリンタを使っていますが、例としてワード文書を印刷するとき、”Microsoft Wor
d - STAAAP細胞”と表示されます。
自分のアプリで、これを表示させたいのです。
さて、困りました。

うに 2014/03/25(火) 17:57:08
OnBeginPrintingに

CDocument* pDoc = GetDocument();
pDoc->SetTitle("ちくちくうにうに");
ではだめですか?

ゲキアツ 2014/03/26(水) 08:45:01
[[解決]]
出来ました!
完璧です。
うに様、ありがとうございました。

なお、 OnBeginPrinting ではなく、OnPreparePrinting 内に教えて戴いたコードを入れ
てうまく行きました。

古いスレッドには追加発言できません。