代码之家  ›  专栏  ›  技术社区  ›  ronag

使用用户分配的内存绘制到HDC

  •  2
  • ronag  · 技术社区  · 14 年前

    我有一个无窗口的IviewObject对象。

    我想称之为 Draw 函数呈现到OpenGL PBO内存中(或者 OleDraw 更简单)。

    现在,我首先使用 CreateDIBSection (它分配自己的内存)然后将其复制到我的PBO内存中。不过,我想避免这额外的副本。我相信这在理论上是可能的,因为映射的PBO存在于页面锁定的内存中。

    这就是我今天所做的简化:

    hdc = CreateCompatibleDC(nullptr); // Get current DC
    HBITMAP bitmap = CreateDIBSection(... hdc, &bitmap_data_...); // Create Bitmap
    SelectObject(hdc, bitmap);
    m_spViewObject->Draw(... hdc ...); // IViewObject->Draw to bitmap
    memcpy(pbo_ptr, bitmap_data_, size);
    

    我的问题是,是否可以让draw函数以某种方式提取到我指定的内存(在本例中是pbo),而不是由win32 api(createdibsection)分配的内存?

    一种方法可能是,是否可以从用户指定的内存创建一个与设备无关的位图?但是,我没有发现任何函数可以做到这一点。

    1 回复  |  直到 14 年前
        1
  •  4
  •   valdo    14 年前

    你想做的是非常合乎逻辑的。然而不幸的是,阿法克没有传统的方法来做到这一点。

    根据winapi dib部分,要么分配自己的内存,要么使用文件映射。opengl以自己的方式管理内存。 存在从任何内存块创建DIB的选项,但它仅用于视频驱动程序,用户模式应用程序无法访问。

    实际上有一个非常复杂的可能性来避免这个额外的副本。您可以创建一个虚拟视频驱动程序(不要与镜像视频驱动程序混淆),获取其 HDC . 然后用你的“定制”方式告诉它应该画在哪里(通过 Escape )然后你可以通过这个 HDC 无论您要绘制什么,虚拟视频驱动程序都将直接在所需的内存上绘制。

    此外,要绘制实际的图形,您将能够使用操作系统功能。用GDI可识别位图包装内存( EngCreateBitmap )并使用操作系统绘制( EngXXXX ,这样您就只需要在驱动程序中实现最小的功能。

    无论如何,这是一个驱动程序开发。我相信复制内存块足够快(与实际的绘图相比),这样您就可以保持代码原样。

    推荐文章