Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по программированию. Visual C++, MFC, VB, ActiveX


Служба Рассылок Subscribe.Ru

Visual Basic. Примеры. Уроки по программированию с сайта http://progs.biz

Рассылка №32

Visual C++. MFC. Урок 27. Создаем диалог с вкладками (PropertyPage).
Visual C++. MFC. Урок 28. Включаем кнопку Apply для PropertyPage.
Visual C++. MFC. Урок 29. Изменяем внешний вид страницы свойств.

Полные версии уроков (с картинками) можно найти по адресам
Урок 27. Создаем диалог с вкладками (PropertyPage).
Урок 28. Включаем кнопку Apply для PropertyPage.
Урок 29. Изменяем внешний вид страницы свойств.

Visual C++. MFC. Урок 27. Создаем диалог с вкладками (PropertyPage)

Этот урок (и, возможно, парочку следующих) мы посвятим использованию диалогов с вкладками.

Для создания такого диалога в вашей программе сначала создайте проект на MFC AppWizard (EXE).

На первом шаге мастера выберите SDI-тип интефейса (Single document), во всех последующих шагах все оставьте по умолчанию. В сгенегированной заготовке добавьте еще один элемент меню. Пусть его идентификатор для определенности будет ID_DIALOG_DIALOG, и его заголовок - Dialog. Добавьте обработчик для нашего нового меню в классе Вида (...View), используя ClassWizard (если забыли - Ctrl+W, вкладка MessageMaps, в combobox'е Class name выбираем класс вида, в левом списке ищем идентификатор диалога ID_DIALOG_DIALOG, в левом выбираем COMMAND), затем нажимаем на Add Function).

Теперь займемся непосредственно нашим диалогом. План здаесь такой: сначала мы для вкладок сделаем парочку диалоговых окон, производных от класса CPropertyPage. Для этих окон некоторые свойства нам надо будет поменять. Затем мы создадим новый класс (без конструктора диалогов), производный от CPropertySheet. В конструкторах этого класса мы вызовем его метод AddPage для добавления двух созданных ранее вкладок. После этого мы покажем наш диалог со вкладками при щелчке на меню. И, напоследок, посмотрим, как можно обменивать данные с нашем диалогом и с классом вида.

Начинаем наши шаги. Создайте диалог для первой вкладки. Уберите с него кнопки OK и Cancel - они нам не понадобятся. Добавьте на наго какой-нибудь элемент (пусть это для определенности будет CheckBox). Измените его заголовок на Options1, свойство Style на Child, Border на Thin, уберите галочку System menu.

После этого вызовите ClassWizard, в появившемся диалоге выберите создание нового класса.

В появившемся диалоге New Class задаете имя класса (у нас это COptions1), и в качестве базового класса выберите CPropertyPage.

Нажмите OK. Абсолютно аналогично создайте диалог для второй вкладки.

Теперь займемся основным классом. Вызовите диалог для создания нового класса. В качестве его базового класса выберите CPropertySheet, в качестве имени что-то вроде CDlg.

Нажмите OK. В заголовочном файле класса CDlg подсоедините include'ом файлы классов двух вкладок и создайте две соответствующе переменные.

...
#include "Options1.h"
#include "Options2.h"
class CDlg : public CPropertySheet
{
    ...
public:
    COptions1 m_op1;
    COptions2 m_op2;
    ...

Затем измените два конструктора класса CDlg:

CDlg::CDlg(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
 :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
    AddPage(&m_op1);
    AddPage(&m_op2);
}

CDlg::CDlg(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
 :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
    AddPage(&m_op1);
    AddPage(&m_op2);
}

Изменяем обработчик для созданного ранее меню Dialog (не забудьте подключить в заголовочный файл для класса вида файл Dlg.h):

void CDlgWithTabsView::OnDialogDialog()
{
    CDlg dlg("Диалог с вкладками");
    dlg.DoModal();
}

Компилируем, запускаем, выбираем меню. Появится наше окно с вкладками.

Наверх

Visual C++. MFC. Урок 28. Включаем кнопку Apply для PropertyPage

У созданного нами на прошлом этапе диалогового окна с вкладками есть один существенный недостаток - у него не работает кнопка Apply. А работать она должна следующим образом - как только мы изменяем что-нибудь в нашем окне со вкладками (в нашем конкретном примере мы можем только щелкать на checkbox'е), то кнопка Apply должна стать активной. Если вы нажимаете на нее, то она должна передать измененные данные из диалогового окна и снова стать серой. Ну что ж, исправим этот недостаток.

Вызываем редактор для первой вкладки (у нее идентификатор IDD_DIALOG1), и делаем двойной щелчок на checkbox'е для добавления обработчика. Будет предложено некоторое название функции-обработчика.

Соглашайтесь с этим названием. В сгенерированный код добавляем вызов метода SetModified:

void COptions1::OnCheck1()
{
 // TODO: Add your control notification handler code here
 SetModified();
}

Вот, собственно, и все. Теперь, если вы запустите программу и вызовите диалоговое окно, то при изменение состояния checkbox'а (т. е. при щелчке на нем) кнопка Apply станет активной.

Заметьте также, что при щелчке на кнопке Apply она опять становится неактивной. Так происходит потому, что при нажатии на Apply вызывается метод SetModified с параметром FALSE.

Наверх

Visual C++. MFC. Урок 29. Изменяем внешний вид страницы свойств

Страницы со вкладками, которые мы строим указанными в прошлых уроках способами, имеют внешний вид по умолчанию. В частности, у них присутствует кнопка Apply и нет кнопки Help. Если кнопка Apply вам не нужна, то избавится от нее можно добавлением следующей строчки перед показом нашего окна:

void CProppageView::OnDialogDialog()
{
    // TODO: Add your command handler code here
    CDlg dlg("Диалог с вкладками");
    dlg.m_psh.dwFlags|= PSH_NOAPPLYNOW;
    dlg.DoModal();
}

Здесь мы используем структуру m_psh класса CProperySheet.

После запуска программы кнопки Apply уже не будет.

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

    ...
    dlg.m_psh.dwFlags|= PSH_HASHELP;
    ...

После этого появится кнопка Help.

Обратите внимание, что кнопка Help серая. Дело в том, что нам еще необходимо установить аналогичный параметр для кнопки Help для вкладок нашего диалогового окна со вкладками. Делаем это, например, так:

void CProppageView::OnDialogDialog()
{
    // TODO: Add your command handler code here
    CDlg dlg("Диалог с вкладками");
    dlg.m_psh.dwFlags|= PSH_HASHELP;
    dlg.m_op1.m_psp.dwFlags|= PSP_HASHELP;
    dlg.DoModal();
}

Теперь после запуска кнопка Help будет тоже активна, причем только для первой вкладки нашего диалогового окна.

Если же мы перейдем на вторую вкладку, то кнопка Help будет серая. В общем-то, ничего удивительного в этом нет - ведь мы добавили строчку dlg.m_op1.m_psp.dwFlags|= PSP_HASHELP; только для первой вкладки m_op1.

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

    ...
    dlg.m_psh.nStartPage = 1;
    dlg.DoModal();
    ...

Теперь при запуске будет активна другая страница (помните, что нумерация идет с нуля).

Наверх

Copyright Алексеев Игорь, 2002

Copyright cайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное