Окно диалога
Страница 3. Класс контроллера


Класс контроллера

Класс контроллера, 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;
}

 
« Предыдущая статья   Следующая статья »