Почему CreateDIBSection() не работает, когда окно находится за пределами экрана?

Я создаю компонент Delphi для встраивания поверхности рендеринга SDL в форму VCL. Он работает нормально, пока форма находится на экране в момент создания поверхности SDL. В противном случае он не сможет создать текстуры рендеринга.

Я проследил код SDL и получил следующий вызов функции, который не работает (возвращает NULL):

data->hbm = CreateDIBSection(renderdata->memory_hdc, bmi, DIB_RGB_COLORS, &data->pixels, NULL, 0);

HDC является допустимым дескриптором контекста рисования, принадлежащего элементу управления, который имеет собственный дескриптор окна HWND, настроенный должным образом. Но когда элемент управления создается вне экрана, что обычно происходит в Delphi (все формы с их элементами управления создаются в скрытом состоянии до тех пор, пока не придет время их отобразить), вызов CreateDIBSection завершится ошибкой до тех пор, пока элемент управления не станет видимым.

Кроме того, если он создается на экране, а затем скрывается и снова отображается (например, если он находится на вкладке и я переключаю вкладки), любые текстуры, которые я создаю, становятся пустыми во время этого процесса.

Это сводит меня с ума. Кто-нибудь знает, что происходит и как я могу обойти это?


person Mason Wheeler    schedule 25.03.2009    source источник
comment
Просто идея.... Вы смотрели ручку окна? Разве это не вырезано и не воссоздано?   -  person Francesca    schedule 26.03.2009
comment
Неа. DestroyWnd никогда не вызывается.   -  person Mason Wheeler    schedule 26.03.2009


Ответы (1)


Контекст рисования действителен только во время обработки Paint.

person Erik Knowles    schedule 05.07.2016
comment
Что такое покрасочная обработка? Когда это происходит? - person Sertac Akyuz; 06.07.2016
comment
Обработка рисования осуществляется в методе Paint элемента управления, который вызывается PaintWindow в ответ на сообщения WM_PAINT. PaintWindow — это то, что инициализирует дескриптор контекста устройства элемента управления. - person Erik Knowles; 06.07.2016
comment
Вы хотите объяснить свой комментарий? Или вы просто делаете безосновательные заявления? - person Erik Knowles; 07.07.2016
comment
Зачем мне объяснять основы API, все это задокументировано. Вы все неправильно поняли. Контекст устройства готов к работе, когда вы его извлекаете. Его не нужно инициализировать, значения по умолчанию уже установлены. И для работы с ним не нужно сообщение WM_PAINT, оно действительно, как только у вас есть дескриптор. Вам понадобится минута, чтобы получить контекст устройства в обработчике кнопки и нарисовать на поверхности формы. Тогда бы вы все это знали. И, конечно же, вы должны быть в состоянии сказать, что API не заботятся о конкретных методах Delphi, такими как Paint и PaintWindow. - person Sertac Akyuz; 07.07.2016
comment
Итак, вы не смотрели на источник; вы просто болтаете... Дескриптор контекста рисования для холстов управления инициализируется Delphi в обработчике WM_PAINT и освобождается в конце обработки. - person Erik Knowles; 09.07.2016
comment
Другими словами, если WM_PAINT не отправляется из-за того, что элемент управления находится за пределами экрана, дескриптор HDC не создается. Спасибо, что проголосовали за меня, не потратив и двух минут на то, чтобы попытаться понять объяснение. - person Erik Knowles; 09.07.2016
comment
Я потратил больше двух минут. В вопросе говорится, что существует действующий HDC. Ваш ответ не имеет смысла и дополнительное объяснение не подходит. И нет такого понятия, как контекст рисования. - person Sertac Akyuz; 09.07.2016