Вверх
Теперь ваш собственный конструируемый диалог готов. Его использование
похоже на работу с общими диалогами, встроенными в Widows:
Сделайте следующее:
Листинг 6.3 Заголовочные файлы
Очень важно поместить директиву #include "MsgDlg.h" перед директивой
#include "DialogsDlg.h".
Теперь когда класс главного окна приложения располагает информацией
о конструируемом диалоге, нужно добавить переменную конструируемого
диалога.
Для этого выполните следующее:
// CDialogsDlg dialog Класс главного окна приложения
. . . (код пропущен)
Вверх
Теперь переменная конструируемого диалога добавлена в класс главного
окна приложения как глобальная, а не как локальная переменная, доступная
внутри отдельной функции (как например переменная для CFileDialog).
И наконец можно вставить код, использующий конструируемый диалог.
Выполните следующие инструкции :
Листинг 6.4 Функция OnBnClickedBcustomdialog
Данный метод отображает на экране диалоговое окно и ожидает, пока
пользователь щелкнет на одной из двух кнопок.Если пользователь щелкнет
на OK , то в переменную, соответствующую окну редактирования главного
окна приложения, копируется текст, введенный пользователем в конструируемый
диалог.(В дальнейшем этот текст отображается.)
После обновления диалогового окна приложения новыми значениями переменных,
становится доступной кнопка Which Option :
Если же пользователь щелкнет на Cancel, то ни какие
действия производиться не будут и главное окно приложения останется
без изменений.
Листинг 6.5 Функция OnBnClickedBwhichoption()
case 2:
default:
}
UpdateData(FALSE);
Если теперь пользователь щелкнет на кнопке Which Option,
(Листинг 6.5)то значение переменной, связанной с переключателем, будет передано оператору выбора switch, и он выберет для отображения пользователю то сообщение, в котором содержится информация о выбранном переключателе.
Заметьте что в обеих функциях можно из класса главного окна приложения
напрямую обращаться к переменным, назначенным для элементов управления
конструируемого диалога, поскольку эти переменные были объявлены
с модификатором public - именно благодаря этому они стали доступны даже
из вне их класса. При необходимости в заголовочном файле класса
модификатор доступа можно заменить на private.
Вверх
Вы научились добавлять в приложение собственные диалоговые окна для
поддержки взаимодействия с пользователем. Вы изучили простую в использовании
функцию MessageBox, а так же научились задавать различные сочетания кнопок
и определять на какой из кнопок щелкнул пользователь. Вы увидели
как можно использовать эту информацию для управления работой программы.
Узнали о некоторых общих диалогах, встроенных в Windows, и о том в каких
классах из библиотеки MFC они инкапсулированы. Вы научились применять
стандартный диалог выбора файла File Open и определять какой из файлов
выбрал пользователь.
Вы научились создавать свои собственные диалоговые окна, и добавлять их
в приложения с целью получить информацию от пользователя. И вы научились
применять эту информацию в приложении.
Вверх
Конструируемый диалог ничем не отличается от диалоговых окон, которые вы использовали в создаваемых ранее приложениях. Код можно добавить если понадобится самостоятельно управлять поведением диалога. В этой главе
не было ни малейшей необходимости в добавлении какого либо кода в
конструируемый диалог. Единственное, что должен был сделать КД -
это вызвать перед своим закрытием функцию UpdateData, что автоматически
делала функция OnOK. А поскольку вы не удаляли кнопок OK и Cancel,
то эта функция по прежнему оставалась встроенной в ваш диалог.
Приложение будет скомпилировано а при вызове функции MessageBox
может ничего не случиться или же будет отображаться только одно из
предусмотренных сочетаний кнопок. Помните, что отобразится только одно сочетание, так что применять к двум ( или более) сочетаниям кнопок
операцию ИЛИ не имеет смысла.
Класс CFileDialog имеет свойство m_ofn с модификатором доступа public.
Это свойство является структурой, содержащей различные многочисленные атрибуты диалога File Open, включая начальный каталог. Данная структура имеет тип OPENFILENAME, а ее определение приведенов листинге 6.6
Листинг 6.6 Структура OPENFILENAME
Для управления поведением диалога File Open можно установить значение любого из этих атрибутов перед вызовом метода DoModal. Например в листинге 6.7
показано как перед вызовом методе DoModal установить начальный каталог
c:\Temp. Тогда в диалоговом окне File Open вначале будет открыт именно этот каталог.
Листинг 6.6 Исправленная функция OnBnClickedBfileopen
//установить текущий диалог
if(ldFile.DoModal() == IDOK)
}
Вверх
Назад |
Начало урока |
Вверх |
Вперед
Использование в приложении конструируемого диалога
Создание экземпляра диалога
Чтобы в приложении использовать конструируемый диалог, его переменные и
методы должны быть доступны для класса главного окна приложения.
Это достигается путем включения заголовочного файла конструируемого
диалога в главный исходный файл главного окна приложения.
#include "stdafx.h"
#include "Dialogs.h"
#include "MsgDlg.h"
#include "DialogsDlg.h"
Дело в том.что в заголовочный файл главного окна
приложения будет добавлено объявление переменной для конструируемого
диалога. Если заголовочный файл MsgDlg.h включить после DialogsDlg.h ,
то компилятор обнаружит ошибку и не сможет скомпилировать.
Если теперь вы откроете в дереве проекта класс CDialogDlg, то увидите
экземпляр конструируемого диалога как член класса главного окна приложения.
Это означает , что конструируемый диалог можно уже использовать в приложении.
class CDialogsDlg : public CDialog
{
public:
. . .
afx_msg void OnBnClickedBwhichoption();
Вызов диалога и чтение значений переменных
void CDialogsDlg::OnBnClickedBcustomdialog()
{
UpdateData(FALSE);
m_cWhichOption.EnableWindow(TRUE);
В листиге 6.4 Случай когда пользователь щелкнул на
кнопке Custom Dialog:
-вызывается метод DoModal нашего дочернего окна ( конструируемого диалога).
if(m_dMsgDlg.DoModal() == IDOK)
m_strResults = m_dMsgDlg.m_strMessage;
UpdateData(FALSE);
m_cWhichOption.EnableWindow(TRUE);
void CDialogsDlg::OnBnClickedBwhichoption()
{
{
break;
break;
break;
break;
Резюме
Вопросы и ответы.
typedef struct tagOFN{ //ofn
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD FilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPTSTR lpstrInitialDir;
LPTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPTSTR lpstrDefExt;
DWORD lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
void CDialogDlg::OnBnClicedBfileopen()
{
ldFile.m_ofn.lpstrInitialDir = "C:\\Temp\\";
{
UpdateData(FALSE);
Вопросы
Упражнения
Содержание