none
CPrintDialogをカスタマイズしたとき、プリンタの設定情報が反映されない

    質問

  • いつもお世話になっております。arubi-momoと申します。

    開発環境は、Windows7 64bit  VisualStudio2010 SP1  MFC です。

    色々調べてみたところ、解決したい問題に対して質問のタイトルが適切でなかったため、変更させていただきました。

    SDIのプロジェクトで、印刷ダイアログを表示して印刷する機能をつけています。

    以前、こちらへ印刷ダイアログに初期値を設定するやり方を質問し、印刷ダイアログの拡張クラスを作成して、フック処理を入れて初期値を設定するやり方をご教示いただき、実装させていただきました。

    印刷ダイアログの「ページ指定」に現在ページを初期値として入れたい。

    印刷ダイアログでは、プリンタのプロパティボタンから設定できる各種設定、部単位の印刷チェックボックスなど、画面上から設定できる項目がありますが、印刷ダイアログで設定を変更しても、設定が反映されません。

    印刷ダイアログ上で設定した情報をGetDevModeで取得してみたのですが、そのDevModeの情報をどのようにプリンタへ送ればよいのかがわからず、反映できませんでした。

    ご存知の方がいらっしゃいましたら、ご教示いただけると助かります。

    勉強不足で申し訳ありませんが、よろしくお願いいたします。


    • 編集済み arubi_momo 2018年2月6日 9:51 質問の内容が問題に対して適切でなかったため
    2018年2月6日 5:26

回答

  • CPrintDialog の派生クラスに置き換えた際どのように置き換えたのかでも変わる気がしますが、CPrintInfo::m_pPD を入れ替えているわけではないのでしょうか?

    具体的には、CView::OnFilePrint を丸ごと派生クラスにコピーしてきて、CPrintInfo の構築直後に
    delete printInfo.m_pPD;
    printInfo.m_pPD = new CMyPrintDialog();

    のように差し替えるだけです。

    あとの処理は、CView::OnFilePrint のままでつつがなく処理ができると思います。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    • 回答としてマーク arubi_momo 2018年2月14日 2:17
    2018年2月7日 4:48

すべての返信

  • CPrintDialog の派生クラスに置き換えた際どのように置き換えたのかでも変わる気がしますが、CPrintInfo::m_pPD を入れ替えているわけではないのでしょうか?

    具体的には、CView::OnFilePrint を丸ごと派生クラスにコピーしてきて、CPrintInfo の構築直後に
    delete printInfo.m_pPD;
    printInfo.m_pPD = new CMyPrintDialog();

    のように差し替えるだけです。

    あとの処理は、CView::OnFilePrint のままでつつがなく処理ができると思います。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    • 回答としてマーク arubi_momo 2018年2月14日 2:17
    2018年2月7日 4:48
  • とっちゃんさま

    いつもお世話になっております。ご回答ありがとうございます。

    CPrintInfo::m_pPD を入れ替えているわけではないのでしょうか?

    入れ替えずに、doModalで表示していました。そのため、DEVMODEで設定内容を取得し、保存するというやり方で実装しようとしており、それがうまくいかずに困っていました。

    CPrintInfoのダイアログを置き換えるという方法があったのですね。一生懸命DEVMODEを置き換えようとしていました。

    OnPreparePrintingの中で、DoPreparePrintingでダイアログ表示する前に派生クラスに差し替えてみたところ、とっちゃんさまのおっしゃる通り、OnFilePrintのままでつつがなく処理ができました!

    ソースコードを載せておきます。

    ご教示いただき、ありがとうございました。

    BOOL CView::OnPreparePrinting(CPrintInfo* pInfo)
    {
        // 印刷ダイアログの置き換え CDlgPrintEx=拡張クラス
        delete pInfo->m_pPD;
        pInfo->m_pPD = new CDlgPrintEx(pageIndex);
    
        BOOL ret = DoPreparePrinting(pInfo);
    
        return ret;
    }
    
    

    2018年2月8日 1:51
  • 影響することはないと思いますが、ID_FILE_PRINT_DIRECT コマンド(エクスプローラから直接印刷に来る場合のメッセージ)では、CView::OnFilePrint 内で、DCを作る処理があります。

    それ以外はOnPreparePrinting で差し替えても問題はないので大丈夫だと思います。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年2月8日 2:03
  • とっちゃんさま

    お世話になっております。ご教示ありがとうございます。

    最初OnFilePrintをコピーしてやってみたのですが、うまくできなかったため、OnPreparePrintingの中でも問題なさそうだと思いそちらでやってしまいました。

    仕様的にも特に問題はないかとは思うのですが、理解不足のためご教示いただければ幸いです。

    CView::OnFilePrint を丸ごと派生クラスにコピーしてきて

    ここでいう「派生クラス」というのは、CViewの派生クラスということで間違いないでしょうか。また、OnFilePrintの中で使用されているCView内の関数なども一緒にコピーしてくるようなイメージで合っていますでしょうか。

    勉強不足で大変申し訳ありませんが、よろしくお願いいたします。

    2018年2月14日 2:28
  • >ここでいう「派生クラス」というのは

    はい。CViewの派生クラス(以下CMyView)で、ご自身のアプリで印刷を行うビュークラスになります。

    コピーしてくるのは、OnFilePrintの内容だけ」です。ほかのメソッドは呼び出せるはずなので、コピーしてくる必要はないはずです。

    また、メッセージハンドラも自分のビュークラスに用意する必要があるので、クラスウィザードなどを使って、メッセージハンドラを用意し(そのままCMyView::OnFilePrintができると思います)、そこに CView::OnFilePrint の中身を丸ごとペースとして、頭のCPrintDialog の部分だけ書き換えるだけでビルドできると思います。

    もし、ビルドができない(例えば、private なメソッドを呼ぶあるいは、friend なクラスのプライベートメソッドを呼ぶなど)場合は、どういうエラーなのかに応じて適切な対策を検討することになります(エラー内容によるのでここでは言及しません)。

    もちろん、対策の一つとして、ID_FILE_PRINT_DIRECT コマンドが発行されるようなことがないようなプログラムの作りにし、OnPreparePrinting で差し替えるでも問題はありません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年2月14日 2:39
  • とっちゃんさま

    ご教示ありがとうございます。

    来週中くらいに時間をとって検証してみようと思います。CScrollViewのOnFilePrintを呼び出しているのですが、CScrollViewもCViewの派生クラスなので問題ないはずですよね。前回は途中でやり方を変えてしまってあまり現象を覚えてないので、再度確認してみます。

    ありがとうございました。

    2018年2月16日 4:46
  • OnFilePrintの実装は、CViewにしかないので、ベースとなるビューの派生元はどこでも変わりないです。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年2月16日 7:42