Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Динамическое добавление PropertyPage


Автор: constN 10.6.2008, 10:40
Вопрос вот в чем.
Я на PropertySheet динамически добавляю страницы(по кнопке из самой PropertySheet). 
Не смог найти как перерисовать PropertySheet, так чтобы была видна вся новая страница(размер поменялся).
Если диалог закрыть и открыть, то PropertySheet подхватывает новые размеры. Как это сделать динамически.
Может мессага какая кидается при инициализации? Среди методов ничего похожего не нашел.

В общем, если кто знает подскажите пожалуйста.

Автор: Earnest 10.6.2008, 12:51
Не совсем поняла - так новая страница не появляется? Тогда при чем тут размер?

Автор: voov 10.6.2008, 13:26
Если перерисовка поможет, то - Invalidate()

Автор: constN 10.6.2008, 13:32
Да нет, новая страница появляется (с этим все ОК).
Просто когда добавляешь с десяток новых страниц их закладки (не помню, как они по-научному называются), выстраиваются сверху в 3-4 ряда. Естестественно они занимают место. А размер PropertySheet остается как в момент открытия диалога. Поэтому видимая рабочая область PropertyPage урезается снизу. Кода диалог закроешь и откроешь снова размер PropertySheet становиться новый (с учетом новых Page) - и все отображается снова красиво. Я так понимаю размер PropertySheet высчитывается (в зависимости от размеров PropertyPage) когда-то в момент инициалицации PropertySheet.

Руками вычислять размер PropertySheet (так чтобы красиво отображались PropertyPage) в момент добавления не хотелось-бы (выдь факт, что PropertySheet умеет это делать самостоятельно).
Вариант сделать чтобы закладки выстраивались в линию с возможностью прокрутки не предлагать - так постановщик не хочет.

Вопрос - как пересчитывать размер PropertySheet в зависимости от размера  PropertyPage когда диалог открыт. Может событие какое возникает, типа Refresh, или Message какая кидается в систему, которая дает команду перерисовать PropertySheet с учетом PropertyPage?

Попытался объяснить попонятнее.

Автор: Earnest 10.6.2008, 13:48
Ясно...
Есть сообщение PSM_RECALPAGESIZES, сама не пробовала, но вроде по описание это оно:
Цитата

When a property sheet is created, it is sized to fit its initial collection of pages. In order to maintain compatibility with previous versions of the common controls, property sheets and wizards do not automatically resize themselves when pages are subsequently added or removed. With common controls version 5.80 and later, applications should send a PSM_RECALCPAGESIZES message after adding or removing pages with PSM_ADDPAGE, PSM_INSERTPAGE, PSM_REMOVEPAGE, or their equivalent macros. It ensures that the property sheet is properly sized for its current collection of pages. If this message is not sent, some property sheet pages may be truncated or too large.


Автор: constN 10.6.2008, 14:27
Спасибо Earnest, это ОНО.
пришлось правда добавить
Код

#define PSM_RECALCPAGESIZES     (WM_USER + 136)

иначе компилятор ругался.

Итоговый ответ - после PageAdd() делаем:
Код

SendMessage(PSM_RECALCPAGESIZES,0,0);


Еще раз спасибо за оперативную помощь.

Автор: Earnest 11.6.2008, 08:34
Цитата(constN @  10.6.2008,  15:27 Найти цитируемый пост)
пришлось правда добавить

Ой! Оно ведь определено в WinAPI - нужно просто включить CommCtrl.h или CommDlg.h... или прямо PrSht.h.
А то, что ты сделал, не очень хороший путь...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)