- •Создание немодальных диалоговые окон
- •Подведение итогов
- •Глава 7. Диалоговые окна с вкладками и стандартные диалоги
- •Классы диалоговых окон с вкладками (окон свойств)
- •Задание 1. Создание проекта и ресурсов шаблонов диалоговых окон
- •Задание 2. Создание классов диалоговых окон и добавление переменных-членов
- •Задание 3. Изменение ресурса меню, создание обработчиков сообщений
- •Задание 4. Инициализация переменных, связанных с элементами управления
- •Стандартные диалоговые окна
- •Список классов стандартных диалоговых окон
- •Диалоговые окна File Open и Save File As
- •Диалоговые окна Find и Replace
- •Диалоговое окно Page Setup
- •Диалоговые окна Print и Print Setup
- •Информационные диалоговые окна
- •Задание 5. Отображение стандартных диалоговых окон
Задание 4. Инициализация переменных, связанных с элементами управления
Инициализация переменных, связанных с элементами управления диалоговых окон-вкладок, выполнена в конструкторах соответствующих классов.
1. Измените начальное значение переменной m_Spacing, открыв конструктор класса CPitch и записав в списке инициализации переменной m_Spacing значение 1 для единичного междустрочного расстояния.
CPitch::CPitch() : CPropertyPage(CPitch::IDD) , m_Pitch(0) , m_Spacing(1) { }
2. Для ограничения ввода значения междустрочного интервала одним разрядом числа и предупреждения ошибок ввода выполните инициализацию диалогового окна Pitch, создав обработчик сообщения WM_INITDIALOG класса CPitch. Для этого в окне Class View выберите класс CPitch. В окне Properties щелкнув на кнопке Overrides, разверните список виртуальных функций. Выделите имя OnInitDialog и выполните команду <Add > OnInitDialog. Введите в тело функции следующие операторы, выделенные полужирным шрифтом.
BOOL CPitch::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here m_SpacingEdit.LimitText(1); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
3. Добавьте в класс документа переменные-члены, связанные с управляющими элементами диалогов. Для этого в окне Class View выберите класс CTabDemoDoc. Откройте окно Add Member Variable Wizard командой AddAdd Variable…. Заполните поля мастера добавления переменных: в поле Variable name задайте m_Bold; в поле Variable type — значение BOOL, в поле Access —значение public. Повторите вызов мастера для переменных m_Italic и m_Underline типа BOOL, m_Justify, m_Pitch и m_Spacing типа int.
4. Измените код инициализации переменных, хранящих параметры форматирования. Для переменной m_Spacing в списке инициализации конструктора класса CTabDemoDoc в файле TabDemoDoc.cpp укажите значение 1. Переменной m_Justify присвойте значение JUSTIFY_LEFT, переменной m_Pitch — значение PITCH_VARIABLE. Изменения кода показаны полужирным шрифтом.
CTabDemoDoc::CTabDemoDoc() : m_Bold(false) , m_Italic(false) , m_Underline(false) , m_Justify(JUSTIFY_LEFT) , m_Pitch(PITCH_VARIABLE) , m_Spacing(1) { // TODO: add one-time construction code here }
5. Для идентификации значений JUSTIFY_LEFT и PITCH_VARIABLE в файле TabDemoDoc.h определите следующие перечисления и переменные, вставив их до объявления класса.
enum {JUSTIFY_LEFT, JUSTIFY_CENTER, JUSTIFY_RIGHT}; enum {PITCH_VARIABLE, PITCH_FIXED}; class CTabDemoDoc : public CDocument
{ //не приводятся объявления атрибутов и методов };
6. Дополните обработчик командного сообщения OnTextFormat() класса CTabDemoDoс кодом, который обеспечивает инициализацию объектов вкладок, сохранение значений элементов управления вкладок и осуществляет перерисовку текста. Добавленный в файл TabDemoDoc.cpp код выделен полужирным шрифтом.
void CTabDemoDoc::OnTextFormat() { // TODO: Add your command handler code here CPropertySheet PropertySheet ("Format"); // создание объекта для каждой страницы: CStyle StylePage; CJustify JustifyPage; CPitch PitchPage; // добавление страниц к объекту диалогового окна: PropertySheet.AddPage (&StylePage); PropertySheet.AddPage (&JustifyPage); PropertySheet.AddPage (&PitchPage); // инициализация объектов страниц: StylePage.m_Bold = m_Bold; StylePage.m_Italic = m_Italic; StylePage.m_Underline = m_Underline; JustifyPage.m_Justify = m_Justify; PitchPage.m_Pitch = m_Pitch; PitchPage.m_Spacing = m_Spacing; // отображение диалогового окна с вкладками: if (PropertySheet.DoModal () == IDOK) { // сохранение значений элементов управления страниц: m_Bold = StylePage.m_Bold; m_Italic = StylePage.m_Italic; m_Underline = StylePage.m_Underline; m_Justify = JustifyPage.m_Justify; m_Pitch = PitchPage.m_Pitch; m_Spacing = PitchPage.m_Spacing; // перерисовка текста: UpdateAllViews (NULL); } }
Как и класс CDialog, класс CPropertyPage создает обработчики для кнопок OK и Cancel, а также проверяет и передает данные между элементами управления и функциями объектов-страниц. Чтобы сделать доступной кнопку Apply или добавить кнопку Help и обработчик для одной из этих кнопок, необходимо породить собственный класс от класса CPropertyPage. В программе TabDemo кнопка Apply заблокирована. В документации фирмы Microsoft утверждается, что лучше оставить эту кнопку заблокированной, а не пытаться ее удалить, так как это — стандартное средство интерфейса диалоговых окон с вкладками. Аналогичное действие необходимо выполнить, если вы хотите увеличить размер диалогового окна с вкладками и добавить дополнительные элементы управления в само диалоговое окно (а не в одну из вкладок). Например, можно включить рамку для отображения образца, показывающего результаты применения параметров диалогового окна (подобно рамке Sample диалогового окна Format программы FontDemo).
7. В функцию OnDraw() файла TabDemoView.cpp добавьте код для отображения текста в окне. Такой же код добавлялся в функцию OnDraw() класса представления программы FontDemo (см. главу 6).
void CTabDemoView::OnDraw(CDC* pDC) { CTabDemoDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here RECT ClientRect; CFont Font; LOGFONT LF; int LineHeight; CFont *PtrOldFont; int X, Y; // заполнение структуры LF свойствами системного шрифта CFont TempFont; if (pDoc->m_Pitch == PITCH_VARIABLE) TempFont.CreateStockObject (SYSTEM_FONT); else TempFont.CreateStockObject (SYSTEM_FIXED_FONT); TempFont.GetObject (sizeof (LOGFONT), &LF); //инициалиация полей lfWeight, lfItalic и lfUnderline: if (pDoc->m_Bold) LF.lfWeight = FW_BOLD; if (pDoc->m_Italic) LF.lfItalic = 1; if (pDoc->m_Underline) LF.lfUnderline = 1; Font.CreateFontIndirect (&LF); // создание и выбор шрифта PtrOldFont = pDC->SelectObject (&Font); // установка выравнивания: GetClientRect (&ClientRect); switch (pDoc->m_Justify) { case JUSTIFY_LEFT: pDC->SetTextAlign (TA_LEFT); X = ClientRect.left + 5; break; case JUSTIFY_CENTER: pDC->SetTextAlign (TA_CENTER); X = ClientRect.right / 2; break; case JUSTIFY_RIGHT: pDC->SetTextAlign (TA_RIGHT); X = ClientRect.right - 5; break; } // установка цвета текста и режима фона: pDC->SetTextColor (::GetSysColor (COLOR_WINDOWTEXT)); pDC->SetBkMode (TRANSPARENT); // вывод строк текста: LineHeight = LF.lfHeight * pDoc->m_Spacing; Y = 5; pDC->TextOut (X, Y, "This is the first line of sample text."); Y += LineHeight; pDC->TextOut (X,Y,"This is the second line of sample "text."); Y += LineHeight; pDC->TextOut (X, Y, "This is the third line of sample text."); // отмена выбора шрифта: pDC->SelectObject (PtrOldFont); }
8. Измените заголовок главного окна, вызвав функцию SetWindowText() класса CWnd в теле функции CTabDemoApp::InitInstance() файла TabDemo.cpp. Вызов функции необходимо выполнить после функции ProcessShellCommand(), которая управляет параметрами командной строки.
BOOL CTabDemoApp::InitInstance() { CWinApp::InitInstance(); // Standard initialization SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(4); CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTabDemoDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CTabDemoView)); AddDocTemplate(pDocTemplate); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (!ProcessShellCommand(cmdInfo)) return FALSE; m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); // call DragAcceptFiles only if there's a suffix // In an SDI app, this should occur after ProcessShellCommand m_pMainWnd->SetWindowText ("Tabbed Dialog Box Demo"); return TRUE; }
Рис. 7.11. Окно программы TabDemo с измененным заголовком
9. Скомпонуйте и запустите программу TabDemo. На экране появится окно как показано на рис. 7.11.