2013-08-23 58 views
0

我有一個修復我做,讓打印的洪水填充的對象的一個​​問題...與內存DC BitBlt的問題從打印機創建DC

所以,完整的故事是我們使用Windows的GDI FloodFill功能,我們注意到它並不適用於打印機,所以我在inet上發現的是創建一個內存DC,與打印機DC兼容,並將所有繪圖操作都放在內存DC上,然後一次將BitBlt全部打印到打印機直流電(我不得不改變使用遞歸的顏色替換氾濫填充功能,因爲內存直流只允許主直流電做什麼)

問題是內存直流似乎是一個像素或兩個更大的x和y,但我不知道該怎麼做,當我從內存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; 

UPDATE(9月5日):

這裏是一個PDF打印一個鏈接,我直畫到打印機DC: hPrnDC.pdf

這裏是相同的,但我畫到內存DC然後BitBlt它到打印機DC: hMemPrnDC.pdf

現在,我確實在第二次啓用了我的遞歸泛洪填充功能,以顯示我們正在嘗試實現的一個示例,但沒有它的情況下也是這樣,所以這不是問題

如您所見,底部和右側邊緣被切斷,我也關注字體&兩者之間的線寬差異,但不像上膠不匹配那麼多

注意:頂部打印的文件名不通過內存DC,這是總是直接打印到DC打印機DC

+0

你是什麼意思的「一個像素或兩個更大」?你看到了什麼結果? –

+0

對不起,我沒有看到你的帖子,直到今天 這裏是一個PDF打印的鏈接,我直接打印到DC打印機: [鏈接](http://www.winsim.com/stackoverflow/hPrnDC。 pdf) &這裏是一樣的,但我畫到內存DC然後BitBlt它打印機DC: [鏈接](http://www.winsim.com/stackoverflow/hMemPrnDC。pdf) 現在,我確實啓用了我的遞歸洪水填充功能,以展示我們正在嘗試實現的示例 您可以看到,bttm和右邊緣被切斷,我也關注在字體和線的重量差異,但沒有那麼多的尺寸不匹配 謝謝, 斯科特 –

+0

你明確地設置矩形1大於大小。你爲什麼驚訝它會出現1像素大? –

回答

1

我發現了一個解決方案,我的問題,更多的解決方法,但它取得了預期的結果...

我只在需要遞歸填充(GetPixel和SetPixel)的項目之間使用內存DC,因此我先將它們繪製到內存DC,然後將它們全部複製到打印機DC,然後繪製所有內容否則直接打印機DC,似乎工作得很好

感謝您的幫助!