我正忙着使用 Delphi (pascal) 攀登 OpenGL 的学习曲线;我使用的是一篇优秀的文本,但书中的每个例子都引用了整个表格。我想在源上放置一个图像组件,然后绘制到该组件上。我尝试将设备上下文句柄 (GDC) 分配给图像控件 Canvas 的句柄,而不是窗体的句柄,但在调用 ChoosePixelFormat 时会返回错误。
因此,如果有人知道如何实现此目的,我将不胜感激任何建议。
预先感谢您的帮助。
jrDoner
最佳答案
我总是使用以下代码来设置 OpenGL 输出的窗口 HWND:
procedure rglSetupGL(Handle: HWnd);
var
DC: HDC;
PixelFormat: integer;
const
PFD: TPixelFormatDescriptor = (
nSize: sizeOf(TPixelFormatDescriptor);
nVersion: 1;
dwFlags: PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or PFD_DOUBLEBUFFER;
iPixelType: PFD_TYPE_RGBA;
cColorBits: 24;
cRedBits: 0;
cRedShift: 0;
cGreenBits: 0;
cGreenShift: 0;
cBlueBits: 0;
cBlueShift: 0;
cAlphaBits: 24;
cAlphaShift: 0;
cAccumBits: 0;
cAccumRedBits: 0;
cAccumGreenBits: 0;
cAccumBlueBits: 0;
cAccumAlphaBits: 0;
cDepthBits: 16;
cStencilBits: 0;
cAuxBuffers: 0;
iLayerType: PFD_MAIN_PLANE;
bReserved: 0;
dwLayerMask: 0;
dwVisibleMask: 0;
dwDamageMask: 0);
begin
DC := GetDC(Handle);
PixelFormat := ChoosePixelFormat(DC, @PFD);
SetPixelFormat(DC, PixelFormat, @PFD);
RC := wglCreateContext(DC);
wglMakeCurrent(DC, RC);
end;
如您所知(?),窗口句柄 (HWND) 和设备上下文 (DC) 之间存在巨大差异。每个窗口都有一个 HWND,每个可以绘制的窗口都有一个 HDC。给定一个表单,Handle
是它的 HWND,Canvas.Handle
是它的 HDC。
要获取与窗口关联的 DC,可以使用 GetDC(HWND)
。
您必须在窗口(即 HWND)上设置 OpenGL。因此,您无法在没有窗口句柄的控件(例如 TImage
)上渲染 OpenGL。使用 TPanel
或 TWinControl
的其他后代。
关于delphi - OpenGL:如何限制图像组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3444217/