Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Размеры/позиция формы (Delphi&Kylix)

1.9K
08 января 2004 года
AviDen
91 / / 26.12.2003
Народ, помогите!

Заранее прошу пардона за некоторую путаность и нетривиальность вопроса. Ну, уж какой есть... :(

Короче постанова такая. Есть наследник от TForm. Он, кроме всего прочего, умеет сохранять/восстанавливать из реестра свои размеры/позицию. Все работает зачепись, НО!

Если мы имеем дело с MDI-Child формой, то при создании оной ее размеры/позиция назначаются VCL-кой автоматом. Т.е., если я в событии OnCreate загружу размер, он все равно будет перекрыт в момент первого показа формы.

Это можно обойти, загрузив размер в OnShow, но тогда я получу неслабый глюк, если на форме есть контролы с установленным НЕ по-умолчанию свойством Anchors (т.е., <> [akLeft, kTop]). А именно, расстояние между "привязанным" краем контрола будет не то, что я видел в процессе дизайна.

[SIZE=1]Если это непонятно, просто возьмите на веру - конкретный и противный глючара. Проверить очень просто. Создайте проект с MDI-Parent и MDI-Child формами, на последнюю киньте TEdit, растяните его вдоль верхнего края формы (не применяя Align) и установите для него Anchors = [akLeft,akTop,akRight]. Запустите проект - видите, что случилось с Edit'ом? рсстояние от правого края контрола до правого края формы совсем не то![/SIZE]

Короче, выход я нашел. В OnShow я делаю PostMessage(Handle, MSG_FIRSTSHOW, 0, 0), где MSG_FIRSTSHOW - моя константа и в моем-же методе обработки этого сообщения и производится загрузка размера (т.е., когда форма уже окончательно создана/показана и все внутренние подстройки Align'ов и Anchor'ов уже завершены).

Только здесь один неприятный бок - форма "мигает" при загрузке. Т.е., она сначала получает-таки размер/позицию по умолчанию, отрисовывется, а потом только загружает размер. Я пытаюсь избежать этой ненужной прорисовки с помощью WM_SETREDRAW, но этот флаг блокирует перерисовку только самого окна, но не его дочерних окон (т.е. контролов).

Итак вопрос: как заставить винду полностью заблокировать отрисовку некоторого окна со всеми его дочерними контролами?

Как я уже написал, WM_SETREDRAW не помогает. Не работает также и блокировка сообщений типа WM_PAINT, WM_ERASEBKGND, WM_NCPAINT. Подскажите, плиз.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог