Окно диалога - Клиентский код

ОГЛАВЛЕНИЕ

 

Клиентский код

Давайте, начнем с клиентского кода. В нашей обобщенной программе мы нуждаемся в диалоговом окне, которое позволяет пользователю редактировать строку. Используя редактор ресурса, мы создаем шаблон диалога, который содержит средства редактирования и две кнопки, OK и CANCEL. Идентификатор ресурса (id) этого диалога - IDD_EDITDIALOG. Затем мы определяем наш собственный класс списка параметров по имени EditorData и специальный класс контроллера по имени EditorCtrl. Когда пользователь выбирает пункт меню Edit, будет выполняться следующий код:

void Controller::Edit (HWND hwnd)

{
EditorData data (_model.GetText ());
ControllerFactory <EditorCtrl, EditorData> factory (& data);
ModalDialog dialog (_hInst, hwnd, IDD_EDITDIALOG, & factory);

if (dialog.IsOk ())
{
_model.SetText (data.GetName ());
// Force repaint
InvalidateRect (hwnd, 0, TRUE);
}
}

Сначала создается и инициализируется строкой объект EditorData. Затем, формируется шаблон ControllerFactory. Мы параметризуем его двумя клиентскими классами EditorCtrl и EditorData. Объект фабрики инициализирован указателем на наши данные. Затем создается объект ModalDialog. Он получет указатель на нашу фабрику в качестве параметра. Это используется для того, чтобы создать объект контроллера и восстанавливать данные из списка параметров. После того, как проведено взаимодействие с пользователем, мы проверяем, подтверждал ли пользователь результаты, нажимая кнопку OK, и если так, то мы фиксируем результаты редактирования и используем их в нашей программе. Этот способ создания диалогового окна является наиболее типичным.

Класс EditorData в нашем примере предельно прост.

class EditorData

{

public:
enum { maxLen = 128 };

EditorData (char const * name)
{
SetName (name);
}
    BOOL IsNameOK () { return (_name[0] != '\0'); }
void SetName (char const *name)
{
strcpy (_name, name);
}
char const *GetName () { return _name; }

private:
char _name [maxLen];
};