![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenGL + TFrame. Как????
@!!ex © (2012-04-05 15:36:00)Задача: на TFrame реализовать вывод OpenGL картинки.
- Сам TFrame окном не является. У него нету ни onCreate ни onPaint. И(самое главное) нет HWND из которого можно было бы получить HDC для инициализации OGL. onCreate в итоге я получил перекрыв конструктор. Но не уверен, что это верное решение.
- Логично разместить какой нибудь TPaintBox и рисовать на нем! Однако: TPaintBox меняет HDC каждый раз при возникновении события WM_PAINT. Надо бы установить CS_OWNDC и получить хэндл самостоятельно... Но у TPaintBox нету HWND.
- Пробуем TPanel. делаю наследника. Создаю ему обработчик WM_PAINT и через CreateParams выставляю CS_OWNDC. Результат: onPaint дергается постоянно, даже если окно не меняется. Ничего не рисуется. Может быть надо
Поэтому и пишу сюда. Господа! Как правильно выводить OGL графику на TFrame??
Cobalt (2012-04-08 18:08:00) [1]Мне отчего-то кажется, что необходимость непосредственно во фрейме нет.
Если отрисовывать надо фон, поверх которого лежат контролы, то вполне подойдет потомок TPanel
А если поверх ничего не лежит, то опять же подойдет потомок TPanel.
Дмитрий С (2012-04-08 17:40:00) [2]Хелпером можно также
Юрий Зотов (2012-04-07 11:11:00) [3]
> @!!ex © (05.04.12 15:36)
Стало быть, задача решается элементарно:
type
TMyFrame = class(TFrame)
...
public
property Handle;
end;
А если есть желание, то можно добавить и свойство Canvas (пример есть в TCustomForm).
DVM (2012-04-06 23:36:00) [4]
> потому что нету Handle
У TWinControl далеким потомком которого является TFrame Handle разумеется есть, но свойство protected, в TFrame видимость не повышалась до public, но это можно сделать в потомке Tframe.
Юрий Зотов (2012-04-06 18:20:00) [5]
> @!!ex © (06.04.12 18:13) [6]
> нету Handle
Проверьте. Должен быть.
Юрий Зотов (2012-04-06 18:13:00) [6]> Сам TFrame окном не является.
Насколько помню, TFrame наследуется по цепочке TWinControl. Если так, то окном он является и HWND у него есть.
@!!ex (2012-04-06 18:13:00) [7]
> У канваса HDC есть. Если чё.
Который не контролируемо меняется, если не установить OWNDC.
А установить OWNDC нельзя, потому что нету Handle
Ega23 (2012-04-06 17:59:00) [8]
> И это никак не помогает в ситуации использования OpenGL.
У канваса HDC есть. Если чё.
@!!ex (2012-04-06 17:32:00) [9]
> Но у него есть Canvas
И это никак не помогает в ситуации использования OpenGL.
Фреймы не нужны. делаем форму, BorderStyle=bsNone, помещаем ее куда нужно. И никаких фреймов, все возможности формы доступны.
Минусов два:
1) Только один экземпляр. Несколько и не нужно.
2) В дизайн тайме нельзя разместить. Не значительный минус. Все равно кода по прикручиваю OpenGL больше чем кода по перемещению формы.
Ega23 (2012-04-05 15:59:00) [10]
> Но у TPaintBox нету HWND.
Но у него есть Canvas
@!!ex (2012-04-05 15:57:00) [11]Проблема в создании OGL контекста в конструкторе TFrame.
Надо у фрейма делать отдельно InitGL метод и вызываеть его в конструкторе формы, на которой находится фрейм.
Тогда все работает.
Осталась проблема с перерисовкой.
у меня WM_PAINT на фрейм приходит постоянно. не знаю почему.