Чтение онлайн

на главную - закладки

Жанры

Применение Windows API

Легалов А. И.

Шрифт:

Когда пользователь нажимает кнопку 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;

}

Теперь, когда Вы знаете клиентский код, давайте рассмотрим полную реализацию образца "Диалоговое окно". Фабрика контроллера — очень простой шаблон класса. Все, что она делает, это прием списка обобщенных параметров и сохранение его через void-указатели. Только определенный клиентом контроллер знает, чем фактически является класс, размещенный в списке параметров, и только он выполняет приведение (см. конструктор EditorCtrl).

Код, общий для всех фабрик контроллеров изолирован в классе CtrlFactory от которого наследует фактический шаблон. Шаблон переопределяет метод MakeController, чтобы создать новый контроллер для класса ActualCtrl, определенного клиентом. Обратите внимание, что метод возвращает ActualCtrl как указатель на его базовый класс DlgController, и это — все то, что видит остальная часть реализации.

class CtrlFactory {

public:

 CtrlFactory(void *argList) : _argList(argList) {}

 void *GetArgList { return _argList; }

 virtual DlgController* MakeController(HWND hwndDlg) = 0;

 private: void *_argList;

};

template <class ActualCtrl, class ActualArgList>

class ControllerFactory : public CtrlFactory {

public:

 ControllerFactory(void *argList) : CtrlFactory(argList) {}

 DlgController * MakeController(HWND hwndDlg) {

return new ActualCtrl(hwndDlg, (ActualArgList*)GetArgList);

 }

};

Ниже приводится определение абстрактного класса DlgController, который используется как основа для всех классов контроллеров, определенных клиентом. Мы уже видели, как работает эти наследования на примере клиентского класса EditorCtrl.

class DlgController {

public:

 virtual ~DlgController {} // In case derived class overrides

 virtual void OnInitDialog(HWND hwnd) = 0;

 virtual bool OnCommand(HWND hwnd, int ctrlID, int notifyCode) = 0;

 virtual bool OnNotify(HWND hwnd, int idCtrl, NMHDR *hdr) = 0;

 void *GetArgList { return _argList; }

protected:

 DlgController(void *argList) : _argList (argList) {}

private:

 void *_argList;

};

Центральным фрагментом для многократного использования программного обеспечения является класс ModalDialog. Он делает всю работу в своем конструкторе, вызывая функцию API DialogBoxParam. Параметр, который мы передаем диалоговому окну (фактически, его процедуре диалога) — указатель на фабрику контроллера. Процедура диалога определена как статический метод (не нужен указатель: процедура диалога вызывается из Windows, поэтому отсутствует доступ по указателю).

class ModalDialog {

public:

 ModalDialog(HINSTANCE hInst, HWND hwnd, int dlgResource, CtrlFactory *ctrlFactory) {

_result = DialogBoxParam(hInst, MAKEINTRESOURCE(dlgResource), hwnd, (DLGPROC)ModalDialogProc, (LPARAM)ctrlFactory);

 }

 static BOOL CALLBACK ModalDialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

 bool IsOk const { return (_result == –1) ? false : _result != 0; }

Поделиться:
Популярные книги

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Эмиссар

Листратов Валерий
8. Ушедший Род
Фантастика:
боевая фантастика
аниме
попаданцы
7.50
рейтинг книги
Эмиссар

На цепи

Уваров
1. На цепи
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
На цепи

Мечник Вернувшийся 1000 лет спустя. Том 2

Ткачев Андрей Юрьевич
2. Вернувшийся мечник
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Мечник Вернувшийся 1000 лет спустя. Том 2

Эволюционер из трущоб. Том 8

Панарин Антон
8. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 8

Тициан Табидзе: жизнь и поэзия

Табидзе Тициан Юстинович
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Тициан Табидзе: жизнь и поэзия

Воспоминания о Корнее Чуковском

Коллектив авторов
Документальная литература:
биографии и мемуары
6.25
рейтинг книги
Воспоминания о Корнее Чуковском

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Черный Маг Императора 12

Герда Александр
12. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 12

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Играть... в тебя

Кодекс Охотника. Книга XXXIII

Винокуров Юрий
33. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIII

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

И в аду есть герои

Панов Вадим Юрьевич
5. Тайный Город
Фантастика:
боевая фантастика
9.19
рейтинг книги
И в аду есть герои

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III