1、我的工程在打印时,通过GetClientRect(&rect);而后在rect.right范围内打印曲线(横向打印),结果打印出来的图,只在纸的左边区域,右侧大概1/5区域是空白的,打印曲线的点是800点。
2、我尝试把rect.right扩大一个倍数,发现,放大足够倍数后,能够将曲线打印到全部区域,但是相应的问题又出现了。
放大1.5倍:rect.right =rect.right*1.5; 在整张纸上打印了478点
放大1.3倍: rect.right =rect.right*1.3; 在整张纸上打印了565点
这个倍数对于不同的打印设置肯定是不一样的,即使我找出一个特别合适的比例(应该小于1.3),换台机器可能就不行了。
3、我尝试获取打印尺寸
int cxPage = dc->GetDeviceCaps(HORZRES);// 获取打印页面的水平宽度(象素)
而后用这个尺寸与rect.right相比,即 int zommindex = dc->GetDeviceCaps(HORZRES)/rect.right;这个值求出来是2,这就更不对了。另外说明一下,我设置了onprepareDC函数
void CYuhtView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
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);}请高手指点。
2、我尝试把rect.right扩大一个倍数,发现,放大足够倍数后,能够将曲线打印到全部区域,但是相应的问题又出现了。
放大1.5倍:rect.right =rect.right*1.5; 在整张纸上打印了478点
放大1.3倍: rect.right =rect.right*1.3; 在整张纸上打印了565点
这个倍数对于不同的打印设置肯定是不一样的,即使我找出一个特别合适的比例(应该小于1.3),换台机器可能就不行了。
3、我尝试获取打印尺寸
int cxPage = dc->GetDeviceCaps(HORZRES);// 获取打印页面的水平宽度(象素)
而后用这个尺寸与rect.right相比,即 int zommindex = dc->GetDeviceCaps(HORZRES)/rect.right;这个值求出来是2,这就更不对了。另外说明一下,我设置了onprepareDC函数
void CYuhtView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
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);}请高手指点。
解决方案 »
- 既然可以用SubClassWindow/SubClassDlgItem来子类化控件,为何MFC要用WH_CBT钩子来过滤消息?
- DDB和DIB怎么区别?
- CSliderCtrl如何设Thumb的透明度
- 项目合作
- 求gdiplus.h的vc6 的下载网址
- 刚开始学OpenGL,认真两字真重要,向本版的前辈学习!!
- 我们公司有个家伙一直用"net send "搔扰我,能不能写个程序还击他,100分一定送上
- 有没有电子书,关于vc 的 odbc( 用了sql server 2000做数据库)编程的书
- 如何在button上添加Bitmap?
- 请教高手如何编写键盘双击?
- 举报 AvalonXP 发恶意回帖
- html源文件获取
void CPrintLeftView::OnDraw(CDC* pDC)
{
CPrintLeftDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); CRect rect;
GetClientRect(&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, 1, RGB(220, 220, 220));
CPen* pOldPen = pDC->SelectObject(&newPen);
CPen BoldLine(PS_SOLID, (int)1.5, RGB(220,220,220)); int x_times=3;
for(int i=0;i*100<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;//60/x_times;
nextxGrid.y = nextxGrid.y+100;//60/x_times;
}
pDC->SelectObject(pOldPen);
preyGrid.x=0;
preyGrid.y=0;
nextyGrid.x=0;
nextyGrid.y=rect.Height(); for(int i=0;i*120<rect.Width();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;
} }void CPrintLeftView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
if (pDC->IsPrinting())
{
LPDEVMODE dm = pInfo->m_pPD->GetDevMode();
dm->dmOrientation = DMORIENT_LANDSCAPE;
pDC->ResetDC(dm);
// 约束长宽比例缩放
RECT rc;
GetClientRect(&rc);
int ppiX = pDC->GetDeviceCaps(LOGPIXELSX);
int ppiY = pDC->GetDeviceCaps(LOGPIXELSY);
int pixelsX = pDC->GetDeviceCaps(HORZRES);
int pixelsY = pDC->GetDeviceCaps(VERTRES);
double inchX = (double)pixelsX/ppiX;
double inchY = (double)pixelsY/ppiY;
double scaleX = inchX*96/rc.right;
double scaleY = inchY*96/rc.bottom;
double scale = min(scaleX, scaleY); pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(rc.right, rc.bottom);
pDC->SetViewportExt(scale*rc.right/96*ppiX, scale*rc.bottom/96*ppiY);
} CView::OnPrepareDC(pDC, pInfo);
}
比如从距顶边0.5英寸,左边0.5英寸处打印一条2英寸的横线.
pDC->MoveTo( (int)(0.5 * 1440), (0.5 * 1440) );
pDC->LineTo( (int)(2.5 * 1440), (0.5 * 1440) );
这种方式我试过多种打印机, 多种打印分辨率的情况下,打印出的线不会有大的变化.你可以根据打印的页边距, 计算打印范围内的像素点, 再根据打印的像素点和屏幕像素点计算出一个系数, 在打印时将屏幕像素乘上这个系数输出, 基本上就没错了.
pDC->MoveTo( (int)(0.5 * 1440), (int)(-0.5 * 1440) );
pDC->LineTo( (int)(2.5 * 1440), (int)(-0.5 * 1440) );
不然你打印机输出的比例肯定有问题!
我以前也遇到过比例问题
这个东西只能根据自己输出情况然后算好比例
我改成
double scale = max(scaleX, scaleY);
就能画出正确的图了,您看对不对
pDC->SetViewportExt(pixelsX, pixelsY);
rc.right = rc.right/120*120;
rc.bottom = rc.bottom/100*100;
rc.right = rc.right/120*120 + 1;
rc.bottom = rc.bottom/100*100 + 1;