【发布时间】:2011-03-23 20:28:03
【问题描述】:
在我的应用程序中,我需要创建要渲染的 HBITMAP 对象以及复制结果的位置。
我使用函数“CreateDIBSection”来创建这些位图,但是这个函数需要一个 DC(设备上下文)作为第一个参数。目前我通过在主窗口句柄 (hWnd) 上调用 GetDC(hWnd) 来得到这个。但我希望能够创建 HBITMAPS 而无需应用程序窗口,无需某种内存 DC,这可能吗?
【问题讨论】:
在我的应用程序中,我需要创建要渲染的 HBITMAP 对象以及复制结果的位置。
我使用函数“CreateDIBSection”来创建这些位图,但是这个函数需要一个 DC(设备上下文)作为第一个参数。目前我通过在主窗口句柄 (hWnd) 上调用 GetDC(hWnd) 来得到这个。但我希望能够创建 HBITMAPS 而无需应用程序窗口,无需某种内存 DC,这可能吗?
【问题讨论】:
CreateCompatibleDC(NULL) 将为您创建一个与屏幕兼容的设备上下文 - 这听起来很适合这种情况。
【讨论】:
您可以使用 CreateDC 获得一个用于显示:
HDC hDc = CreateDC(L"DISPLAY", NULL, NULL, NULL);
使用 DeleteDC() 进行清理。它仅用于初始化具有索引格式的位图的调色板。如果您不使用这种格式,NULL 可能会起作用,从未尝试过。
然后是 GDI+、#include <gdiplus.h> 和 Bitmap 类...
【讨论】:
试试这个。成功了。
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 );
【讨论】: