То, что вы пытаетесь сделать, очень логично, ИМХО. Однако, к сожалению, AFAIK, нет обычного способа сделать это.
В соответствии с разделами WinAPI DIB либо выделяйте собственную память, либо работайте с сопоставлением файлов. OTOH OpenGL управляет своей памятью по-своему.
Существует возможность создать DIB из любого блока памяти, но это только для видеодрайверов, недоступных для приложений пользовательского режима.
На самом деле существует очень сложная возможность избежать этой дополнительной копии. Вы можете создать виртуальный видеодрайвер (не путать с зеркальным видеодрайвером), получить его HDC
. Затем, по своему «обычному» способу, сообщите ему, где он должен рисовать (через Escape
). И затем вы можете передать это HDC
тому, что вы хотите сделать, ваш виртуальный видеодрайвер будет рисовать прямо в памяти, которую вы хотите.
Кроме того, для выполнения реального рисования вы сможете использовать функции ОС. Оберните свою память GDI-распознаваемым растровым изображением (EngCreateBitmap
) и используйте его в операционной системе (EngXXXX
), чтобы вам пришлось реализовывать только минимальную функциональность в вашем драйвере.
Однако, в любом случае, это разработка драйверов. Я считаю, что копирование блока памяти происходит достаточно быстро (по сравнению с реальным рисунком), поэтому вы можете оставить свой код как есть.