Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

Быстрое Корректное перемещение Окна   Найти похожие ветки 

 
DevilDevil ©   (2006-12-22 18:24) [0]

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

Вернёмся к реализации: если левая граница окна двигается влево, то свойство 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-ами .......


 
tesseract ©   (2006-12-23 00:00) [1]

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

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


 
DevilDevil ©   (2006-12-23 10:35) [2]

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

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


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


 
tesseract ©   (2006-12-24 11:01) [3]


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


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


 
Vga ©   (2006-12-24 18:29) [4]

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

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


 
DevilDevil ©   (2006-12-25 14:33) [5]

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

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

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


 
GrayFace ©   (2006-12-26 20:07) [6]

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



Страницы: 1 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
15-1178042772
ShadowMan
2007-05-01 22:06
2007.05.27
TFileStream


4-1166908044
Drone
2006-12-24 00:07
2007.05.27
Потоки и сообщения от одного к другому


15-1177771870
исследователь
2007-04-28 18:51
2007.05.27
Сортировка матрицы


2-1178520778
Doom-2
2007-05-07 10:52
2007.05.27
Как в ListBox строки местами менять?


3-1173595209
_kos
2007-03-11 09:40
2007.05.27
Подключение к удалённой mysql