2010-06-29 55 views
5

我正在寫一個非託管的Win32 C++函數來獲取位圖的句柄,我需要對它進行繪製。如何繪製給定的位圖句柄(C++/Win32)?

我的問題是,繪製我需要獲取設備上下文,但是當我做GetDC(NULL)時,它給了我一個WINDOW設備上下文! GetDC()的參數是一個窗口句柄(HWND),但我沒有窗口;只是一個位圖句柄。

如何在此位圖上繪圖?謝謝!

回答

2

除了帕維爾的回答,「與屏幕兼容」總是竊聽我也一樣,但由於CreateCompatibleDC(NULL)普遍用於這一目的,我認爲這是正確的。

我認爲「兼容」的事情只與DDB有關(DC設置爲在當前屏幕上寫入正確的DDB類型),但不影響DIB上的讀/寫。

因此,爲了安全起見,如果您需要處理不需要臨時屏幕上顯示的位圖,則始終使用DIB而不是DDB,但現在性能差異可以忽略不計。有關DIB和DDB的更多信息,請參見here

1

CreateCompatibleDC()和SelectObject()將你的位圖放入它。

但是,並非每個位圖都可以選擇到任何DC中。 您可能需要使用映射模式和其他內存DC選項。

+0

但CreateCompatibleDC()將HDC作爲參數。如果我有HDC,我不需要創建一個! (有沒有我忽略的東西?) – user20493 2010-06-29 20:13:58

+2

'CreateCompatibleDC'可以將NULL作爲參數,並創建一個與應用程序屏幕兼容的內存DC。然後,您可以選擇您的位圖在其中,如Pavel所說,您可以將CreateCompatibleBitmap()和BitBlt()放入DC中。 – 2010-06-29 20:18:43

+0

我想繪製一個8bpp位圖。這當然與應用程序屏幕不兼容。是否可以使用這樣的位圖? – user20493 2010-06-29 20:29:19

0

在位圖上繪製的基本win32範例是您將位圖選擇到設備上下文中,之後,該設備上下文中的所有繪製操作都存儲在位圖中。然後,您可以使用各種「細微」操作之一(例如StretchBlt)將其轉移到顯示錶面,這只是窗口客戶區的設備上下文。

其他人提供了更好的細節,這只是高層次的看法。

+0

感謝您的回覆,但我需要存儲8bpp圖像,這與顯示不兼容。這是問題的根源(沒有雙關語意思)。 – user20493 2010-07-01 15:21:44

+0

@alankdkd:好的,沒有說你必須顯示一個位圖,但你仍然可以使用GDI操作來以這種方式繪製它們。如果您需要獲取不尋常的像素組織,您可能需要查看CreateDIBitmap()或CreateDIBSection()。 – JustJeff 2010-07-01 20:01:42

0

好了,這是禁區外一點..我想..但我確實知道,Graphics可以return a HDC,並且Graphics採取Bitmap作爲參數傳遞給它的ctor。 A Bitmap又可以是created from a HBITMAP and a HPALETTE。這裏唯一的問題是,我不知道HPALETTE參數是否可以是NULL

Graphics* g; 
Bitmap* bitmap; 
HBITMAP _bitmap; // <- this one is yours 

bitmap = Bitmap::FromHBITMAP(_bitmap, NULL); 
g = new Graphics(bitmap); 

HDC hdc = g->GetHDC(); 

// when done, call g->ReleaseHDC(hdc); 

不過,我勸你收到HDC作爲參數傳遞給你的函數,以及..我不認爲任何人都會有一個位圖,並沒有足夠的DC吧。
如果您在將HDC發現到HBITMAP時遇到了這些問題,其他人也會這樣。

+0

感謝您的建議,但這必須在非託管Win32中,(不幸的是)沒有Graphics類。 – user20493 2010-07-01 14:20:35