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 小さいと仮定することですが、何か足りないような気がしますか?