1

我在使用 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 );

现在,忽略硬编码值等 - 这只是问题的一个说明 - 在打印对话框上单击“确定”后(当传递给 OnDraw 的 CDC* 是打印机的 DC 时),我得到的 rect 值为: 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.1 毫米,但我觉得我错过了什么?

4

0 回答 0