Вверх ↑
Этот топик читают: Гость
Ответов: 14
Рейтинг: 0
#1: 2016-04-15 20:28:53 ЛС | профиль | цитата
Передо мной стоит непростая задача, осуществить вывод сцены из OpenGL на bmp, а потом поместить его в пеинтбокс.
Сначала я подумал, что такое невозможно, но великое гугление убедило меня в обратном.



Дано:

   ● Есть GL_Main, которому нужен указатель.

  

   ● Есть Paint Box, которому нужен bmp.

  

Цель:

   ● Любыми извращениями присобачить одно к другому.




Есть следующие догадки:

   1. Вывести это дело на дочернюю форму, затем скриншотить и отправлять на пеинтбокс.
      Проблема в том, что скриншотится видимая на мониторе область, а мне не нужна копия окна.

   2. Воспользоваться каким нибудь конвертором или цепочкой конверторов, но не имею ни малейшего понятия чем.




Взываю местных супер-умов о помощи.
карма: 1

0
Ответов: 2059
Рейтинг: 132
#2: 2016-04-16 00:19:22 ЛС | профиль | цитата
sedyh, Вкл/выкл режима "Поплавок" (т.е. окно при потере фокуса всегда остаётся поверх всех окон)
+ скриншот окна.
Add(MainForm,2460030,280,119)
{
Width=697
Height=422
Font=[Consolas,8,0,0,204]
Caption="FindSha от ser_davkin"
DragForm=0
Position=1
Point(Close)
Point(Handle)
link(onCreate,6719797:doPopup,[(324,139)(324,174)(268,174)(268,209)])
}
Add(WinTools,6719797,280,196)
{
link(Handle,2460030:Handle,[])
}


Не так?
карма: 6

0
Ответов: 2265
Рейтинг: 676
#3: 2016-04-16 00:26:00 ЛС | профиль | цитата
sedyh писал(а):
Взываю местных супер-умов о помощи.
Пока супер-умы спят, попробую помочь.
sedyh, если вы объясните что вы хотите получить или хоть для чего скрещивать BMP с OpenGL, будет проще вам помочь.\
Пока могу предложить такой вариант: code_37196.txt
карма: 11

0
файлы: 1code_37196.txt [1.8KB] [305]
Ответов: 14
Рейтинг: 0
#4: 2016-04-16 00:27:43 ЛС | профиль | цитата
flint2 писал(а):
т.е. окно при потере фокуса всегда остаётся поверх всех окон

Ну так мне не нужно только одно окно.

Те это был как вариант того, чтобы изобразить его на главной форме.

sla8a писал(а):
что вы хотите получить или хоть для чего скрещивать BMP с OpenGL, будет проще вам помочь


Да, конечно, хочу достичь двух разных целей:

1. Мне нужно поставить анимированные ImgBtn (движение по тригонометрии, эдакий такой слайдер).
Но вот когда я вывожу окно OpenGL на окно, эти компоненты оставляют за собой белый хвост, который быстро исчезает.

Как видно на следующем примере, если между выводом OpenGL и анимированным элементом изображение - он ведет себя как надо.



2. Мне нужны будут самые обыкновенные слои.
карма: 1

0
Ответов: 2265
Рейтинг: 676
#5: 2016-04-16 00:45:00 ЛС | профиль | цитата
sedyh, выше мной выложен пример, смотрели? После вашего описания лично мне не стало понятней.
sedyh писал(а):
когда я вывожу окно OpenGL на окно

Выкладывайте свой набросок в виде схемы, а то будем долго разбираться.
Как скопировать и вставить схему
карма: 11

0
Ответов: 14
Рейтинг: 0
#6: 2016-04-16 01:12:58 ЛС | профиль | цитата
Да, смотрел, довольно интересная версия, но, как я и говорил, скриншот формы работает только тогда, когда область видна на мониторе, а мне не нужно доп. окно / панель итд.



Вот набросок из картинки выше. Мне нужно избежать белых подлагиваний.

Код залил к себе на хост - http://mcglcapes.ru/Programs/Code.txt.

Это была та часть, где мне именно нужны картинки на фоне OpenGL'а.



Просьба также помочь с проблемой, что я написал в начале этого сообщения (т.е. каким то непонятным мне образом сделать конвертирование в bmp без вывода на дополнительные визуальные элементы).



карма: 1

0
Ответов: 2265
Рейтинг: 676
#7: 2016-04-16 01:24:08 ЛС | профиль | цитата
sedyh писал(а):
Мне нужно избежать белых подлагиваний.

Так пойдет? code_37197.txt (картинки удалил, вставите)
карма: 11

1
файлы: 1code_37197.txt [1.7KB] [350]
Голосовали:sedyh
Ответов: 14
Рейтинг: 0
#8: 2016-04-16 01:35:08 ЛС | профиль | цитата
О, спасибо большое, вариант почти идеальный, как раз то, что нужно.

Теперь хотелось бы решить второй вопрос (про встраиванию его в слой пеинтбокса).
Точно знаю, в пеинтбоксе проблем такого рода почти нет и, стараясь себя избавить от подобного в будущем, я хочу встроить вывод OpenGL в слой пеинтбокса, но как я сказал ранее, не знаю как это сделать без дополнительных визуальных элементов.
карма: 1

0
Ответов: 39
Рейтинг: 2
#9: 2016-04-16 09:34:26 ЛС | профиль | цитата
'пеинтбокс' visible = false и уже нет визуальных
карма: 1

0
Ответов: 14
Рейтинг: 0
#10: 2016-04-16 11:12:59 ЛС | профиль | цитата
RAWY писал(а):
'пеинтбокс' visible = false и уже нет визуальных

Не смешно .
карма: 1

0
Ответов: 2265
Рейтинг: 676
#11: 2016-04-16 13:50:09 ЛС | профиль | цитата
sedyh писал(а):
хочу встроить вывод OpenGL в слой пеинтбокса
Насколько в этом разбираюсь, то элемент GL_Main работает только с дескриптором окна, тоесть вывести получится на видимый элемент. Возможно местные супер-умы подскажут способ.
карма: 11

0
Ответов: 14
Рейтинг: 0
#12: 2016-04-16 17:58:56 ЛС | профиль | цитата
Тогда покажу результаты гугления, может быть они помогут:

- http://www.delphimaster.ru/cgi-bin/forum.pl?id=1321797240&n=7

- http://www.delphimaster.net/view/1-1252394890
карма: 1

0
Ответов: 39
Рейтинг: 2
#13: 2016-04-16 23:13:44 ЛС | профиль | цитата
sedyh, а зачем в paintbox? Почему на форме сразу не рисовать все что нужно?
карма: 1

0
Разработчик
Ответов: 26149
Рейтинг: 2127
#14: 2016-04-17 01:58:31 ЛС | профиль | цитата
sedyh писал(а):
Проблема в том, что скриншотится видимая на мониторе область, а мне не нужна копия окна

А кто мешает прицепить Handle ScreenShort-a к Handle окна вывода? Тогда скриншот будет сниматься только того окна, которое прицеплено. Если же точка Handle у ScreenShort-a не задействована, то снимается вся область экрана.
карма: 22

0
Ответов: 2265
Рейтинг: 676
#15: 2016-04-17 02:26:43 ЛС | профиль | цитата
nesco, это не серьезно. sedyh как я понял, нужно вывести openGL вначале на картинку (Bitmap), потом дорисовать еще коечто и только потом вывести на экран. Вроде ничего криминального.
Вроде как достаточно поменять в GL_Main
#pas
DC := GetDC(ReadInteger(_Data,_data_handle,0));
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
на
#pas
Bmp := ReadBitmap(_Data,_data_Bitmap,nil);
DC := Bmp.Canvas.Handle;
pfd.dwFlags := PFD_DRAW_TO_BITMAP or PFD_SUPPORT_OPENGL or PFD_SUPPORT_GDI;
и начинает выводить на картинку, но както криво все получается. И цвета отличаются и рисует вроде только первый кадр. Вообщем надо разбираться.
карма: 11

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)