我自己画的一个表格,并想用指定的纸打印出来
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纸的左上角打印了只有银行卡大小的表格,请教高手我应该怎样解决?
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纸的左上角打印了只有银行卡大小的表格,请教高手我应该怎样解决?
解决方案 »
- HttpSendRequest连接成功后断线问题
- 如何让窗体显示在最前面,但不能获得焦点
- 恳请大家帮我入入门,谢谢
- [求助]状态栏问题:GetPaneInfo()的用法.......在线等!
- 怎样实现win2000类似的添加删除程序的ListCtrl
- 一个参数不知道是什么意思? (解决马上结贴,最迟两天)
- 求显微镜控制软件
- 提高结贴率的办法,同意的来up一下********************* :>
- ==如何隐藏窗口的标题栏??
- 我的VC++的书不好!有人知道什么VC++的书好吗?还有,哪里有电子的VC类大全?谢谢
- CComboBox 下拉菜单只有一个象素高!WHY?
- 请问大家:有了解Jabber技术或有过Jabber开发经历的人马?
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);
}
在打印时的GetClientRect得到的是什么?
第二:A4纸的尺寸应该是2970*2100mm,所以建议你用MM_LOMETRIC这样容易控制一点。
以上两点你若明白了便可以解决
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 = ◎#%……¥#%※
A tutorial demonstration printing in different map mode