Страница 2 из 7 Клиентский код
Давайте, начнем с клиентского кода. В нашей обобщенной программе мы нуждаемся в диалоговом окне, которое позволяет пользователю редактировать строку. Используя редактор ресурса, мы создаем шаблон диалога, который содержит средства редактирования и две кнопки, 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]; }; | |