Какой принцип отображение и перемещения окон лучше использовать? 
Мне пришло в голову только создание уровней окон и запись участка экрана за каждым окном.
			
			
					
		![]() ![]()  | 
	
| Билли Боб | 
                        
			
			  
			
				 Сообщение
					#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				
			 
		 | 
	
| 
        	
        		 Гость  | 
       
			
			 когда регионы отрисовки определены, части окон не перерисовываются покомпонентно, а просто копируются из собственных буферов (в которые они и рисуют себя изначально, винда не даст так просто рисовать прямо на экран). запоминать изображение под окном неправильно, так как при переключении активного окна всё поменяется... фон (рабочий стол) - тоже окно, оно так же копируется регионами на открывшиеся места... 
			
			
					
		 | 
	
![]() ![]()  | 
	
 
  | 
		Текстовая версия | 4.11.2025 22:05 |