Помощь - Поиск - Пользователи - Календарь
Полная версия: Создание графических окон в TP.
Форум «Всё о Паскале» > Разработка ПО, алгоритмы, общие вопросы > Общие вопросы разработки программ
Билли Боб
Какой принцип отображение и перемещения окон лучше использовать?
Мне пришло в голову только создание уровней окон и запись участка экрана за каждым окном.
TarasBer
Ничего записывать не надо.
Просто при сдвиге окна всем окнам, что были под старым местом, шлётся сообщение перерисовки.
Билли Боб
но тогда ведь придется весь экран перерисовывать, разве нет?
sheka
Кстати, как это реализовано в Windows? Если не ошибаюсь, то там отрисовывается не все окно, а только его часть, которая как раз и была закрыта.

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

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

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

так это же как раз и интересно lol.gif
Билли Боб
Цитата
В Windows это реализовано на уровне регионов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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