Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
16.02.2016
Размер:
26.09 Mб
Скачать

Void SetTooltips (cTooltipCtrl* pWndTip);

Метод позволяет назначить для вкладки всплывающее окно подсказки.

страница из набора свойств, отображаемая по соответствующему заголовку вкладки, может быть реализована объектом CPropertyPage, производного от CDialog. Диалоговое окно класса CPropertyPage называется страницей свойств.

Окно набора свойств может и не иметь вкладок, а быть реализовано как последовательность страниц свойств, отображаемых шаг за шагом. Такой тип окна свойств, как известно, называется мастером. Примером мастеров могут служить мастера AppWizard, используемые для создания шаблона приложения. Для управления последовательностью страниц в мастерах используются кнопки Back, Next, Finish и Cancel. Для того чтобы создать окно набора свойств типа мастера, следует перед вызовом метода DoModal вызвать метод SetWizardMode, а для доступа к командным кнопкам использовать метод SetWizardButtons.

На рис. 5.34 приведен пример окна свойств Microsoft Visual C++, используемого для настройки среды проектирования.

Окно набора свойств представляет собой специальный вид диалогового окна и, как правило, используется для изменения атрибутов некоторого внешнего объекта. Например, атрибутов выделенного фрагмента в отображении.

Окно набора свойств состоит из трех частей:

• диалогового окна;

• одной или нескольких страниц свойств, показываемых попеременно;

• вкладки, содержащей заголовки вкладок для каждой страницы.

Рис. 5.34. Окно набора свойств Options

Для того чтобы использовать в приложении окно набора свойств, следует: 1. Создать в редакторе ресурсов шаблон диалога отдельно для каждой страницы свойств. При этом следует учитывать, что пользователь будет переключаться между этими страницами из одного диалога.

Шаблоны диалогов могут иметь различный размер - при размещении окна набора свойств будет выбран размер наибольшего шаблона диалога. Каждый шаблон диалога, предназначаемый для страницы свойств, должен иметь следующие атрибуты, указываемые в окне свойств Dialog Properties (рис. 5.35):

• в поле Caption вкладки General вводится заголовок вкладки, отображаемый для текущей страницы;

• из списка Style вкладки Styles выбирается стиль окна Child;

• из списка Border вкладки Styles выбирается стиль рамки Thin;

• установлен флажок Titlebar вкладки Styles;

• установлен флажок Disabled вкладки More Styles.

Рис. 5.35. Окно свойств шаблона диалога, предназначаемого для страницы свойств

2. Создать с помощью ClassWizard для каждого шаблона диалога (предназначенного для страницы свойств) класс, производный от CPropertyPage.

3. Создать с помощью ClassWizard переменные-члены класса, используемые для доступа к странице свойств.

4. Создать в коде программы объект класса CPropertySheet. Если создаваемое окно набора свойств является модальным (используется метод DoModal), то для него автоматически средой выполнения поддерживается обработка трех командных кнопок: OK, Cancel и Apply. Для немодального окна набора свойств, созданного методом Create, среда выполнения не создает этих командных кнопок.

Отметим, что если нет необходимости добавлять другие элементы управления или показывать немодальное окно свойств, то можно не создавать класс, производный от CPropertySheet.

Рис. 5.36. Создание нового класса для страницы свойств

5. Для каждой добавляемой в набор свойств страницы:

• создать по одному объекту производного от CPropertyPage класса;

• вызвать для каждой страницы метод CPropertySheet: :AddPage.

Как правило, объект, создающий CPropertySheet, также создает и объекты CPropertyPage. Но при реализации класса, производного от CPropertySheet, можно встроить в него объекты CPropertyPage и вызвать для каждого метод AddPage из конструктора производного класса. При этом объект страницы свойств будет добавлен в список страниц окна набора свойств, а реальное создание окна не произойдет.

6. Показать окно набора свойств, вызвав метод CPropertySheet::DoModal или CPropertySheet::Create.

7. И в заключение выполнить обмен данными между страницами свойств и владельцем окна набора свойств.

Для того чтобы добавить в окно набора свойств какой-либо элемент управления, следует переопределить метод OnCreate (или OnlnitDialog) следующим образом:

1. Добавить в переопределяемый метод вызов метода базового класса CPropertySheet::OnCreate (или соответственно CPropertySheet::OnInitDialog)

2. Увеличить размер окна набора свойств с учетом добавляемого элемента управления вызовом методов GetWindowRect и MoveWindow.

Для того чтобы выполнить обмен данными с окном набора свойств следует:

1. Создать переменные для доступа к элементам управления страниц свойств. Это выполняется так же, как и для обычных диалоговых окон.

2. Использовать DDX и DDV методы для обмена данными между элементами управления и переменными класса окна страницы свойств. Единственным отличием обмена данными для окна набора свойств от

обмена данными для обычного окна диалога является то, что следует выполнить обмен данными отдельно для каждой страницы свойcтв.

Рассмотрим пример обмена данными между отображением и двумя страницами свойств модального окна набора свойств:

void CMyView::DoModalPropertySheet() // Создание модального окна набора { // свойств с двумя страницами

CPropertySheet propsheet; // Создание объекта

CMyPagel pagel; // Создание объекта класса, производного от CPropertyPage CMyPage2 page2; // Создание объекта класса, производного от CPropertyPage

pagel.mnMemberl = m_nMemberl; // Обмен данными: pagel.m_nMember2 = m_nMember2; // инициализация переменных -

page2.m_strMember3 = m_strMember3; // членов класса

propsheet.AddPage(&pagel); // Добавление страницы свойств propsheet. AddPage(&page2);

if (propsheeet.DoModal() == ШОК)

{

m_nMemberl = pagel.m_nMemberl;

m_nMember2 = pagel.m_nMember2;

m_strMember3 = page2.m_strMember3;

GetDocument()->SetModifiedFlag();

GetDocument()->UpdateAllViews(NULL);

} }

Отметим, что при использовании окна набора свойств бывает необходимо присвоить переменным - членам класса сделанные в странице свойств изменения и отобразить их до закрытия окна. Как правило, в этом случае используется командная кнопка Apply. По умолчанию эта кнопка недоступна. Для того чтобы ее использовать, следует написать соответствующий код, вызвав метод CPropertyPage: :SetModified(TRUE). Определить, были ли сделаны изменения, можно при помощи обработки сообщений EN_CHANGE и BN_CLICKED.

Классы окон свойств библиотеки MFC Класс CPropertySheet

Класс CPropertySheet инкапсулирует возможности управления окном набора свойств. Его непосредственным базовым классом является класс CWnd.

Члены класса CPropertySheet::m_psh

Это структура PROPSHEETHEADER, в которой содержатся атрибуты набора свойств.

Структура PROPSHEETHEADER описывает окно и страницы набора свойств и содержит следующие члены:

typedef struct _PROPSHEETHEADER { // psh

DWORD dwSize; // Размер структуры в байтах

DWORD dwFlags;

HWND hwndParent;

HINSTANCE hlnstance;

union {

HICON hlcon;

LPCTSTR pszlcon;

};

LPCTSTR pszCaption;

DINT nPages // Число элементов в массиве phpage

union {

UINT nStartPage // Индекс первой отображаемой страницы набора // свойств

LPCTSTR pStartPage;

};

union {

LPCPROPSHEETPAGE ppsp;

HPROPSHEETPAGE FAR *phpage; // Указатель на массив дескрипторов

}; // страниц набора свойств

PFNPROPSHEETCALLBACK pfnCallback; } PROPSHEETHEADER, FAR *LPPROPSHEETHEADER; typedef const PROPSHEETHEADER FAR *LPCPROPSHEETHEADER;

CPropertySheet( );

CPropertySheet* UINT nIDCaption, CWnd *pParentWnd = NULL,

UINT iSelectPage = 0 );

CPropertySheet( LPCTSTR pszCaption, CWnd *pParentWnd = NULL, UINT iSelectPage = 0 );

Конструкторы окна набора свойств. Как правило, окна набора свойств создаются в коде метода - обработчика сообщений по которому должно быть отображено это окно.

Параметры:

nIDCaption - ID заголовка для окна набора свойств.

pParentWnd - указатель родительского окна или NULL, если родительским окном является главное окно приложения. Напомним, что указатель на родительское окно можно получить, вызвав метод GetParent. iSelectPage - индекс страницы, которая будет показана первой при отображении окна набора свойств.

pszCaption - указатель строки, содержащей заголовок окна набора свойств. void Construct* UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0 );

void Construct* LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0 );

Эти методы используются вместо вызовов конструктора класса в том случае, если требуется создать не один набор свойств, а массив наборов свойств. При этом метод Construct должен быть вызван для каждого набора свойств из массива.

Например:

CPropertySheet МуРгор[2];

UNIT nIDCaption[2]= {IDS_SHEET1,IDS_SHEET2};

MyProp[l].Construct(nIDCaption[l]);

MyProp[2].Construct(nIDCaption[2]);

int GetActiveIndex( ) const;

Метод возвращает индекс текущей страницы свойств. int GetPageIndex( CPropertyPage* pPage ) const;

Метод возвращает индекс указанной параметром pPage страницы свойств. int GetPageCount();

Метод возвращает количество страниц свойств в окне набора свойств. CPropertyPage* GetPage( int nPage ) const;

Метод возвращает указатель на страницу свойств, заданную по индексу (первая страница имеет индекс, равный нулю). CPropertyPage* GetActivePage( ) const;

Метод возвращает указатель на текущую активную страницу свойств.

BOOL SetActivePage( int nPage );

BOOL SetActivePage( CPropertyPage* pPage );

Эти методы устанавливают новую текущую активную страницу. void SetTitle( LPCTSTR ipszText, UINT nStyle = 0 );

Метод устанавливает заголовок для окна набора свойств. Параметры:

nStyle - определяет стиль окна и может быть равен нулю или PSH_PROPTITLE. Для стиля PSH_PROPTITLE перед указанным вторым параметром текстом заголовка будет вставлена строка Properties for.

IpszText - указатель на строку, содержащую новый заголовок окна набора свойств.

CTabCtrl* GetTabControl();

Этот метод возвращает указатель на объект класса CTabCtrl и обеспечивает тем самым доступ к элементу управления вкладка. Например, это может быть использовано для добавления на этапе инициализации к каждому заголовку вкладки некоторого изображения.

void SetFinishText( LPCTSTR IpszText);

Этот метод устанавливает текст, отображаемый на командной кнопке Finish, и делает ее доступной, а также скрывает кнопки Next и Back.

void SetWizardButtons( DWORD dwFlags );

Этот метод устанавливает доступные командные кнопки для мастера. Параметры:

dwFlags - определяет доступные кнопки и может быть указан комбинацией следующих флажков: PSWIZB_BACK, PSWIZB_NEXT, PSWIZB_FINISH, PSWIZB_DISABLEDFINISH.

Этот метод можно вызывать только после создания окна. Удобнее вызывать из метода - обработчика сообщения CPropertyPage::OnSetActive.

void SetWizardMode();

Этот метод устанавливает, что окно набора свойств будет мастером. При этом метод DoModal по окончании будет возвращать значения ID_WIZFINISH или IDCANCEL.

Метод SetWizardMode устанавливает флажок PSF_WIZARD. Пример:

CPropertySheet dig;

CPropertyPage pagel, page2;

dig. AddPage(&page 1);

dlg.AddPage(&page2);

dlg.SetWizardMode();

dlg.DoModal();

virtual int DoModal( );

Этот метод вызывается для создания модального окна набора свойств. При успешном завершении метод возвращает значение IDОК или CANCEL для набора свойств с вкладками и ID_WIZFINISH или CANCEL для мастера.

Напомним, что метод DoModal по окончании разрушает окно набора свойств и окна страниц, но не уничтожает соответствующие объекты.

BOOL Create (CWnd* pParentWnd = NULL,

DWORD dwStyle = (DWORD) -1, DWORD dwExStyle = 0);

Этот метод используется для создания немодального окна набора свойств.

Параметры:

pParentWnd - указатель родительского окна или NULL, если родительским окном является главное окно приложения.

dwStyle - комбинация флажков, определяющая стиль Windows-окна. Значение -1, используемое по умолчанию, означает следующую комбинацию флажков: WS_SYSMENU | WS_POPUP | WS_CAPTION | DS_MODALFRAME | DS_CONTEXT_HELP | WS_VISIBLE. dwExStyle - комбинация флажков, определяющая расширенный стиль Windows-окна. Значение 0, используемое по умолчанию, означает стиль WS_EX_DLGMODALFRAME.

Метод Create возвращает управление сразу после создания окна. В дальнейшем для удаления этого окна следует использовать метод CWnd:: DestroyWindow.

Напомним, что немодальное диалоговое окно, создаваемое методом Create, не имеет командных кнопок OK, Cancel или Apply.

void AddPage( CPropertyPage *pPage );

Метод добавляет в окно набора свойств указанную страницу свойств.

Параметры: pPage - указатель на страницу свойств.

void RemovePage( CPropertyPage *pPage ); void RemovePage( int nPage );

Эти методы удаляют указанную страницу свойств из окна набора свойств и разрушают соответствующее окно. При этом сам объект удаленной страницы свойств CPropertySheet не удаляется до тех пор, пока не буДет закрыт владелец окна CPropertySheet.

BOOL PressButton( int nButton );

Этот метод имитирует выбор в окне набора свойств указанной командной кнопки.

Параметры:

nButton - определяет нажатую командную кнопку и может быть указан одним из следующих флажков: PSBTN_BACK, PSBTN_NEXT, PSBTN_FINISH, PSBTN_OK, PSBTN_APPLYNOW, PSBTN_CANCEL, PSBTN_HELP.

void EndDiaIog( int nEndID );

Метод вызывается средой выполнения только для модального окна дна-; лога при нажатии на кнопки OK, Cancel или Close.

Класс PropertyPage

Объекты класса CPropertyPage представляют отдельные страницы набора свойств - страницы свойств. Иногда они также называются вкладками диалогового окна. Непосредственным базовым классом для PropertyPage является класс CDialog.

Члены класса CPropertyPage: :m psp

Это структура PROPSHEETPAGE, содержащая атрибуты страницы свойств.

Структура PROPSHEETPAGE имеет следующее описание:

typedef struct _PROPSHEETPAGE { // psp DWORD dwSize; DWORD dwFlags; HINSTANCE hlnstance; union {

LPCTSTR pszTemplate; // используемый шаблон диалога LPCDLGTEMPLATE pResource; };

union { HICON hlcon; LPCTSTR pszlcon;

};

LPCTSTR pszTitle; // заголовок набора свойств (при флажке

// PSPJJSETITLE) DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACK pfnCallback; UINT FAR * pcRefParent;

} PROPSHEETPAGE, FAR *LPPROPSHEETPAGE;

typedef const PROP3HEETPAGE FAR *LPCPROPSHEETPAGE;

CPropertyPage();

CPropertyPage( UINT nIDTemplate, UINT nIDCaption = 0 );

CPropertyPage( LPCTSTR ipszTemplateName, UINT nIDCaption = 0 );

Конструкторы класса.

Параметры:

nIDTemplate - ID шаблона диалога, используемого для создаваемой страницы свойств.

nIDCaption - ID заголовка, используемый как заголовок вкладки для данной страницы. По умолчанию (значение 0) используется заголовок, указанный в шаблоне диалога. IpszTemplateName - указатель строки, содержащей имя шаблона диалога.

void Construct UINT nIDTemplate, UINT nIDCaption = 0 );

void Construct^ LPCTSTR IpszTemplateName, UINT nIDCaption = 0 );

Эти методы используются вместо вызовов конструктора класса в том случае, если требуется создать не одну страницу свойств, а массив страниц свойств. При этом метод Construct должен быть вызван для каждой страницы свойств из массива.

void CancelToClose( );

Этот метод вызывается для отмены командной кнопки Cancel в модальном окне и замены кнопки ОК на кнопку Close. Как правило, это используется в том случае, если произведены такие изменения, которые уже нельзя отменить.

void SetModified( BOOL bChanged = TRUE );

Позволяет делать командную кнопку Apply доступной или недоступной. Параметры:

bChanged - значение TRUE указывает, что с момента последнего выполнения операции применить установки в окне свойств были изменены. Значение FALSE указывает, что установки в окне свойств не менялись ли должны быть проигнорированы.

Отметим, что кнопка Apply будет доступна в том случае, если хотя бы Для одной страницы свойств из окна набора свойств данный метод был вызван с параметром TRUE.

LRESULT QuerySiblings( WPARAM wParam, LPARAM lParam );

Метод используется для того, чтобы послать сообщения другим страницам набора свойств. Если страница возвращает ненулевое значение, то следующей странице свойств сообщение не посылается и метод возвращает данное значение. Метод возвращает нулевое значение только в том случаев если все страницы свойств вернули 0.

virtual void OnCancel();

Метод вызывается средой выполнения при щелчке пользователя на командной кнопке Cancel.

virtual BOOL OnKillActive();

Метод вызывается средой выполнения при смене текущей активной страницы свойств. Для того чтобы выполнить действия, проверяющие достоверность сделанных для страницы свойств изменений, следует переопределить этот метод и добавить в него соответствующий код.

По умолчанию реализация этого метода копирует значения элементов управления страницы свойств в связанные с ними переменные класса. Если DDV-методы обнаружат ошибку, то страница останется в фокусе.

Если выполнение этого метода завершится успешно, то для этой страницы будет вызван метод CPropertyPage::OnOK.

virtual void OnOK();

Метод вызывается средой выполнения при щелчке пользователя на командной кнопке ОК, а также при щелчке на командной кнопке Apply или после вызова метода OnKillActive. Этот метод может быть переопределен c целью добавления некоторых действий, выполняющихся при смене текущей активной страницы. По умолчанию реализация этого метода помечает страницу как "очищенную", что указывает на то, что данные были обновлены при выполнении метода OnKillActive.

virtual BOOL OnSetActive( );

Метод вызывается средой выполнения при выборе пользователем новой активной текущей страницы. virtual BOOL OnApply( );

Метод вызывается средой выполнения при щелчке пользователя на командных кнопках ОК или Apply. По умолчанию реализация этого метода вызывает метод ОnОК.

virtual void OnReset( );

Метод вызывается средой выполнения при щелчке пользователя на командной кнопке Cancel. Все изменения, сделанные на любой из страниц свойств с момента предыдущего щелчка пользователя на кнопке Apply, отменяются. Окно набора свойств остается в фокусе.

virtual BOOL OnQueryCancel( );

Метод вызывается средой выполнения при щелчке пользователя на koмандной кнопке Cancel и до выполнения операции отмены. Если метод возвращает значение FALSE, то отмена сделанных изменений не будет выполнена.

По умолчанию реализация этого метода возвращает значение TRUE.

Соседние файлы в папке VC++Баженова