Я всегда использую следующий код для настройки окна HWND для вывода OpenGL:
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)
.
.настроить OpenGL на окне, то есть на HWND.Таким образом, вы не можете визуализировать OpenGL в элементе управления без дескриптора окна, такого как TImage
.Используйте TPanel
или другого потомка TWinControl
.