Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.047 c
2-1178518822
Washington
2007-05-07 10:20
2007.05.27
ConnectionString в ADOConnection


6-1163756442
MOtoroller
2006-11-17 12:40
2007.05.27
изменить Webbrowser или как выводить баннеры ?!?


6-1163929428
-~-
2006-11-19 12:43
2007.05.27
Пара вопросов про ICS (TWSocket).


15-1177669997
Pavel Kuznecov
2007-04-27 14:33
2007.05.27
ASF - Позиция


2-1178595303
Konus
2007-05-08 07:35
2007.05.27
formatfloat





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский