Вывод на компоненты Delphi средствами OpenGL
Теоретически с помощью функций OpenGL можно осуществлять вывод не только на поверхность формы, но и на поверхность любого компонента, если у него имеется свойство Canvas. Handle, для чего при получении ссылки на контекст воспроизведения необходимо указывать ссылку на контекст устройства, ассоциированную с нужным компонентом, например, image1. Canvas. Handle. Однако чаще всего это приводит к неустойчивой работе, вывод то есть, то нет, хотя контекст воспроизведения присутствует и не теряется.
OpenGL прекрасно уживается с визуальными компонентами, как видно из примера TestPFD, так что чаще всего нет необходимости осуществлять вывод на поле не формы, а компонента Delphi.
Если для ваших задач необходимо ограничить размер области вывода, то для этого есть стандартные методы, которые мы обсудим во второй главе.
Подкаталог Ex24 содержит проект, в котором вывод осуществляется на поверхность панели - компонента, вообще не имеющего свойства canvas. Для этого мы пользуемся тем, что панель имеет отдельной окно:
dc: = GetDC (Panel1. Handle);
SetDCPixelFormat(dc);
hrc: = wglCreateContext(dc);
Аналогичным образом можно организовать вывод на поверхность любого компонента, имеющего свойство Handle (т. e. имеющего самостоятельное окно), например, на поверхность обычной кнопки. Обязательно попробуйте сделать это.
Для вывода на компонент класса TImage можете записать.
dc: = Image1. Canvas. Handle; и удалить строки BeginPaint и EndPaint, поскольку класс TImage не имеет
свойства Handle, т. e. не создает отдельного окна.
Однако вывод на компоненты, подобные компонентам класса Timage, т. e. не имеющие свойства Handle, отличается полной неустойчивостью, так что я не гарантирую вам надежного положительного результата.
Почему это происходит, выясним в следующем разделе.
Содержание раздела