J'utilise toujours le code suivant pour configurer la fenêtre HWND pour la sortie 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;
Comme vous le savez, il y a une énorme différence entre les poignées de fenêtre (de HWNDs (?)) et les contextes de périphériques (DC). Chaque fenêtre a un HWND, et chaque fenêtre que vous pouvez dessiner a un HDC. Étant donné une forme, Handle
est son HWND, et Canvas.Handle
est son HDC. Pour obtenir le CC associé à une fenêtre, vous pouvez utiliser GetDC(HWND)
.
Vous devez configurer OpenGL sur une fenêtre, c'est-à-dire sur un HWND. Vous ne pouvez donc pas rendre OpenGL sur un contrôle sans un handle de fenêtre, tel qu'un TImage
. Utilisez un TPanel
ou un autre abonné de TWinControl
.
+1 pour la bonne explication. J'ai en fait un composant VCL que j'ai écrit qui configure un contexte OpenGL dans un formulaire. Il est conçu pour faire plus que cela - il ne s'agit pas seulement d'OpenGL, mais d'une interface avec la bibliothèque multimédia SDL utilisant un backend OpenGL - mais il fournit un vrai contexte GL sur lequel vous pouvez utiliser des routines OpenGL standard. Si quelqu'un est intéressé je pourrais le rendre disponible pour les gens à utiliser ... –