Версия для печати темы
Форум «Всё о Паскале» _ Общие вопросы разработки программ _ Создание графических окон в TP.
Автор: Билли Боб 22.09.2011 20:17
Какой принцип отображение и перемещения окон лучше использовать?
Мне пришло в голову только создание уровней окон и запись участка экрана за каждым окном.
Автор: TarasBer 22.09.2011 20:47
Ничего записывать не надо.
Просто при сдвиге окна всем окнам, что были под старым местом, шлётся сообщение перерисовки.
Автор: Билли Боб 22.09.2011 20:51
но тогда ведь придется весь экран перерисовывать, разве нет?
Автор: sheka 22.09.2011 20:52
Кстати, как это реализовано в Windows? Если не ошибаюсь, то там отрисовывается не все окно, а только его часть, которая как раз и была закрыта.
Добавлено через 14 мин.
Билли Боб, почему же весь?
Цитата
всем окнам, что были под старым местом
т.е. проверяешь, не перекрываются ли "прямоугольники" окон: перемещаемого и всех остальных окон экрана. Если пересекаются - посылаешь сообщение тому окну, которое было под перемещаемым, и таким образом будет перерисовано только некоторое кол-во окон.
Автор: Билли Боб 22.09.2011 21:10
а перемещаемое окно надо же как-то убрать с прежнего места
Автор: IUnknown 22.09.2011 21:25
Цитата
посылаешь сообщение тому окну, которое было под перемещаемым, и таким образом будет перерисовано только некоторое кол-во окон.
И зачем, собственно, надо перерисовывать
полностью окно, лежащее ПОД тем, которое перетянули с места на место, а потом еще и перерисовывать само верхнее окно (фактически, тебе придется перерисовать ВСЕ окна, лежащие под рабочим, в порядке от нижнего к верхнему)?
В Windows это реализовано на уровне регионов. Область, которую надо перерисовать, помечается как невалидная, и потом, при получении сообщения WM_PAINT,
только эта область перерисовывается. Если у тебя есть окно, под которым лежат три других, и при смещении верхнего окна на 20 пикселей, на нижележащих открываются участки шириной 20 пикселей - то перерисованы будут именно и только эти 3 маленьких участка, а не все 3 нижних окна... Не надо равняться на Windows...
Да и велосипедостроением тоже не надо заниматься. Под ДОС (и под ТР, кстати) есть прекрасная библиотека для построения граф. интерфейса, называется Graphic Vision (графический аналог Turbo Vision), скачай ее и посмотри, как оно там реализовано (насколько я помню, исходники доступны), или вообще пользуйся ей, а не самоделкой.
Автор: Билли Боб 22.09.2011 21:48
Цитата
велосипедостроением
так это же как раз и интересно
Автор: Билли Боб 23.09.2011 3:40
Цитата
В Windows это реализовано на уровне регионов
Все же можно поподробнее?
Автор: IUnknown 23.09.2011 4:03
Цитата(Билли Боб @ 22.09.2011 23:40)
Все же можно поподробнее?
http://www.coders-library.ru/news-print-4.html
Автор: Lapp 23.09.2011 6:55
Одобряю серьезный подход. Когда-то, в начале 90-х, я взялся писать многооконный редактор - правда, в текстовой моде, но очень амбиционный )) - на манер MultyEdit, но шире. Без TurboVision, у меня был свой набор прикольных примочек, гораздо удобнее )). Делал на XT без HD, с двумя дисководами по 360 КБ (я ее упер домой с работы и сидел по ночам)). Так вот, с наскока у меня с окнами не получилось - вроде и работало, но глючило. Пришлось все продумать с начала и переделать.
Автор: Билли Боб 23.09.2011 7:05
Цитата
Читай
Жаль, что я ничего не понял.
Цитата
Пришлось все продумать с начала и переделать
Вот и я так, третий раз уже переделал.
Хотя сейчас у меня все получилось, вот только когда окно двигаешь, немного тормозит, точнее чем больше окно, тем больше тормозит. Надо что-то делать с перерисовкой окна. Как это сделано в Windows я так и не понял.
Автор: TarasBer 23.09.2011 13:26
Просто вычисляешь границы участка A, который надо перерисовать.
Потом смотришь, какие окна W[i] этот участок задевают.
Вычисляешь границу каждого подучастка A[i], относящегося именно к W[i].
Потом каждому окну W[i] шлёшь сообщение о перерисовке A[i].
Всё. Перемещаемое окно никуда убирать не надо, просто то место, где оно было, перерисуют другие окна. Могут и не перерисовать, если они повисли - в винде тже так бывает.
Нет, экран перерисовывать не надо, надо просто вычислить, что именно надо перерисовать.
> вот только когда окно двигаешь, немного тормозит
Модулем Graph окно рисуешь небось?
Автор: IUnknown 23.09.2011 13:46
Цитата
вот только когда окно двигаешь, немного тормозит, точнее чем больше окно, тем больше тормозит.
Помнится, в Windows 3.11 (да и в Win95 тоже, по-моему) при перетаскивании окна визуально рисовалась только XOR-рамка, показывающая где именно будет расположено окно, а после отпускания мыши - окно уже перерисовывалось в новой позиции (profit - не надо было перерисовывать окно и все находящееся под ним
постоянно, пока двигалась мышь при зажатой левой кнопке. Отсюда возможен был вариант: сохранять то, что находится под окном, в буфер, и при изменении положения окна просто восстанавливать фон из буфера и отрисовывать окно в новой позиции, предварительно сохранив находящееся под ним в буфер заново). Может тебе тоже сделать такую фишку?
Цитата
Как это сделано в Windows я так и не понял.
Что именно непонятно? Как происходит вычисление региона, который будет перерисовываться? Я не думаю, что тебе удастся повторить ту же модель, которая реализована в Windows. Допустим, даже ты найдешь, какие области должны быть перерисованы. Что дальше? Как ты будешь рисовать
только эти области? У тебя наверняка есть процедуры отрисовки разных контролов (скажем, поля ввода, кнопки и так далее, но они ж рисуют контрол
полностью, а не какую-то его часть).
P.S. Делал когда-то, как часть дипломного проекта, графический интерфейс на TP (сам проект касался совершенно другого, но чтоб не особо скучать, решил делать и граф. интерфейс самостоятельно), было красиво, несколько разных контролов нарисовал, Edit-ы, ComboBox-ы, CheckBox-ы, Equalizer-ы, кнопки, менюшки, но вот до правильного перемещения окон так и не добрался, сделал именно с рамкой (подсмотрел в только что тогда вышедшей Win 3.11), хотя хотелось, чтоб при перемещении было видно всё окно
Автор: TarasBer 23.09.2011 13:54
> хотя хотелось, чтоб при перемещении было видно всё окно
Ну если ты делал с буфером, то это можно было бы сделать, если бы был второй буфер, в котором составляется картинка того, как бы выглядел экран под новым положением окна, если бы верхнего окна не было. Короче, всё сведётся к копированию уголков, грубо говоря.
Автор: Билли Боб 23.09.2011 15:26
Цитата
Модулем Graph окно рисуешь небось?
да нет вроде, хотя название похоже
Тормозит из-за того что при перемещении на старое место окна вставляется буфер того, что было за окном на том месте, то есть перемещаемое окно исчезает с исходной позиции, а новое сначала записывается в буфер и только потом рисуется окно в новом месте.
Как-то замудрено все ))
Запустил древний Windows 2.03, посмотрел, как там прорисовываются окна, ничего не понял, хотя понял то, что не как у меня. Чтобы четко увидеть, как это происходит, нужен очень слабый комп (Помню на 386 установил 95, так вот там было очень хорошо видно, что отрисовывается).
Цитата
Читай
На утро я все же понял, как это устроено, и у меня появилась пара идей.
Автор: SilentMage 6.10.2011 11:44
когда регионы отрисовки определены, части окон не перерисовываются покомпонентно, а просто копируются из собственных буферов (в которые они и рисуют себя изначально, винда не даст так просто рисовать прямо на экран). запоминать изображение под окном неправильно, так как при переключении активного окна всё поменяется... фон (рабочий стол) - тоже окно, оно так же копируется регионами на открывшиеся места...