Главная страница
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.029 c
11-1160141707
Zoom Evstrahiev
2006-10-06 17:35
2007.05.27
Зеркало для KOLCoolBar


15-1177417389
ArtemESC
2007-04-24 16:23
2007.05.27
Вопросик интересный...


2-1178611758
Gentos
2007-05-08 12:09
2007.05.27
как в TEdit переместить курсор (вертикальную палку) в конец стр


2-1178504800
Konus
2007-05-07 06:26
2007.05.27
работа со string ом


4-1166812769
O.O
2006-12-22 21:39
2007.05.27
Количество точек на дюйм экрана