2010-08-01 54 views
3

在我的應用程序中,我需要創建HBITMAP對象,並將其呈現給我,並從中複製結果。沒有窗口的Win32設備上下文

我使用函數「CreateDIBSection」來創建這些位圖,但是此函數需要DC(設備上下文)作爲第一個參數。目前我通過調用主窗口句柄(hWnd)上的GetDC(hWnd)來獲得此信息。但我希望能夠創建HBITMAPS而不需要具有應用程序窗口,沒有某種內存DC,這可能嗎?

回答

2

CreateCompatibleDC(NULL)將創建一個與屏幕兼容的設備環境 - 這聽起來像在這種情況下是理想的。

2

你可以得到一個帶有的CreateDC用於顯示:

HDC hDc = CreateDC(L"DISPLAY", NULL, NULL, NULL); 

清理與DeleteDC()。它僅用於初始化帶索引格式的位圖的調色板。如果你不使用這樣的格式,NULL可能會工作,從來沒有嘗試過。

然後有GDI +,#include <gdiplus.h>和Bitmap類...

+0

如果用戶有多個顯示屏,會中斷嗎? – 2010-08-01 14:43:16

+0

只能影響調色板。還沒有看到可以長時間運行在8bpp模式下的視頻適配器。甩掉包袱。 – 2010-08-01 15:26:08

0

嘗試。有效。

HDC hdcScreen = ::GetDC(NULL); 
HDC hdcMemDC = ::CreateCompatibleDC(hdcScreen); 
HBITMAP hbmScreen = ::CreateCompatibleBitmap(hdcScreen, cx, cy); 
HBITMAP hOldBitmap = (HBITMAP) ::SelectObject(hdcMemDC, hbmScreen); 

    MyImageDraw(hdcMemDC, ...); 

    // The drawing image is held in hBitmap. You can save it 
HBITMAP hBitmap = (HBITMAP)::SelectObject(hdcMemDC, hOldBitmap); 

    // save The trend image into c:\test.bmp 
    PBITMAPINFO pbi = CreateBitmapInfoStruct(hBitmap); 
CreateBMPFile("C:\\Temp\\test.bmp", pbi, hBitmap, hdcMemDC); 

    //Clean up 
::DeleteObject(hbmScreen); 
::DeleteObject(hdcMemDC); 
::ReleaseDC(NULL, hdcScreen);