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 );

ここで、ハードコードされた値などを無視します - これは問題の単なる例です - 印刷ダイアログで [OK] をクリックした後 (OnDraw に渡された CDC* がプリンターの DC である場合)、取得した rect の値は次のとおりです。左 = 0、上 = 0、右 = 2010、下 = -2880 で、幅変数と高さ変数の値はそれぞれ 201 と 288 です。次に、201x288mm のボックスを描きます。これは、クリッピングされた右手と下の線なしで印刷されます。次に、問題を確認するために、PtVisible を呼び出してさまざまなポイントをチェックします。このチェックに失敗するポイントは次のとおりです。

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

私が示したコードは、生成されたプログラムに対して行った唯一の編集です。これが本当に問題であることを誰かが確認できますか? もしそうなら、これに対処するための正しいアプローチは何ですか?私の直感は、GetDeviceCaps() から取得した情報を「調整」し、幅と高さが報告されているよりも 0.1 mm 小さいと仮定することですが、何か足りないような気がしますか?

4

0 に答える 0