Delphi 当窗口在屏幕外时,为什么CreateDIBSection()会失败?

Delphi 当窗口在屏幕外时,为什么CreateDIBSection()会失败?,delphi,winapi,graphics,sdl,Delphi,Winapi,Graphics,Sdl,我正在构建一个Delphi组件,在VCL表单上嵌入一个渲染面。只要在创建SDL曲面时窗体在屏幕上,它就可以正常工作。否则,它将无法创建任何渲染纹理 我跟踪到SDL代码,并以以下函数调用结束,该调用失败(返回NULL): HDC是具有自己的HWND窗口句柄(已正确设置)的控件所拥有的图形上下文的有效句柄。但是当控件在屏幕外创建时(这通常发生在Delphi中)(所有窗体及其控件都是在隐藏状态下创建的,直到显示它们为止),CreateDIBSection调用将失败,直到控件实际可见为止 此外,如果它是

我正在构建一个Delphi组件,在VCL表单上嵌入一个渲染面。只要在创建SDL曲面时窗体在屏幕上,它就可以正常工作。否则,它将无法创建任何渲染纹理

我跟踪到SDL代码,并以以下函数调用结束,该调用失败(返回NULL):

HDC是具有自己的HWND窗口句柄(已正确设置)的控件所拥有的图形上下文的有效句柄。但是当控件在屏幕外创建时(这通常发生在Delphi中)(所有窗体及其控件都是在隐藏状态下创建的,直到显示它们为止),CreateDIBSection调用将失败,直到控件实际可见为止

此外,如果它是在屏幕上创建的,则隐藏并重新显示(例如,如果它在选项卡工作表上,我切换选项卡),在此过程中,我创建的任何纹理都会变为空白


这让我快发疯了。有人知道发生了什么以及我如何处理吗?

绘图上下文仅在绘制处理期间有效。

什么是“绘制处理”?何时发生?“绘制”处理是指在控件的绘制方法中,由PaintWindow调用以响应WM_绘制消息。PaintWindow初始化控件的设备上下文句柄。是否解释您的注释?或者你只是喜欢做毫无根据的陈述?为什么我要解释API的基本原理,它都是有文档记录的。你全搞错了。当您检索设备上下文时,它已准备好进行操作。它不需要初始化,默认值已经设置好了。不需要WM_PAINT消息就可以对其进行操作,只要有了句柄,它就有效。在按钮处理程序中检索设备上下文并在表单表面上绘制需要一分钟的时间。那你就知道这些了。当然,您应该能够知道API不会关心特定于Delphi的方法是哪个Paint和PaintWindow;你只是在胡说八道。。。控件画布的绘图上下文句柄由Delphi在WM_PAINT处理程序中初始化,并在处理结束时发布。这只是一个想法。。。。你注意过窗把手吗?它不是被屠杀和重建的吗?不是。毁灭者永远不会被召唤。
data->hbm = CreateDIBSection(renderdata->memory_hdc, bmi, DIB_RGB_COLORS, &data->pixels, NULL, 0);