0

塗りつぶされたオブジェクトを印刷できるようにするために行った修正に問題があります...

つまり、完全な話は、Windows GDI FloodFill関数を使用していたということですが、これはプリンターでは機能しないことに気付きました。そのため、inetで見つけたのは、プリンターDCと互換性のあるメモリDCを作成し、すべての描画操作を行うことでしたメモリ DC で、それからプリンター DC に一度に BitBlt します (メモリ DC はメイン DC が行ったことしか許可しないため、再帰的な色置換フラッド フィル機能も使用するように変更する必要がありました)。

問題は、メモリ DC が x と y で 1 ピクセルまたは 2 ピクセル大きいように見えることですが、どうすればよいかわかりません。メモリ DC から選択したビットマップを取得すると、正しいサイズであることが示されます。 StretchBlt を使用するのが好きですが、StretchBlt のパラメーターとして使用するためにアクセスできる値は、BitBlt を呼び出すのと同じです。

さらに情報が必要な場合はお知らせください...

前もって感謝します!!!

ここに私のコードがあります:

HDC hMemPrnDC = CreateCompatibleDC (hPrnDC);
HBITMAP hBitmap = CreateCompatibleBitmap (hPrnDC, iWidthLP, iHeightLP);
HBITMAP hOldBitmap = SelectBitmap (hMemPrnDC, hBitmap);

    // paint the whole memory DC with the window color
HBRUSH hBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
RECT rect;
    // add one to right and bottom, FillRect doesnt include the right and bottom edges
SetRect (&rect, 0, 0, iWidthLP + 1, iHeightLP + 1);
    // NOTE: im doing this cause it starts out as all black
FillRect (hMemPrnDC, &rect, hBrush);

    // delete object
DeleteBrush (hBrush);

//
// do all my MoveToEx, LineTo, Ellipse, Arc, TextOut,
// SetPixel, etc calls on hMemPrnDC here
//

    // copy all the memory DC drawing data to the printer DC
BitBlt (hPrnDC, 0, 0, iWidthLP, iHeightLP, hMemPrnDC, 0, 0, SRCCOPY);

    // select old bitmap, and clean up objects
SelectBitmap (hMemPrnDC, hOldBitmap);
DeleteBitmap (hBitmap);
DeleteDC (hMemPrnDC);
hMemPrnDC = NULL;

更新 (9 月 5 日):

これは、プリンターDCに直接描画するPDFプリントへのリンクです: hPrnDC.pdf

これは同じですが、メモリ DC に描画してから、プリンター DC に BitBlt します: hMemPrnDC.pdf

さて、2番目に再帰的なフラッドフィル機能を有効にしました。これは、達成しようとしていることの例を示すためです。それがなくても同じことを行うので、問題はありません

ご覧のとおり、下端と右端が切り取られています。フォントと線の太さの違いも気になりますが、サイズの不一致ほどではありません

注: 上部に印刷されたファイル名はメモリ DC を経由せず、常にプリンタ DC に直接描画されます。

4

1 に答える 1

1

問題の解決策、つまり回避策を見つけましたが、望ましい結果が得られました...

メモリ DC は、再帰的なフラッド フィル (GetPixel と SetPixel) を必要とする項目の間の移動手段としてのみ使用したので、最初にそれらをメモリ DC に描画し、それをすべてプリンター DC にコピーしてから、他のすべてを直接描画します。プリンターDCは問題なく動作しているようです

助けてくれてありがとう!

于 2013-09-11T20:40:30.247 に答える