我自己画的一个表格,并想用指定的纸打印出来
void CXXX::OnInitialUpdate()
{
int iPaperWidth = 210;
int iPaperHeight = 297; // 用A4纸纵向打印 int iCxPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int iCyPerInch = pDC->GetDeviceCaps(LOGPIXELSY); m_iCX = (int)(iPaperWidth / 25.4 * iCxPerInch);
m_iCY = (int)(iPaperHeight / 25.4 * iCyPerInch); CSize sizeTotal;
sizeTotal.cx = m_iCX;
sizeTotal.cy = m_iCY;
SetScrollSizes(MM_TEXT, sizeTotal);}void CXXX::(CDC* pDC)
{
CRect rectClient;
GetClientRect(rectClient); // 用rectClient定位画表格,代码太长,省略
}void CXXX::OnPopupPrint() // 自己添加的打印函数
{
PRINTDLG  pd;  
pd.lStructSize = sizeof(PRINTDLG);  
pd.Flags = PD_RETURNDC | PD_NONETWORKBUTTON | PD_SHOWHELP | PD_PRINTSETUP;  
pd.hDC = NULL;  
pd.hwndOwner = NULL;  
pd.hInstance = NULL;  
pd.nMaxPage = 1;  
pd.nMinPage = 1;  
pd.nFromPage = 1;  
pd.nToPage = 1;  
pd.nCopies = 1;  
pd.hDevMode = NULL;  
pd.hDevNames = NULL;  //显示打印对话框,由用户来设定纸张大小等。  
if (!PrintDlg(&pd)) 
{
return;
} DOCINFO di;
di.cbSize = sizeof(DOCINFO);  
di.lpszDocName = "表格打印";  
di.lpszOutput = (LPTSTR)NULL;  
di.lpszDatatype = (LPTSTR)NULL;  
di.fwType = 0;   StartDoc(pd.hDC, &di);  
StartPage(pd.hDC);  CDC* pDC = new CDC;
pDC->Attach(pd.hDC); OnDraw(pDC); EndPage(pd.hDC);  
EndDoc(pd.hDC);   //打印结束 
delete pDC;
DeleteDC(pd.hDC); 
}在程序上能表格正确显示,但打印出来的只在A4纸的左上角打印了只有银行卡大小的表格,请教高手我应该怎样解决?

解决方案 »

  1.   

    PRINTDLG pd;
    LPDEVMODE lpDevMode;
    if(AfxGetApp()->GetPrinterDeviceDefaults(&pd))
    {
    lpDevMode=(LPDEVMODE)GlobalLock(pd.hDevMode);
    if(lpDevMode)
    {
    lpDevMode->dmPaperSize=DMPAPER_A4; 
    lpDevMode->dmOrientation=DMORIENT_PORTRAIT; 
    lpDevMode->dmPrintQuality=600;//这个要视你的打印驱动的默认分辨率为准,如果该值设置不正确,可能会引起排版的混乱
    }
    GlobalUnlock(pd.hDevMode);
    }
      

  2.   

    怎么没有人回复了?
    在打印时的GetClientRect得到的是什么?
      

  3.   

    第一:不应该用MM_TEXT映射模式,否则会导致你现在出现的情况;
    第二:A4纸的尺寸应该是2970*2100mm,所以建议你用MM_LOMETRIC这样容易控制一点。
    以上两点你若明白了便可以解决
      

  4.   

    楼主忘记了对打印机DC进行设置,建议重载View中几个虚函数,而不是自己从头写一段代码来控制打印机输出,呵呵
      

  5.   

    1.在doc里设计获取打印行数的函数
    2.在View的OnPreparePrinting里设置最大页数
    3.在View的OnPrint里把要打印的东西按页数和打印机尺寸单位画一遍
    4.完了要想获得正确的打印机里的尺寸,
    在OnPreparePrinting里用GetDeviceCaps函数获取打印机的有效宽度(h)、长度(v)、每英寸X轴象素点数(logxpixel)和每英寸Y轴象素点数(logypixel),并取得屏幕显示的每英寸X轴象素点数和每英寸Y轴象素点数,那么
    在打印机里要显示的x宽度 = 屏幕单位的x宽度 × 打印机单位的x每英寸象素点÷ 屏幕单位的x每英寸象素点如果屏幕x宽度是 100,屏幕的logxpixel = 96/inch,打印机的logxpixel = 600/inch
    那么在打印机上应该显示的宽度是 100 × 600 ÷ 96 = ◎#%……¥#%※
      

  6.   

    还是不太明白,谁能发给我个例子[email protected]
      

  7.   

    http://www.fruitfruit.com/vc/release/post/print.htm
    A tutorial demonstration printing in different map mode