OpenGL: как ограничить компонент изображения? - PullRequest
2 голосов
/ 10 августа 2010

Я занят изучением OpenGL, используя Delphi (паскаль); Я использую отличный текст, но каждый пример в книге обращается ко всей форме. Я хочу разместить компонент изображения на элементе from и нарисовать его. Я попытался назначить дескриптор контекста устройства (GDC) на дескриптор холста элемента управления изображением, а не на дескриптор формы, но это возвращает ошибку при вызове ChoosePixelFormat.

Так что, если кто-нибудь знает, как этого добиться, я буду признателен за любые предложения.

Заранее спасибо за любую помощь.

JrDoner

1 Ответ

5 голосов
/ 10 августа 2010

Я всегда использую следующий код для настройки окна 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...