Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Общие вопросы разработки программ _ Создание графических окон в 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

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

так это же как раз и интересно lol.gif

Автор: Билли Боб 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), хотя хотелось, чтоб при перемещении было видно всё окно sad.gif

Автор: TarasBer 23.09.2011 13:54

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

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

Автор: Билли Боб 23.09.2011 15:26

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

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

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

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


Автор: SilentMage 6.10.2011 11:44

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