很复杂。
首先用PrintDlg得到一个hPrinterDC;
然后计算打印纸的大小用GetDeviceCaps以计算每页能打印的字符数。
case WM_COMMAND:
switch(LOWORD(wParam))
{
   case ID_FILE_PRINT:
{
     DOCINFO di = {sizeof(DOCINFO),szAppName};//程序名
     if(StartDoc(hPrinterDC, &di) >0)
          for( int i = 0; i< num_Pages; i++)
          { 
             if(StartPage(hPrinterDC) <0)
                   break;
                //drawing functions;
               if(EndPage(hPrinterDC) <0)
                break;
            }
}

解决方案 »

  1.   

    下面是我做的一个打印基础类/*******************************************************************/
    /*                                                                 */
    /*    関数名称: 字体セット                                     */
    /*                                                                 */
    /*    機能概要: 印刷用の字体をセットする                         */
    /*                                                                 */
    /*  呼出形式: print->SetFont(height,weight,bItalic       */
    /*                              ,bUnderline,font)                  */
    /*               int height(i)    :文字の高さ                   */
    /*               int weight(i)    :文字の広さ                   */
    /*               BOOL bItalic(i)   :斜字の設定                   */
    /*               BOOL bUnderline(i)  :下り線の設定                 */
    /*               CString font(i)     :文字の字体                   */
    /*                                                                 */
    /*    復帰値 : 判定結果 無し                                    */
    /*                                                                 */
    /*******************************************************************/
    VOID CPrint::SetFont(INT nHeight,INT nWeight,BOOL bItalic,BOOL bUnderline,CString szFont)
    {
    m_font.Detach();
    m_font.CreateFont(nHeight,0,0,0,nWeight,bItalic,bUnderline,0,DEFAULT_CHARSET,0,0,0,0,szFont);
    }
    /*******************************************************************/
    /*                                                                 */
    /*    関数名称: プリンター初期化処理                              */
    /*                                                                 */
    /*    機能概要: システムの通常使うプリンターを取得する          */
    /*               ページの部局をセットする                */
    /*               プリンターの印刷方式をセットする                  */
    /*                                                                 */
    /*  呼出形式: print->InitPrint()                        */
    /*                                                                 */
    /*    復帰値 : 判定結果                                        */
    /*               TRUE    OK                                        */
    /*               FALSE   ERROR                                     */
    /*                                                                 */
    /*******************************************************************/
    BOOL CPrint::InitPrint()
    {
    CPrintDialog printDlg(FALSE);
    //
    // if (printDlg.DoModal() == IDCANCEL) return false;
    //
    if(!printDlg.GetDefaults())
    {
    return FALSE;
    }
    printDlg.GetDevMode()->dmOrientation = 1;
    printdc.Attach(printDlg.CreatePrinterDC());
    printdc.m_bPrinting = TRUE;
    printdc.SetMapMode(MM_LOMETRIC);
    //
    CString szTitle;
    szTitle.LoadString(AFX_IDS_APP_TITLE);
    //
    ::ZeroMemory (&di, sizeof (DOCINFO));
    di.cbSize = sizeof (DOCINFO);
    di.lpszDocName = szTitle;
    return true;
    }
    /*******************************************************************/
    /*                                                                 */
    /*    関数名称: ページが印刷され始める処理                        */
    /*                                                                 */
    /*    機能概要: Doc印刷開始するし 新しいページ開始する         */
    /*                                                                 */
    /*  呼出形式: print->StartPrint()                        */
    /*                                                                 */
    /*    復帰値 : 判定結果                                        */
    /*               TRUE    OK                                        */
    /*               FALSE   ERROR                                     */
    /*                                                                 */
    /*******************************************************************/
    INT CPrint::StartPrint(VOID)
    {
    INT nPrintingOK = printdc.StartDoc(&di);
    nPrintingOK &= printdc.StartPage(); 
    return nPrintingOK;
    }
    /*******************************************************************/
    /*                                                                 */
    /*    関数名称: 印刷完了処理                               */
    /*                                                                 */
    /*    機能概要: Doc印刷完了する                     */
    /*               字体と印刷Handleを消滅する                        */
    /*                                                                 */
    /*  呼出形式: print->EndPrint()                         */
    /*                                                                 */
    /*    復帰値 : 判定結果 無し                                    */
    /*                                                                 */
    /*******************************************************************/
    VOID CPrint::EndPrint(VOID)
    {
    printdc.EndPage(); 
    printdc.EndDoc();  m_font.Detach();
    printdc.Detach(); 
    ::DeleteDC(printdc); 
    }
    /*******************************************************************/
    /*                                                                 */
    /*    関数名称: 居中印刷                                 */
    /*                                                                 */
    /*    機能概要: 字体をセットする                     */
    /*               指定された矩形の中で居中に文字を描く              */
    /*                                                                 */
    /*  呼出形式: print->PrintStrC(rc, Text)                       */
    /*                RECT rc(i)        :矩形                        */   
    /*                CString Text(i)   :文字                          */
    /*                                                                 */
    /*    復帰値 : 判定結果 無し                                    */
    /*                                                                 */
    /*******************************************************************/
    VOID CPrint::PrintStrC(RECT rc, CString szText)   //居右に 印刷する
    {
    printdc.SelectObject(&m_font);
    printdc.DrawText(szText,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
    }
    /*******************************************************************/
    /*                                                                 */
    /*    関数名称: 居左印刷                                 */
    /*                                                                 */
    /*    機能概要: 字体をセットする                     */
    /*               指定された矩形の中で居左に文字を描く              */
    /*                                                                 */
    /*  呼出形式: print->PrintStrL(rc, Text)                       */
    /*               RECT rc(i)        :矩形                        */
    /*               CString Text(i)   :文字                          */
    /*                                                                 */
    /*    復帰値 : 判定結果 無し                                    */
    /*                                                                 */
    /*******************************************************************/
    VOID CPrint::PrintStrL(RECT rc, CString szText)  //居左に 印刷する
    {
    printdc.SelectObject(&m_font);
    printdc.SetBkMode(TRANSPARENT);
    printdc.DrawText(szText,&rc,DT_SINGLELINE|DT_NOCLIP);
    printdc.SetBkMode(OPAQUE);
    }