解决方案 »

  1.   

    void CTrainInfoDlg::OnPrint() 
    {
    // TODO: Add your control notification handler code here
    CDC MemDC;
    CBitmap bitmap;
    CDC dc;
    BITMAP bm;
        
    bitmap.LoadBitmap(IDB_BITMAP);
    bitmap.GetBitmap(&bm);
    MemDC.CreateCompatibleDC(&dc);
    MemDC.SelectObject(&bitmap);
    int count = m_listName.GetItemCount();
    CDC* pDC = GetDC(); //获得屏幕分辨率
    double xscreen = pDC->GetDeviceCaps(LOGPIXELSX);
    double yscreen = pDC->GetDeviceCaps(LOGPIXELSY);
    ReleaseDC(pDC); //CPrintDialog dlg (FALSE,PD_RETURNDEFAULT); //构造打印对话框
    CPrintDialog dlg (FALSE,PD_ALLPAGES|PD_COLLATE|PD_NOPAGENUMS|PD_HIDEPRINTTOFILE,NULL); //构造打印对话框
    if (dlg.DoModal() == IDOK)
    {

    dc.Attach(dlg.GetPrinterDC());
    double xprint = dc.GetDeviceCaps(LOGPIXELSX);
    double yprint = dc.GetDeviceCaps(LOGPIXELSY);
    double ratex = (double)(xprint)/xscreen; //计算屏幕和打印机分辨率的比例
    double ratey = (double)(yprint)/yscreen;
    CRect rect(25*ratex,0,dc.GetDeviceCaps(PHYSICALWIDTH)-50*ratex
    ,dc.GetDeviceCaps(PHYSICALHEIGHT)); //打印纸区域
    CRect  Table;
    Table.top=rect.top+bm.bmHeight*ratex;
    Table.left=rect.left;
    Table.right=rect.right;
    Table.bottom=rect.bottom;
    dc.StartDoc("大神救我");
    //开始打印

    for (int i=0;i<count/20;i++)
    {
    dc.StartPage(); //打印新一页
    if (!dc.StretchBlt(0,0,(int)(bm.bmWidth*ratex),(int)(bm.bmHeight*ratex),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY))
    {
    AfxMessageBox("复制失败");
    return;
    }
                                                       DrawNameTable(&dc,Table,count%20,ratex,i);
    dc.EndPage(); }
    if (count%20!=0)
    {
    dc.StartPage();
    if (!dc.StretchBlt(0,0,(int)(bm.bmWidth*ratex),(int)(bm.bmHeight*ratex),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY))
    {
    AfxMessageBox("失败");
    return;
    }
    DrawNameTable(&dc,Table,count%20,ratex,i);
    dc.EndPage();
    }
    // dc.EndPage();
    dc.EndDoc(); //结束打印
    }


    }
      

  2.   

    原因找到了,rect.top值太大了,导致横竖线在另一页!但今天在设备打印机上打印时,报错说if (!dc.StretchBlt(0,0,(int)(bm.bmWidth*ratex),(int)(bm.bmHeight*ratex),&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY))
     {
     AfxMessageBox("复制失败");
    return;
     }
    复制失败!但我在虚拟打印机上测试可以啊!这是什么原因啊!