哪位高手尝试一下我的代码,我做了3天了,还是没有结果
建立一个单文档单视图工程PrintOneView,而后在视图类ondraw函数中画了一些格子,如下,
void CPrintOneViewView::OnDraw(CDC* pDC)
{
CPrintOneViewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect); CPoint prePoint,nextPoint;
CPoint prexGrid,nextxGrid;
CPoint preyGrid,nextyGrid;
prexGrid.x=0;
prexGrid.y=0;
nextxGrid.x=rect.Width();
nextxGrid.y =0;
CPen newPen;
newPen.CreatePen(PS_DOT, 4, RGB(220, 220, 220));
CPen* pOldPen = pDC->SelectObject(&newPen);
CPen BoldLine(PS_SOLID, 4.5, RGB(220,220,220));
for(int i=0;i<rect.Height();i++)//画背景横线
{ if(i%5==0)
{
pDC->SelectObject(&BoldLine);
pDC->MoveTo(prexGrid);
pDC->LineTo(nextxGrid);
pDC->SelectObject(&newPen);
}
else
{
pDC->MoveTo(prexGrid);
pDC->LineTo(nextxGrid); }
prexGrid.y = prexGrid.y+100;
nextxGrid.y = nextxGrid.y+100;
} pDC->SelectObject(pOldPen); preyGrid.x=0;
preyGrid.y=0;
nextyGrid.x=0;
nextyGrid.y =rect.Height()*2; for(i=0;i <rect.Width()-1;i++)//画背景竖线
{ if(i%5==0)//5小格等于1大格
{ pDC->SelectObject(&BoldLine);
pDC->MoveTo(preyGrid);
pDC->LineTo(nextyGrid);
pDC->SelectObject(pOldPen);
}
else
{ pDC->SelectObject(&newPen);
pDC->MoveTo(preyGrid);
pDC->LineTo(nextyGrid);
pDC->SelectObject(pOldPen);
} preyGrid.x=preyGrid.x+120;
nextyGrid.x=nextyGrid.x+120;
}
}运行工程,显示格子。点击打印,打出来的格子和屏幕上的差很多,怎么会这样呢?
2、加入了一个OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 函数,里面的具体设置不太明白,论坛上copy过来的。
void CPrintOneViewView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
if(pDC->IsPrinting()) //横向打印
{
LPDEVMODE pDevMode;
pDevMode=pInfo->m_pPD->GetDevMode();
pDevMode->dmOrientation=DMORIENT_LANDSCAPE;
pDC->ResetDC(pDevMode);
} CView::OnPrepareDC(pDC, pInfo);
long iLogPixelX=pDC->GetDeviceCaps(LOGPIXELSX);
long iLogPixelY=pDC->GetDeviceCaps(LOGPIXELSY); pDC->SetMapMode(MM_ANISOTROPIC); //转换坐标映射方式、确定窗口大小
CSize size = CSize(6000, 5000); //我试过别的数,结果一样
pDC->SetWindowExt(size);
int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX); //得到实际设备每逻辑英寸的象素数量
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
long xExt = (long)size.cx *xLogPixPerInch/96; //得到设备坐标和逻辑坐标的比例
long yExt = (long)size.cy *yLogPixPerInch/96;
pDC->SetViewportExt((int)xExt, (int)yExt);
}
结果还是打出来不对,请高手尝试一下,多谢!
建立一个单文档单视图工程PrintOneView,而后在视图类ondraw函数中画了一些格子,如下,
void CPrintOneViewView::OnDraw(CDC* pDC)
{
CPrintOneViewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect); CPoint prePoint,nextPoint;
CPoint prexGrid,nextxGrid;
CPoint preyGrid,nextyGrid;
prexGrid.x=0;
prexGrid.y=0;
nextxGrid.x=rect.Width();
nextxGrid.y =0;
CPen newPen;
newPen.CreatePen(PS_DOT, 4, RGB(220, 220, 220));
CPen* pOldPen = pDC->SelectObject(&newPen);
CPen BoldLine(PS_SOLID, 4.5, RGB(220,220,220));
for(int i=0;i<rect.Height();i++)//画背景横线
{ if(i%5==0)
{
pDC->SelectObject(&BoldLine);
pDC->MoveTo(prexGrid);
pDC->LineTo(nextxGrid);
pDC->SelectObject(&newPen);
}
else
{
pDC->MoveTo(prexGrid);
pDC->LineTo(nextxGrid); }
prexGrid.y = prexGrid.y+100;
nextxGrid.y = nextxGrid.y+100;
} pDC->SelectObject(pOldPen); preyGrid.x=0;
preyGrid.y=0;
nextyGrid.x=0;
nextyGrid.y =rect.Height()*2; for(i=0;i <rect.Width()-1;i++)//画背景竖线
{ if(i%5==0)//5小格等于1大格
{ pDC->SelectObject(&BoldLine);
pDC->MoveTo(preyGrid);
pDC->LineTo(nextyGrid);
pDC->SelectObject(pOldPen);
}
else
{ pDC->SelectObject(&newPen);
pDC->MoveTo(preyGrid);
pDC->LineTo(nextyGrid);
pDC->SelectObject(pOldPen);
} preyGrid.x=preyGrid.x+120;
nextyGrid.x=nextyGrid.x+120;
}
}运行工程,显示格子。点击打印,打出来的格子和屏幕上的差很多,怎么会这样呢?
2、加入了一个OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 函数,里面的具体设置不太明白,论坛上copy过来的。
void CPrintOneViewView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
if(pDC->IsPrinting()) //横向打印
{
LPDEVMODE pDevMode;
pDevMode=pInfo->m_pPD->GetDevMode();
pDevMode->dmOrientation=DMORIENT_LANDSCAPE;
pDC->ResetDC(pDevMode);
} CView::OnPrepareDC(pDC, pInfo);
long iLogPixelX=pDC->GetDeviceCaps(LOGPIXELSX);
long iLogPixelY=pDC->GetDeviceCaps(LOGPIXELSY); pDC->SetMapMode(MM_ANISOTROPIC); //转换坐标映射方式、确定窗口大小
CSize size = CSize(6000, 5000); //我试过别的数,结果一样
pDC->SetWindowExt(size);
int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX); //得到实际设备每逻辑英寸的象素数量
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
long xExt = (long)size.cx *xLogPixPerInch/96; //得到设备坐标和逻辑坐标的比例
long yExt = (long)size.cy *yLogPixPerInch/96;
pDC->SetViewportExt((int)xExt, (int)yExt);
}
结果还是打出来不对,请高手尝试一下,多谢!
| |
| |
| |
| |
| | 图1
| |
| |
------------------------------
| |
| |
| | 图2
| |
------------------------------------------
| |
| |
| |
| |
| | 图3
| |
------------------------你在OnDraw里面绘图的时候是用的图1的区域绘制网格 打印的时候却打印在图2的区域上 那图2比图1宽度上多出来的部分就没有了网格。主要问题我想应该是在这里的。建议楼主将上面的代码这样改一下:
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect);
CPoint prePoint,nextPoint;
CPoint prexGrid,nextxGrid;
CPoint preyGrid,nextyGrid;
prexGrid.x=0;
prexGrid.y=0;
nextxGrid.x=rect.Width()*2; //绘制两倍宽度区域 也就是图3对应的区域
既然是打印到横向纸张上 那就要考虑到 绘图也要能准确地绘制到横向打印的所有区域上 不然就会产生截断了。如果还有其他问题 楼主可以发站内私信。
请问能不能事先知道图2的具体尺寸呢?这样的话我就可以调整格子的比例,我想画同样多的格子,
但是另外有个问题,横向和纵向的比例是不是不一样,这时该怎么做?
这本书当中应该将的比较详细 楼主看过后应该能深入的了解打印中的一些具体问题。
根据实际区域比例和大小动态调整格子的大小,like as follows
if (pDC->m_bPrinting)
{
m_nAutoPixelWidth = m_nPrintPixelWidth;
m_nAutoPixelHeight = m_nPrintPixelHeight;
m_nAutoTextHeight = m_nPrintTextHeight;
m_nAutoTextWidth = m_nPrintTextWidth;
}
else
{
m_nAutoPixelWidth = m_nPixelWidth;
m_nAutoPixelHeight = m_nPixelHeight;
m_nAutoTextHeight = m_nTextHeight;
m_nAutoTextWidth = m_nTextWidth;
}
然后再OnDraw就不用考虑什么了