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

印刷中のプリンターのダイアログにファイ...
 
通知
すべてクリア

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


ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 10年前
投稿: 32
Topic starter  

お世話になります。
印刷アプリを作っています。

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

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

MFC、SDI アプリで、標準印刷です。
Viewクラスに次の3つの関数が入ります。
① OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
② OnPreparePrinting(CPrintInfo* pInfo)
③ 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();
}

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


引用未解決
トピックタグ
蒼の洞窟
 蒼の洞窟
(@蒼の洞窟)
ゲスト
結合: 11年前
投稿: 28
 

ドキュメントクラスのSetTitleで設定したらどうなりますか?


返信引用
ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 10年前
投稿: 32
Topic starter  

有り難うございます。

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

教えて戴きましたので、

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

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用
ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 10年前
投稿: 32
Topic starter  

ストリングテーブルには、

AFX_IDS_APP_TITLE MyPrintApp

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

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>AFX_IDS_APP_TITLE MyPrintApp
これでいいはずですね。

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


返信引用
ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 10年前
投稿: 32
Topic starter  

仲澤@失業者様、有り難うございます。
何はともあれ、::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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>失礼ながら、自分がお訊ねしている問題とは違うような気がします。
そうみたいですね、失礼しました。

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


返信引用
ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 10年前
投稿: 32
Topic starter  

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

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

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


返信引用
うに
 うに
(@うに)
ゲスト
結合: 10年前
投稿: 1
 

OnBeginPrintingに

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


返信引用
ゲキアツ
 ゲキアツ
(@ゲキアツ)
ゲスト
結合: 10年前
投稿: 32
Topic starter  

出来ました!
完璧です。
うに様、ありがとうございました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました