VC++ MFCに印刷機構を組み込む手順の解説(2)

OnFilePrintPreview();

アプリケ-ションから自動的に印刷書式を登録しその後に印刷用ダイアログが別ウィンドウで開かれて来ます。


BOOL ControlPracticeView::OnPreparePrinting(CPrintInfo* pInfo)
{
CControlPracticeDoc* pDoc = GetDocument();

pInfo->SetMaxPage(2); // 構造体で最大ページ数を設定します。
BOOL bRet = DoPreparePrinting(pInfo);// システム内に有る基本印刷書式です
pInfo->m_nNumPreviewPages =2; //印刷するペ-ジサイズです
return bRet;
}



文字各種サイズに配列アドレスをスタティツク領域に配置します

ドキュメントクラスヘッダ-内部に記載しますこの場合はMSゴシック体の各文字大きさで使う配列を宣言します。

static int MS_HE[] = { -7,-8,-9,-10,-11,-12,-13,-15,-16,-19,-21,-24,-27,-29,-32,-35,-37 };//MSゴシック

ドキュメントクラス内に記載します


モジサイズを指示します

MakeLogFont( LOGFONT *lf,int he,int mode,int size)

oid CControlPracticeDoc::MakeLogFont( LOGFONT *lf,int he,int mode,int size)
{
//論理フォント構造体をゼロで初期化します(ゼロ埋め)
memset( lf , 0 , sizeof(LOGFONT) );

switch(size){
    case 7 :lf->lfHeight = MS_HE[0] ;break;                      //フォント高さの設定
    case 8 :lf->lfHeight = MS_HE[1] ;break;                      //フォント高さの設定
    case 9 :lf->lfHeight = MS_HE[2] ;break;  
    case 10:lf->lfHeight = MS_HE[3] ;break;                      //フォント高さの設定
    case 11:lf->lfHeight = MS_HE[4] ;break;
    case 12:lf->lfHeight = MS_HE[5] ;break;                      //フォント高さの設定
    case 14:lf->lfHeight = MS_HE[6] ;break; 
    case 16:lf->lfHeight = MS_HE[7] ;break;                      //フォント高さの設定
    case 18:lf->lfHeight = MS_HE[8] ;break; 
    case 20:lf->lfHeight = MS_HE[9] ;break;                      //フォント高さの設定
    case 22:lf->lfHeight = MS_HE[10];break; 
    case 24:lf->lfHeight = MS_HE[11];break;                      //フォント高さの設定
    case 26:lf->lfHeight = MS_HE[12];break; 
    case 28:lf->lfHeight = MS_HE[13];break;                      //フォント高さの設定
    case 30:lf->lfHeight = MS_HE[14];break;                      //フォント高さの設定
    case 32:lf->lfHeight = MS_HE[15];break; 
    case 34:lf->lfHeight = MS_HE[16];break;                      //フォント高さの設定
    }

lf->lfCharSet = SHIFTJIS_CHARSET;       //ここでは日本語文字を使います

switch( mode )
{
case 0:   //MSゴシック体の設定です(固定ピッチフォントで、モダン型です)
          lf->lfPitchAndFamily =  FIXED_PITCH | FF_MODERN;
          lstrcpy(lf->lfFaceName,_T("MS ゴシック"));
          break;

case 1:   //MS Pゴシックの設定です(可変ピッチフォントで、モダン型です)
          lf->lfPitchAndFamily =  VARIABLE_PITCH | FF_MODERN;
          lstrcpy(lf->lfFaceName,_T("MS Pゴシック"));
          break;

case 2:   //MS明朝の設定です(固定ピッチフォントで、ローマン型です)
          lf->lfPitchAndFamily =  FIXED_PITCH | FF_ROMAN;
          lstrcpy(lf->lfFaceName,_T("MS 明朝"));
          break;

case 3:   //MS P明朝の設定です(可変ピッチフォントで、ローマン型です)
          lf->lfPitchAndFamily =  VARIABLE_PITCH | FF_ROMAN;
          lstrcpy(lf->lfFaceName ,_T("MS P明朝"));
          break;
}
return;

}


印刷用紙の指定を行います

OnFilePrintSetup()

void CControlPracticeDoc::OnFilePrintSetup()
{
CSize new_size(850, 1100);

CPrintDialog dlg(TRUE, PD_SELECTION | PD_USEDEVMODECOPIES);

if (AfxGetApp()->GetPrinterDeviceDefaults(&dlg.m_pd)){
            if (dlg.DoModal()==IDOK){
                        // GetPrinterDC returns a HDC so attach it
                        CDC dc;
                        HDC hDC= dlg.CreatePrinterDC();
                        ASSERT(hDC != NULL);
                        dc.Attach(hDC)     ;
                        pDevMode=(DEVMODE*)GlobalLock(dlg.m_pd.hDevMode);
                        // Get the size of the page in loenglish
                        new_size.cx = MulDiv(dc.GetDeviceCaps(HORZSIZE),1000,254);
                        new_size.cy = MulDiv(dc.GetDeviceCaps(VERTSIZE),1000,254);
                        }
            else return ;
            }

if (new_size != m_size) m_size = new_size;

switch(pDevMode->dmPaperSize)
            {
            case DMPAPER_A4    :            intPeparSize=1 ;break;  //A4 シート、      8.5 x 11   210 × 297 mm
            case DMPAPER_CSHEET:            intPeparSize=2 ;break;  //C シート、       17 × 22    インチ
            case DMPAPER_DSHEET:            intPeparSize=3 ;break;  //D シート、       22 × 34    インチ
            case DMPAPER_ESHEET:            intPeparSize=4 ;break;  //E シート、       34 × 44    インチ
            case DMPAPER_LETTERSMALL:       intPeparSize=5 ;break;  //Letter Small、8 1/2 × 11    インチ
            case DMPAPER_TABLOID:           intPeparSize=6 ;break;  //Tabloid、        11 × 17    インチ
            case DMPAPER_LEDGER :           intPeparSize=7 ;break;  //Ledger 、        17 × 11    インチ
            case DMPAPER_STATEMENT:         intPeparSize=8 ;break;  //Statement、5    1/2 × 8 1/2 インチ
            case DMPAPER_EXECUTIVE:         intPeparSize=9 ;break;  //Executive、7    1/4 × 10 1/2インチ
            case DMPAPER_A3   :             intPeparSize=10;break;  //シート、        297 × 420 mm
            case DMPAPER_A4SMALL:           intPeparSize=11;break;  //A4 small シート 210 × 297 mm
            case DMPAPER_A5 :               intPeparSize=12;break;  //A5 シート、     148 × 210 mm
            case DMPAPER_B4 :               intPeparSize=13;break;  //B4 シート、     250 × 354 mm
            case DMPAPER_B5 :               intPeparSize=14;break;  //B5 シート、     182 × 257 mm
            case DMPAPER_FOLIO :            intPeparSize=15;break;  //Folio、8        1/2 × 13    インチ
            case DMPAPER_QUARTO:            intPeparSize=16;break;  //Quarto、        215 × 275 mm
            case DMPAPER_10X14 :            intPeparSize=17;break;  //                 10 × 14    インチ シート
            case DMPAPER_11X17 :            intPeparSize=18;break;  //                 11 × 17    インチ シート
            case DMPAPER_NOTE  :            intPeparSize=19;break;  //Note、 8        1/2 × 11    インチ
            case DMPAPER_ENV_9 :            intPeparSize=20;break;  //#9 Envelope、3  7/8 × 8 7/8 インチ
            case DMPAPER_ENV_10:            intPeparSize=21;break;  //#10 Envelope、4 1/8 × 9 1/2 インチ
            case DMPAPER_ENV_11:            intPeparSize=22;break;  //#11 Envelope、4 1/2 × 10 3/8インチ
            case DMPAPER_ENV_12:            intPeparSize=23;break;  //#12 Envelope、4 3/4 × 11    インチ
            case DMPAPER_ENV_14:            intPeparSize=24;break;  //#14 Envelope、    5 × 11 1/2インチ
            case DMPAPER_ENV_DL:            intPeparSize=25;break;  //DL Envelope、   110 × 220 mm
            case DMPAPER_ENV_C5:            intPeparSize=26;break;  //C5 Envelope、   162 × 229 mm
            case DMPAPER_ENV_C3:            intPeparSize=27;break;  //C3 Envelope、   324 × 458 mm
            case DMPAPER_ENV_C4:            intPeparSize=28;break;  //C4 Envelope、   229 × 324 mm
            case DMPAPER_ENV_C6:            intPeparSize=29;break;  //C6 Envelope、   114 × 162 mm
            case DMPAPER_ENV_C65:           intPeparSize=30;break;  //C65 Envelope、  114 × 229 mm
            case DMPAPER_ENV_B4:            intPeparSize=31;break;  //B4 Envelope、   250 × 353 mm
            case DMPAPER_ENV_B5:            intPeparSize=32;break;  //B5 Envelope、   176 × 250 mm
            case DMPAPER_ENV_B6:            intPeparSize=33;break;  //B6 Envelope、   176 × 125 mm
            case DMPAPER_ENV_ITALY:         intPeparSize=34;break;  //Italy Envelope、110 × 230 mm
            case DMPAPER_ENV_MONARCH:       intPeparSize=35;break;  //Monarch Envelope、3       7/8 × 7 1/2 インチ
            case DMPAPER_ENV_PERSONAL:      intPeparSize=36;break;  // 6 3/4 Envelope、3        5/8 × 6 1/2 インチ
            case DMPAPER_FANFOLD_US:        intPeparSize=37;break;  //US Std Fanfold、14        7/8 × 11    インチ
            case DMPAPER_FANFOLD_STD_GERMAN:intPeparSize=38;break;  //  German Std Fanfold、8   1/2 × 12    インチ
            case DMPAPER_FANFOLD_LGL_GERMAN:intPeparSize=39;break;  //  German Legal Fanfold、8 1/2 × 13    インチ
            case DMPAPER_JAPANESE_POSTCARD :intPeparSize=40;break;  //官製ハガキ
            default:return;
            }

switch(pDevMode->dmOrientation){
            case DMORIENT_PORTRAIT :intPeoarPrientetion=1;break;//縦方向
            case DMORIENT_LANDSCAPE:intPeoarPrientetion=2;break;//横方向
            default:return;
            }
//=========================================================================
UpdateAllViews(NULL,HINT_SIZE_CHENG,this);

}


使い方はこの後説明します


BEGIN_MESSAGE_MAP

この部分はウインドウズから自動的に呼びだされます。

フォ-ビュ内の先頭部分にControlPracticeViewクラスのメッセ-ジ.マップの記載内容

IMPLEMENT_DYNCREATE(ControlPracticeView, CFormView)

BEGIN_MESSAGE_MAP(ControlPracticeView, CFormView)
ON_WM_SIZE()
ON_WM_DRAWITEM()
ON_WM_MEASUREITEM()
ON_BN_CLICKED(IDNO, &ControlPracticeView::OnBnClickedNo)
ON_BN_CLICKED(IDOK, &ControlPracticeView::OnBnClickedOk)
END_MESSAGE_MAP()

印刷するのには他の機能も強制的に要求される

例えば文字の印字これもグラフィックでピクセル単位で制御する事が必要です、又BMPの印刷も同じで更にはカラ-の印字も必要でこれらの多数操作はMSFが自動的に所定の関数を呼び出すのです、その関数が無ければシステムダウンです、本当にめんどくさいのですが仕方が有りません。

  • BOOL ControlPracticeView::OnPreparePrinting(CPrintInfo* pInfo)
  • void ControlPracticeView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
  • void ControlPracticeView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
  • void ControlPracticeView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
  • /////////////////////  縦ページ    /////////////////////////////////////
  • void ControlPracticeView::MyPrinteDrwTypeV(CDC* pDC, CPrintInfo* pInfo)
  • //////////////////////  縦2ページ~ /////////////////////////////////////
  • void ControlPracticeView::MyPrinteDrwTypeSecoundV(CDC* pDC, CPrintInfo* pInfo)
  • ///////////////////////// 横ページ  //////////////////////////////////////
  • void ControlPracticeView::MyPrinteDrwTypeH(CDC* pDC, CPrintInfo* pInfo)
  • //////////////////////  横2ページ~ /////////////////////////////////////
  • void ControlPracticeView::MyPrinteDrwTypeSecoundH(CDC* pDC, CPrintInfo* pInfo)
  • void ControlPracticeView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
  • void ControlPracticeView::PrintPageHeader(CDC* pDC, CPrintInfo* pInfo,CString& strHeader)

上記の様に沢山の関数が必要になるんです、本当に大変なんです、これだけの関数があつて初めて印刷が可能になります。


http://印刷機構を組み込むヘッダ-ファイル完全版PDF