为什么打印机设备上下文小于MFC中报告的?

时间:2012-06-15 13:10:23

标签: c++ printing mfc gdi

使用MFC打印时遇到问题。问题是我被告知可打印区域是201x288mm,但我实际上发现它是200.9x287.9mm。

为了说明这个问题,我使用向导在Visual Studio 2008中创建了一个空白的TabbedDocument MFC应用程序。在我的“视图”类(CPrintingExampleView - PrintingExample是我给测试项目的名称)中,我将以下代码添加到OnDraw(CDC * pDC)方法中:

pDC->SetMapMode( MM_LOMETRIC );

int width = GetDeviceCaps( pDC->m_hDC, HORZSIZE );
int height = GetDeviceCaps( pDC->m_hDC, VERTSIZE );

// TODO: add draw code for native data here
RECT rect;
int result = pDC->GetClipBox( (LPRECT)&rect );

//draw a 201x288mm square
pDC->MoveTo( 0, 0 );
pDC->LineTo( 2010, 0 );
pDC->LineTo( 2010, -2880 );
pDC->LineTo( 0, -2880 );
pDC->LineTo( 0, 0 );

BOOL visible = pDC->PtVisible( 0, 0 );
visible = pDC->PtVisible( 0, -1 );
visible = pDC->PtVisible( 1, 0 );
visible = pDC->PtVisible( 1, -1 );
visible = pDC->PtVisible( rect.right, rect.bottom );
visible = pDC->PtVisible( rect.right-1, rect.bottom+1 );
visible = pDC->PtVisible( rect.right-1, rect.bottom );
visible = pDC->PtVisible( rect.right, rect.bottom+1 );

现在,忽略硬编码值等 - 这只是问题的一个例子 - 在打印对话框上单击“确定”后(当CDC *传递给OnDraw时是打印机的DC),rect I的值get are:left = 0,top = 0,right = 2010,bottom = -2880,它与width和height变量的值分别为201和288。 接下来我画了201x288mm的盒子,这种打印没有右手和底线,这些都是剪裁的。 然后为了确认问题,我打电话给PtVisible检查各点,唯一没有通过检查的点是:

    (rect.right, rect.bottom)
    (rect.right-1, rect.bottom)
    (rect.right, rect.bottom+1)

我所显示的代码是我对生成的程序进行的唯一编辑。任何人都可以确认这确实是个问题吗?如果是这样,任何人都可以建议处理这个问题的正确方法是什么?我的直觉是“调整”从GetDeviceCaps()中检索到的信息,并假设宽度和高度比报告的小0.1mm,但我觉得我错过了什么?

0 个答案:

没有答案