プリンタの設定

VC++ の PrinterProperties() でプリンタ設定のウインドウを表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクトを作成して、メニューを設定して下さい。
    キャプションID
    ファイル(&F) 親メニュー
    終了(&X) IDM_END
    印刷(&P) IDM_PRINT
    プリンタ設定(&S)IDM_SET
  2. 印刷を中止する Dialog Box を作成して下さい。
    BOXIDキャプション
    DialogBoxIDD_DIALOG1 印刷中止
    Button IDCANCEL キャンセル
  3. hCancelDlg; は処理の中断を指示する DialogBox のハンドルです。
    prninfo[3]; はプリンタ情報を取得する構造体です。
    bCancel は処理の中断を通知するフラグです。
        HWND            hCancelDlg;
        PRINTER_INFO_5  prninfo[3];
        BOOL            bCancel = FALSE;
        
  4. CALLBACK 関数の WM_COMMAND: です。
    IDM_PRINT: で印字を開始します。
    IDM_SET: でプリンタ設定の Dialog を表示します。
            case IDM_PRINT:
                MyPrint();
                break;
            case IDM_SET:
                PrinterSet();
                break;
        
  5. プリンタに印字する関数です。
    SetAbortProc(hdc,(ABORTPROC)AbortProc); で、プリンタの hdc に対するメッセージを捕まえます。
    AbortDoc(hdc); は処理中のページをキャンセルする関数です。
    bCancel==FALSE のときは、役目の終わった DialogBox を破棄します。
    印字に付いては 印字をする を参照して下さい。
    印字の中断は 処理の中断 を参照して下さい。
        int MyPrint(void)
        {   HDC     hdc;
            DOCINFO docinfo;
    
            memset(&docinfo, 0, sizeof(DOCINFO));
            docinfo.cbSize = sizeof(DOCINFO);
            docinfo.lpszDocName = "testprint";
            hdc = GetPrintInfo();
            hCancelDlg = CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),
                                      g_hWnd,(DLGPROC)CancelProc);
            ShowWindow(hCancelDlg, SW_SHOW);
            EnableWindow(g_hWnd, FALSE);
            SetAbortProc(hdc,(ABORTPROC)AbortProc);
    
            StartDoc(hdc, &docinfo);
            StartPage(hdc);
            TextOut(hdc, 20, 20, "これは、テスト印刷です", 22);
    
            if (bCancel)    AbortDoc(hdc);
            else            DestroyWindow(hCancelDlg);
            EndPage(hdc);
            EndDoc(hdc);
            EnableWindow(g_hWnd,TRUE);
            SetFocus(g_hWnd);
            DeleteDC(hdc);
            return 0;
        }
        
  6. ページ先頭のようなプリンタ設定の DialogBox を表示します。
    DialogBox の形式は使用するプリンタによって異なります。
        int PrinterSet()
        {   HANDLE hPrint;
            GetPrintInfo();
            OpenPrinter(prninfo[0].pPrinterName,&hPrint,NULL);
            PrinterProperties(g_hWnd,hPrint);
            ClosePrinter(hPrint);
            return 0;
        }
        
  7. プリンタの hdc に対する CALLBACK 関数です。
    hCancelDlg に対するメッセージは TranslateMessage(), DispatchMessage() から外します。
        BOOL CALLBACK AbortProc(HDC, int)
        {   MSG msg;
    
            while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
            {   if (!IsDialogMessage(hCancelDlg, &msg))
                {   TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            }
            return (!bCancel);
        }
        
  8. 次の関数は 印字をする処理の中断 を参照して下さい。
        HDC GetPrintInfo(void);
        LRESULT CancelProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
        

【演習】

  1. プログラムを完成させて下さい。

超初心者のプログラム入門(Win32API C++)