Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
193-224.doc
Скачиваний:
1
Добавлен:
11.11.2019
Размер:
378.88 Кб
Скачать

Задание 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 командой AddAdd 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]