Текущий архив: 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.46 MB
Время: 0.04 c