Какой принцип отображение и перемещения окон лучше использовать?
Мне пришло в голову только создание уровней окон и запись участка экрана за каждым окном.
Создание графических окон в TP. |
Создание графических окон в TP. |
Билли Боб |
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Какой принцип отображение и перемещения окон лучше использовать?
Мне пришло в голову только создание уровней окон и запись участка экрана за каждым окном. |
TarasBer |
Сообщение
#2
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Ничего записывать не надо.
Просто при сдвиге окна всем окнам, что были под старым местом, шлётся сообщение перерисовки. -------------------- |
Билли Боб |
Сообщение
#3
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
но тогда ведь придется весь экран перерисовывать, разве нет?
|
sheka |
Сообщение
#4
|
Я. Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: 11 |
Кстати, как это реализовано в Windows? Если не ошибаюсь, то там отрисовывается не все окно, а только его часть, которая как раз и была закрыта.
Добавлено через 14 мин. Билли Боб, почему же весь? Цитата всем окнам, что были под старым местом т.е. проверяешь, не перекрываются ли "прямоугольники" окон: перемещаемого и всех остальных окон экрана. Если пересекаются - посылаешь сообщение тому окну, которое было под перемещаемым, и таким образом будет перерисовано только некоторое кол-во окон. |
Билли Боб |
Сообщение
#5
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
а перемещаемое окно надо же как-то убрать с прежнего места
|
IUnknown |
Сообщение
#6
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
Цитата посылаешь сообщение тому окну, которое было под перемещаемым, и таким образом будет перерисовано только некоторое кол-во окон. И зачем, собственно, надо перерисовывать полностью окно, лежащее ПОД тем, которое перетянули с места на место, а потом еще и перерисовывать само верхнее окно (фактически, тебе придется перерисовать ВСЕ окна, лежащие под рабочим, в порядке от нижнего к верхнему)?В Windows это реализовано на уровне регионов. Область, которую надо перерисовать, помечается как невалидная, и потом, при получении сообщения WM_PAINT, только эта область перерисовывается. Если у тебя есть окно, под которым лежат три других, и при смещении верхнего окна на 20 пикселей, на нижележащих открываются участки шириной 20 пикселей - то перерисованы будут именно и только эти 3 маленьких участка, а не все 3 нижних окна... Не надо равняться на Windows... Да и велосипедостроением тоже не надо заниматься. Под ДОС (и под ТР, кстати) есть прекрасная библиотека для построения граф. интерфейса, называется Graphic Vision (графический аналог Turbo Vision), скачай ее и посмотри, как оно там реализовано (насколько я помню, исходники доступны), или вообще пользуйся ей, а не самоделкой. |
Билли Боб |
Сообщение
#7
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Цитата велосипедостроением так это же как раз и интересно |
Билли Боб |
Сообщение
#8
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Цитата В Windows это реализовано на уровне регионов Все же можно поподробнее? |
IUnknown |
Сообщение
#9
|
Гуру Группа: Пользователи Сообщений: 1 013 Пол: Мужской Ада: Разработчик Embarcadero Delphi: Сторонник Free Pascal: Разработчик Репутация: 627 |
|
Lapp |
Сообщение
#10
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Одобряю серьезный подход. Когда-то, в начале 90-х, я взялся писать многооконный редактор - правда, в текстовой моде, но очень амбиционный )) - на манер MultyEdit, но шире. Без TurboVision, у меня был свой набор прикольных примочек, гораздо удобнее )). Делал на XT без HD, с двумя дисководами по 360 КБ (я ее упер домой с работы и сидел по ночам)). Так вот, с наскока у меня с окнами не получилось - вроде и работало, но глючило. Пришлось все продумать с начала и переделать.
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Билли Боб |
Сообщение
#11
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Цитата Читай Жаль, что я ничего не понял. Цитата Пришлось все продумать с начала и переделать Вот и я так, третий раз уже переделал. Хотя сейчас у меня все получилось, вот только когда окно двигаешь, немного тормозит, точнее чем больше окно, тем больше тормозит. Надо что-то делать с перерисовкой окна. Как это сделано в Windows я так и не понял. |
TarasBer |
Сообщение
#12
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
Просто вычисляешь границы участка A, который надо перерисовать.
Потом смотришь, какие окна W[i] этот участок задевают. Вычисляешь границу каждого подучастка A[i], относящегося именно к W[i]. Потом каждому окну W[i] шлёшь сообщение о перерисовке A[i]. Всё. Перемещаемое окно никуда убирать не надо, просто то место, где оно было, перерисуют другие окна. Могут и не перерисовать, если они повисли - в винде тже так бывает. Нет, экран перерисовывать не надо, надо просто вычислить, что именно надо перерисовать. > вот только когда окно двигаешь, немного тормозит Модулем Graph окно рисуешь небось? -------------------- |
IUnknown |
Сообщение
#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), хотя хотелось, чтоб при перемещении было видно всё окно |
TarasBer |
Сообщение
#14
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
> хотя хотелось, чтоб при перемещении было видно всё окно
Ну если ты делал с буфером, то это можно было бы сделать, если бы был второй буфер, в котором составляется картинка того, как бы выглядел экран под новым положением окна, если бы верхнего окна не было. Короче, всё сведётся к копированию уголков, грубо говоря. -------------------- |
Билли Боб |
Сообщение
#15
|
Новичок Группа: Пользователи Сообщений: 47 Пол: Мужской Репутация: 0 |
Цитата Модулем Graph окно рисуешь небось? да нет вроде, хотя название похоже Тормозит из-за того что при перемещении на старое место окна вставляется буфер того, что было за окном на том месте, то есть перемещаемое окно исчезает с исходной позиции, а новое сначала записывается в буфер и только потом рисуется окно в новом месте. Как-то замудрено все )) Запустил древний Windows 2.03, посмотрел, как там прорисовываются окна, ничего не понял, хотя понял то, что не как у меня. Чтобы четко увидеть, как это происходит, нужен очень слабый комп (Помню на 386 установил 95, так вот там было очень хорошо видно, что отрисовывается). Цитата Читай На утро я все же понял, как это устроено, и у меня появилась пара идей. |
SilentMage |
Сообщение
#16
|
Гость |
когда регионы отрисовки определены, части окон не перерисовываются покомпонентно, а просто копируются из собственных буферов (в которые они и рисуют себя изначально, винда не даст так просто рисовать прямо на экран). запоминать изображение под окном неправильно, так как при переключении активного окна всё поменяется... фон (рабочий стол) - тоже окно, оно так же копируется регионами на открывшиеся места...
|
Текстовая версия | 23.12.2024 23:22 |