この記事は2018年11月25日に投稿しました。
この記事は2022年07月07日に更新しました。
目次
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているMFCで印刷する方法についてです。
2. MFCで印刷する
MFCで印刷するには、CPrintDialogを使用します。
実装例
// PictureControl CStatic m_img; /** * @brief 画面の印刷ボタンが押下された時に呼出されます。 */ void XXX::OnBnClickedPrint() { // 印刷ダイアログを開きます。 CPrintDialog dlg(FALSE); // 印刷ダイアログの印刷ボタン以外が押下された場合 if (dlg.DoModal() != IDOK) { // 終了します。 return; } // プリンタのデバイスコンテキストを取得します。 CDC prtDC; HDC ptrHDC = dlg.GetPrinterDC(); prtDC.Attach(ptrHDC); // 印刷ドキュメント情報を設定します。 DOCINFO docInfo; int docInfoSize = sizeof(DOCINFO); memset(&docInfo, 0, docInfoSize); // 印刷ドキュメント情報構造体のサイズを設定します。 docInfo.cbSize = docInfoSize; //ドキュメント名を設定します。 docInfo.lpszDocName = _T("印刷サンプル"); //ドキュメントを開始します。 prtDC.StartDoc(&docInfo); // ページを開始します。 prtDC.StartPage(); // 描画処理はStartPage()とEndPage()の間で行なってください。 // プリンタのデバイスコンテキストに直接描画しても構いません。 // ここではPictureControlの画像をコピーします。 // PictureControlのデバイスコンテキストを取得します。 CDC* pImgDC = m_img.GetDC(); HDC imgHDC = pImgDC->GetSafeHdc(); // PictureControlの範囲を取得します。 CRect imgRect; m_img.GetClientRect(&imgRect); // プリンタの範囲を取得します。 CRect prtRect; prtDC.GetClipBox(&prtRect); // PictureControlの画像をプリンタのデバイスコンテキストにコピーします。 // StretchBltはプリンタの範囲に合わせて拡大縮小してコピーします。 StretchBlt(ptrHDC, 0, 0, prtRect.Width(), prtRect.Height(), imgHDC, 0, 0, imgRect.Width(), imgRect.Height(), SRCCOPY); // PictureControlのデバイスコンテキストをクリアします。 DeleteDC(imgHDC); ReleaseDC(pImgDC); // ページを終了します。 prtDC.EndPage(); // ドキュメントを終了します。 prtDC.EndDoc(); // プリンタのデバイスコンテキストをクリアします。 prtDC.Detach(); DeleteDC(prtDC); }
3. おわりに
いろいろと知らないことだらけでなかなか印刷できませんでした。
特にPictureControlの画像をプリンタのデバイスコンテキストにコピーする処理を、StartPage()の前に行っていて印刷されず試行錯誤しました。
とりあえず稼ぎたいなら、ITエンジニア【IT派遣テクノウェイブ】
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688