【问题标题】:Win32 Device Context without Window没有窗口的 Win32 设备上下文
【发布时间】:2011-03-23 20:28:03
【问题描述】:

在我的应用程序中,我需要创建要渲染的 HBITMAP 对象以及复制结果的位置。

我使用函数“CreateDIBSection”来创建这些位图,但是这个函数需要一个 DC(设备上下文)作为第一个参数。目前我通过在主窗口句柄 (hWnd) 上调用 GetDC(hWnd) 来得到这个。但我希望能够创建 HBITMAPS 而无需应用程序窗口,无需某种内存 DC,这可能吗?

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    CreateCompatibleDC(NULL) 将为您创建一个与屏幕兼容的设备上下文 - 这听起来很适合这种情况。

    【讨论】:

      【解决方案2】:

      您可以使用 CreateDC 获得一个用于显示:

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

      使用 DeleteDC() 进行清理。它仅用于初始化具有索引格式的位图的调色板。如果您不使用这种格式,NULL 可能会起作用,从未尝试过。

      然后是 GDI+、#include <gdiplus.h> 和 Bitmap 类...

      【讨论】:

      • 如果用户有多个显示器,这会中断吗?
      • 只能影响调色板。还没有看到可以在 8bpp 模式下运行 长时间 的视频适配器。好摆脱。
      【解决方案3】:

      试试这个。成功了。

      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 ); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 2011-02-05
        相关资源
        最近更新 更多