Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 на фрейм приходит постоянно. не знаю почему.


Наверх

Титульная страница Поиск, карта сайта Написать письмо