IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Создание графических окон в TP.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Какой принцип отображение и перемещения окон лучше использовать?
Мне пришло в голову только создание уровней окон и запись участка экрана за каждым окном.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ничего записывать не надо.
Просто при сдвиге окна всем окнам, что были под старым местом, шлётся сообщение перерисовки.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


но тогда ведь придется весь экран перерисовывать, разве нет?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Кстати, как это реализовано в Windows? Если не ошибаюсь, то там отрисовывается не все окно, а только его часть, которая как раз и была закрыта.

Добавлено через 14 мин.
Билли Боб, почему же весь?
Цитата
всем окнам, что были под старым местом
т.е. проверяешь, не перекрываются ли "прямоугольники" окон: перемещаемого и всех остальных окон экрана. Если пересекаются - посылаешь сообщение тому окну, которое было под перемещаемым, и таким образом будет перерисовано только некоторое кол-во окон.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


а перемещаемое окно надо же как-то убрать с прежнего места
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
посылаешь сообщение тому окну, которое было под перемещаемым, и таким образом будет перерисовано только некоторое кол-во окон.
И зачем, собственно, надо перерисовывать полностью окно, лежащее ПОД тем, которое перетянули с места на место, а потом еще и перерисовывать само верхнее окно (фактически, тебе придется перерисовать ВСЕ окна, лежащие под рабочим, в порядке от нижнего к верхнему)?

В Windows это реализовано на уровне регионов. Область, которую надо перерисовать, помечается как невалидная, и потом, при получении сообщения WM_PAINT, только эта область перерисовывается. Если у тебя есть окно, под которым лежат три других, и при смещении верхнего окна на 20 пикселей, на нижележащих открываются участки шириной 20 пикселей - то перерисованы будут именно и только эти 3 маленьких участка, а не все 3 нижних окна... Не надо равняться на Windows...

Да и велосипедостроением тоже не надо заниматься. Под ДОС (и под ТР, кстати) есть прекрасная библиотека для построения граф. интерфейса, называется Graphic Vision (графический аналог Turbo Vision), скачай ее и посмотри, как оно там реализовано (насколько я помню, исходники доступны), или вообще пользуйся ей, а не самоделкой.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Цитата
велосипедостроением

так это же как раз и интересно lol.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Цитата
В Windows это реализовано на уровне регионов

Все же можно поподробнее?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата(Билли Боб @ 22.09.2011 23:40) *
Все же можно поподробнее?

Читай
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Одобряю серьезный подход. Когда-то, в начале 90-х, я взялся писать многооконный редактор - правда, в текстовой моде, но очень амбиционный )) - на манер MultyEdit, но шире. Без TurboVision, у меня был свой набор прикольных примочек, гораздо удобнее )). Делал на XT без HD, с двумя дисководами по 360 КБ (я ее упер домой с работы и сидел по ночам)). Так вот, с наскока у меня с окнами не получилось - вроде и работало, но глючило. Пришлось все продумать с начала и переделать.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Цитата
Читай

Жаль, что я ничего не понял.

Цитата
Пришлось все продумать с начала и переделать

Вот и я так, третий раз уже переделал.
Хотя сейчас у меня все получилось, вот только когда окно двигаешь, немного тормозит, точнее чем больше окно, тем больше тормозит. Надо что-то делать с перерисовкой окна. Как это сделано в Windows я так и не понял.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Просто вычисляешь границы участка A, который надо перерисовать.
Потом смотришь, какие окна W[i] этот участок задевают.
Вычисляешь границу каждого подучастка A[i], относящегося именно к W[i].
Потом каждому окну W[i] шлёшь сообщение о перерисовке A[i].

Всё. Перемещаемое окно никуда убирать не надо, просто то место, где оно было, перерисуют другие окна. Могут и не перерисовать, если они повисли - в винде тже так бывает.

Нет, экран перерисовывать не надо, надо просто вычислить, что именно надо перерисовать.

> вот только когда окно двигаешь, немного тормозит

Модулем Graph окно рисуешь небось?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
вот только когда окно двигаешь, немного тормозит, точнее чем больше окно, тем больше тормозит.
Помнится, в Windows 3.11 (да и в Win95 тоже, по-моему) при перетаскивании окна визуально рисовалась только XOR-рамка, показывающая где именно будет расположено окно, а после отпускания мыши - окно уже перерисовывалось в новой позиции (profit - не надо было перерисовывать окно и все находящееся под ним постоянно, пока двигалась мышь при зажатой левой кнопке. Отсюда возможен был вариант: сохранять то, что находится под окном, в буфер, и при изменении положения окна просто восстанавливать фон из буфера и отрисовывать окно в новой позиции, предварительно сохранив находящееся под ним в буфер заново). Может тебе тоже сделать такую фишку?

Цитата
Как это сделано в Windows я так и не понял.
Что именно непонятно? Как происходит вычисление региона, который будет перерисовываться? Я не думаю, что тебе удастся повторить ту же модель, которая реализована в Windows. Допустим, даже ты найдешь, какие области должны быть перерисованы. Что дальше? Как ты будешь рисовать только эти области? У тебя наверняка есть процедуры отрисовки разных контролов (скажем, поля ввода, кнопки и так далее, но они ж рисуют контрол полностью, а не какую-то его часть).

P.S. Делал когда-то, как часть дипломного проекта, графический интерфейс на TP (сам проект касался совершенно другого, но чтоб не особо скучать, решил делать и граф. интерфейс самостоятельно), было красиво, несколько разных контролов нарисовал, Edit-ы, ComboBox-ы, CheckBox-ы, Equalizer-ы, кнопки, менюшки, но вот до правильного перемещения окон так и не добрался, сделал именно с рамкой (подсмотрел в только что тогда вышедшей Win 3.11), хотя хотелось, чтоб при перемещении было видно всё окно sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> хотя хотелось, чтоб при перемещении было видно всё окно

Ну если ты делал с буфером, то это можно было бы сделать, если бы был второй буфер, в котором составляется картинка того, как бы выглядел экран под новым положением окна, если бы верхнего окна не было. Короче, всё сведётся к копированию уголков, грубо говоря.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Цитата
Модулем Graph окно рисуешь небось?

да нет вроде, хотя название похоже

Тормозит из-за того что при перемещении на старое место окна вставляется буфер того, что было за окном на том месте, то есть перемещаемое окно исчезает с исходной позиции, а новое сначала записывается в буфер и только потом рисуется окно в новом месте.
Как-то замудрено все ))
Запустил древний Windows 2.03, посмотрел, как там прорисовываются окна, ничего не понял, хотя понял то, что не как у меня. Чтобы четко увидеть, как это происходит, нужен очень слабый комп (Помню на 386 установил 95, так вот там было очень хорошо видно, что отрисовывается).
Цитата
Читай

На утро я все же понял, как это устроено, и у меня появилась пара идей.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






когда регионы отрисовки определены, части окон не перерисовываются покомпонентно, а просто копируются из собственных буферов (в которые они и рисуют себя изначально, винда не даст так просто рисовать прямо на экран). запоминать изображение под окном неправильно, так как при переключении активного окна всё поменяется... фон (рабочий стол) - тоже окно, оно так же копируется регионами на открывшиеся места...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 3:53
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name