Страница 3 из 7
Класс контроллера
Класс контроллера, EditorCtrl, содержит все операции. Прежде всего он встраивает в себя элемент редактирования. Этот объект ответствен за взаимодействие с элементом редактирования, внедренным в диалоговое окно. Элемент имеет идентификатор IDC_NAME_EDIT, заданныйс помощью редактора ресурсов. Во-вторых, контроллер хранит указатель на EditorData. Этот указатель взят из базового класса DlgController. Три виртуальных метода DlgController должны быть переписаны в нашем EditorControl. Это OnInitDialog, который вызывается немедленно после того, как диалог был инициализирован, OnCommand, который вызывается всякий раз, когда любой элемент диалогового окна посылает нам команду и, в заключение, OnNotify, который используется новыми элементами управления Windows95. class EditorCtrl : public DlgController
{ public: EditorCtrl (HWND hwndDlg, void *argList) : DlgController (argList), _nameEdit (hwndDlg, IDC_NAME_EDIT)
{ _dlgData = (EditorData *) GetArgList (); }
void OnInitDialog (HWND hwnd); bool OnCommand (HWND hwnd, int ctrlID, int notifyCode); bool OnNotify (HWND hwnd, int idCtrl, NMHDR *hdr);
private: Edit _nameEdit; EditorData *_dlgData; }; | В методе OnInitDialog мы обрабатываем строку, которая была передана в EditorData и используем ее, чтобы инициализировать элемент редактирования. void EditorCtrl::OnInitDialog (HWND hwnd) { char const * name = _dlgData->GetName (); _nameEdit.SetString (name); } | OnCommand получает команды от различных элементов. Элементы идентифицированы их идентификаторами. Например, если идентификатор - IDC_NAME_EDIT, это означает что что-то произошло с элементом редактирования. В нашей реализации мало функциональности, и мы реагируем на каждое изменение, копируя целую строку в объект EditorData. Хотя встречаются случаи, когда Вы должны проверять правильность строки или отображать ее в некотором другом элементе управления, а также Вы должны реагировать на каждое сообщение об изменении. Когда пользователь нажимает кнопку OK, мы получаем команду с идентификатором IDOK. Мы проверяем строку и, если она правильная, то заканчиваем диалог, передающий TRUE как код возврата. Когда идентификатор - IDCANCEL (от кнопки Cancel) мы заканчиваем диалог с кодом возврата FALSE. Метод OnNotify ничего не делает при использовании элементов управления, использовавшихся до Widnows95, таких как элементы редактирования и кнопки. bool EditorCtrl::OnCommand (HWND hwnd, int ctrlID, int notifyCode) { switch (ctrlID) { case IDC_NAME_EDIT: if (_nameEdit.IsChanged (notifyCode)) { char nameBuf [EditorData::maxLen]; int len = _nameEdit.GetLen (); if (len < EditorData::maxLen) { _nameEdit.GetString (nameBuf, sizeof (nameBuf)); _dlgData->SetName (nameBuf); } return true; } break; case IDOK: if (_dlgData->IsNameOK ()) { EndDialog(hwnd, TRUE); } else { MessageBox (hwnd, "Please, enter valid name", "Name Editor", MB_ICONINFORMATION | MB_OK); } return true; case IDCANCEL: EndDialog(hwnd, FALSE); return true; } return false; }
bool EditorCtrl::OnNotify (HWND hwnd, int idCtrl, NMHDR *hdr) { return false; } | |