Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Быстрое Корректное перемещение Окна


DevilDevil ©   (2006-12-22 18:24:00) 

пишу, честно говоря компонент наподобие окна. размеры этого окна можно изменять мышкой. Вот я и обнаружил, что если левую границу окна двигать влево, то справа появляется рябь.

Вернёмся к реализации: если левая граница окна двигается влево, то свойство Left становится меньше, Width становится больше. Изменение свойств компонента - вещь медленная, т.к. при каждом изменении такого свойства вызывается метод SetBounds.

Для быстрого изменения размеров, чего не делал:

1) SetBounds(tmp_left,tmp_top,tmp_width,tmp_height);
2) SetWindowPos(Handle, 0, tmp_left,tmp_top,tmp_width,tmp_height, 0);
3) MoveWindow(Handle, tmp_left,tmp_top,tmp_width,tmp_height, true);
4) SetWindowPlacement(Handle, @WindowPlacement);


<-- результат один и тот же. Такое впечатление, что сначала у окна изменяется свойство Left, окно отрисовывается, потом изменяется Width, окно перерисовывается; поэтому и появляется рябь.

Тем не менее вызвав MoveWindow(Handle, tmp_left,tmp_top,tmp_width,tmp_height, FALSE);я получил примерно то, что я хочу. Окно перерисовывается очень быстро и правильно. Огромный Минус состоит в следующем: при перемещении левой границы вправо, слева остаётся ореол от моего окна, причём не только на окне-родителе, но и на других окнах.

Подскажите пожалуйста, что мне сделать? Может какими-нибудь InvalidateRect-ами .......


GrayFace   (2006-12-26 20:07:00) [1]

Если TWinControl, то проще всего использовать стандартное изменение размера. Если края свои, можно обрабатывать WM_HITTEST или в OnMouseDown делать ReleaseCapture и посылать WM_SYSCOMMAND.


DevilDevil   (2006-12-25 14:33:00) [2]

Пока ничего лучше не смог сделать:

MoveWindow(Handle, tmp_left,tmp_top,tmp_width,tmp_height, (tmp_width < Width) or(tmp_height < Height) );

Вопрос остаётся открытым


Vga   (2006-12-24 18:29:00) [3]

> [2] DevilDevil ©   (23.12.06 10:35)

AFAIK InvalidateRect указывает ОС, что прямоугольник содержит неверные графические данные, т.е. его надо перерисовать. ValidateRect - наоборот, указывает, что прямоугольник содержит правильные графические данные и перерисовывать его не нужно.


tesseract   (2006-12-24 11:01:00) [4]


> Подскажите, как быстро перерисовать прямоугольную часть
> окна? Смотрел Help, чё-то так и не понял, что делают InvalidateRect
> и ValidateRect.


Перерисовывает только заданную область.


DevilDevil   (2006-12-23 10:35:00) [5]

DoubleBuffered вряд ли поможет. Подскажите, как быстро перерисовать прямоугольную часть окна? Смотрел Help, чё-то так и не понял, что делают InvalidateRect и ValidateRect.

> А при сдвиге влево происходит пересчет всех компонент на окне,
> медленный процесс с учетом кучи проверок.


Совершенно верно. Тем не менее, если я не ошибаюсь, после вызова MoveWindow, всё происходит автоматически пересчитывается без перерисовки.


tesseract   (2006-12-23 00:00:00) [6]

может DubbleBuffered поможет?

А при сдвиге влево происходит пересчет всех компонент на окне, медленный процесс с учетом кучи проверок.


Наверх

Титульная страница Поиск, карта сайта Написать письмо