我正在寫一個非託管的Win32 C++函數來獲取位圖的句柄,我需要對它進行繪製。如何繪製給定的位圖句柄(C++/Win32)?
我的問題是,繪製我需要獲取設備上下文,但是當我做GetDC(NULL)時,它給了我一個WINDOW設備上下文! GetDC()的參數是一個窗口句柄(HWND),但我沒有窗口;只是一個位圖句柄。
如何在此位圖上繪圖?謝謝!
我正在寫一個非託管的Win32 C++函數來獲取位圖的句柄,我需要對它進行繪製。如何繪製給定的位圖句柄(C++/Win32)?
我的問題是,繪製我需要獲取設備上下文,但是當我做GetDC(NULL)時,它給了我一個WINDOW設備上下文! GetDC()的參數是一個窗口句柄(HWND),但我沒有窗口;只是一個位圖句柄。
如何在此位圖上繪圖?謝謝!
除了帕維爾的回答,「與屏幕兼容」總是竊聽我也一樣,但由於CreateCompatibleDC(NULL)
普遍用於這一目的,我認爲這是正確的。
我認爲「兼容」的事情只與DDB有關(DC設置爲在當前屏幕上寫入正確的DDB類型),但不影響DIB上的讀/寫。
因此,爲了安全起見,如果您需要處理不需要臨時屏幕上顯示的位圖,則始終使用DIB而不是DDB,但現在性能差異可以忽略不計。有關DIB和DDB的更多信息,請參見here。
CreateCompatibleDC()和SelectObject()將你的位圖放入它。
但是,並非每個位圖都可以選擇到任何DC中。 您可能需要使用映射模式和其他內存DC選項。
在位圖上繪製的基本win32範例是您將位圖選擇到設備上下文中,之後,該設備上下文中的所有繪製操作都存儲在位圖中。然後,您可以使用各種「細微」操作之一(例如StretchBlt)將其轉移到顯示錶面,這只是窗口客戶區的設備上下文。
其他人提供了更好的細節,這只是高層次的看法。
好了,這是禁區外一點..我想..但我確實知道,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時遇到了這些問題,其他人也會這樣。
感謝您的建議,但這必須在非託管Win32中,(不幸的是)沒有Graphics類。 – user20493 2010-07-01 14:20:35
但CreateCompatibleDC()將HDC作爲參數。如果我有HDC,我不需要創建一個! (有沒有我忽略的東西?) – user20493 2010-06-29 20:13:58
'CreateCompatibleDC'可以將NULL作爲參數,並創建一個與應用程序屏幕兼容的內存DC。然後,您可以選擇您的位圖在其中,如Pavel所說,您可以將CreateCompatibleBitmap()和BitBlt()放入DC中。 – 2010-06-29 20:18:43
我想繪製一個8bpp位圖。這當然與應用程序屏幕不兼容。是否可以使用這樣的位圖? – user20493 2010-06-29 20:29:19