forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Изменение размера области рендера (http://forum.boolean.name/showthread.php?t=16722)

bugway 29.04.2012 09:49

Изменение размера области рендера
 
Вложений: 1
Использую функцию xSetRenderWindow для вывода графики в элемент управления на форме. Не могу понять, как правильно изменять размер этой области. Делаю так: (код PowerBasic 10)

Код:

...
xSetRenderWindow hCtl        'set render area to image control
xSetTopWindow  hDlgMW        'set main window as input window
...
xGraphics3D(DWidth& ,DHeight& ,0,0,0)    'Desktop width and height
...

далее обрабатываю сообщение WM_SIZE:

Код:

cw = LO(WORD, CB.LPARAM)                    'new main window width
ch = HI(WORD, CB.LPARAM)                    'new main window height
CONTROL SET SIZE hDlgMW,2,cw*0.70,ch        'image contol width=70% width of main window

xCameraViewport(Camera, 0, 0, cw, ch)        'is it correct???

DIALOG SET TEXT hDlgMW,STR$(cw)
xcls
Render3d

но получаю такое:


В чем может быть прикол? Идеи есть?

pozitiffcat 29.04.2012 13:47

Ответ: Изменение размера области рендера
 
А если просто изменить размер области просмотра камеры? Например было столько - то а при нажатии кнопки изменить. Изменится или нет?

bugway 29.04.2012 18:44

Ответ: Изменение размера области рендера
 
Судя по всему, viewport создается и ресайзится правильно, трабла в стретчинге (stretch) окна вывода (использую image control). Только не пойму, трабла в xors3d или PB10...

bugway 30.04.2012 08:54

Ответ: Изменение размера области рендера
 
Вложений: 1
УРА! Разобрался!

Пришлось помудрить, но результат того стоит. Вот основная идея сабжа:

Идея состоит в том, что лишняя часть картинки рендера обрезается и показывается только область viewport.

1) Установить размер бекбуфера равный текущему разрешению рабочего стола
2) Установить viewport равный области вывода
3) областью вывода будет IMAGE CONTROL

Но тут есть ньюанс:

1. Если напрямую изменять размер IMAGE CONTROL, то картинка рендера растягивается (как в посте 1)

Для преодоления данного ограничения воспользуемся дополнительным родительским элементом FRAME, засунув в него IMAGE CONTROL. Изменять размеры будем не IMAGE CONTROLа (размеры которого установим равными размерам рабочего стола), а именно FRAME контрола, который скроет "лишнюю" часть области рендера (IMAGE контрола) и будет содержать только область Viewport`а.

Размеры окна теперь можно без проблем менять:


bugway 01.05.2012 08:56

Ответ: Изменение размера области рендера
 
Единственное, с чем нужно еще разобраться - при изменении размера главного окна область рендера "мигает", что сильно напрягает. Есть идеи как это пофиксить?

bugway 01.05.2012 09:27

Ответ: Изменение размера области рендера
 
Вот и нашел решение (слишком быстро, чем ожидал):

надо вместо контейнера FRAME использовать GRAPHIC со стилем окна %WS_CLIPCHILDREN, а дочерний элемент тоже использовать GRAPHIC. Тогда мелькания не будет. У главного окна тоже должен быть стиль %WS_CLIPCHILDREN.

MadMedic 08.05.2012 17:24

Re: Изменение размера области рендера
 
А проблем с управлением (мышь, клава) не возникает? На пурбейсике когда то меня подобный трик остановил только из-за затыков с инпутом

bugway 09.05.2012 13:29

Ответ: Изменение размера области рендера
 
Для корректной работы с вводом нужно ОБЯЗАТЕЛЬНО использовать функцию:

Код:

xSetTopWindow  hDlgMW        'set main window as input window
где параметр hDlgMW - это hWND того окна, которое будет обрабатывать сообщения.

MadMedic 09.05.2012 14:35

Re: Изменение размера области рендера
 
Я начинал когда еще не было этой функции. Теперь извраты с хуками на окно не нужны ))


Часовой пояс GMT +4, время: 02:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot