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

на главную

Жанры

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

Легалов А. И.

Шрифт:

Объекты — "Контроллеры" создаются при обработке сообщения WM_CREATE или, в случае диалоговых окон, сообщением WM_INITDIALOG. При этом выполняются конструкторы элементов управления, внедренных в эти "Контроллеры".

Базовым классом для большинства элементов управления является SimpleControl. Он получает и сохраняет дескриптор окна специфического элемента управления. Чтобы получить этот дескриптор, необходимо иметь дескриптор родительского окна и идентификатор элемента управления.

class SimpleControl {

public:

 SimpleControl(HWND hwndParent, int id) : _hWnd(GetDlgItem(hwndParent, id)) {}

 void SetFocus {

::SetFocus (_hwnd);

 }

 HWND Hwnd const { return _hWnd; }

protected:

 HWND _hWnd;

};

Ниже

представлен пример элемента управления редактированием.

class Edit: public SimpleControl {

public:

 Edit(HWND hwndParent, int id) : SimpleControl (hwndParent, id) {}

 void SetString(char* buf) {

SendMessage(Hwnd, WM_SETTEXT, 0, (LPARAM)buf);

 }

 // code is the HIWORD (wParam)

 static BOOL IsChanged (int code) {

return code == EN_CHANGE;

 }

 int GetLen {

return SendMessage(Hwnd, WM_GETTEXTLENGTH, 0, 0);

 }

 void GetString(char* buf, int len) {

SendMessage(Hwnd, WM_GETTEXT, (WPARAM)len, (LPARAM)buf);

 }

 void Select {

SendMessage(Hwnd, EM_SETSEL, 0, –1);

 }

};

Здесь показано, как элемент управления редактированим может использоваться:

class Controller {

public:

 Controller(HWND hwnd);

 …

private:

 Edit _edit;

 char _string[maxLen];

};

Controller::Controller(HWND hwnd) : _edit(hwnd, IDC_EDIT) {

 _edit.SetFocus;

 …

}

void Controller::Command(HWND hwnd, WPARAM wParam, LPARAM lParam) {

 switch (LOWORD(wParam)) {

 case IDC_EDIT:

if (_edit.IsChanged(HIWORD (wParam))) {

_edit.GetString(_string, maxLen);

}

break;

 }

}

Далее:

Естественно, что наиболее вероятным местом использования элемента управления является диалоговое окно .

Использование «Контроллера» в диалоге

Программа с диалогом в качестве главного окна

Перевод А. И. Легалова

Англоязычный оригинал находится на сервере компании Reliable Software

Основное окно программы не должно быть универсальным окном, изменяющим свой размер. Много небольших приложений работают лучше в формате диалогового окна. Очевидное преимущество такого подхода заключается в том, что, для размещения элементов управления на поверхности диалога, можно использовать редактор ресурсов. Таким образом реализован пользовательский интерфейс (ПИ) частотного анализатора. Ниже этот полезный подход описан подробнее. Вы можете разгрузить исходный текст простого приложения, которое демонстрирует, описанные методы (любезность Laszlo Radanyi).

Прежде всего мы должны разработать диалоговое окно, используя редактор ресурсов. Мы назначаем идентификаторы всем элементам управления и непосредственно диалогу. В данном примере ресурс диалога имеет идентификатор DLG_MAIN. В процедуре WinMain мы не можем регистрировать окна любого класса, потому что Windows имеет предопределенный класс для диалоговых окон. Вместо того, чтобы создавать окно, мы вызываем функцию CreateDialog, передавая ей указатель на нашу собственную процедуру диалога (объясню позже).

Цикл сообщений данной программы является нестандартным, так как он вызывает функцию IsDialogMessage для каждого сообщения. Эта функция API не только проверяет, направлено ли данное сообщение к диалоговому окну, но и, что более важно, пересылает это сообщение процедуре диалога. Если сообщение не было адресовано диалогу, мы выполняем стандартную трансляцию и диспетчеризацию.

Для удобства, мы храним значение HINSTANCE в глобальной переменной. Этот вариант фактически является предшественником более общего объекта — Приложения. Однако, в данном случае, пример слишком тривиальный, чтобы заслуживать собственного класса.

HINSTANCE TheInstance = 0;

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, char* cmdParam, int cmdShow) {

 TheInstance = hInst;

 _set_new_handler(&NewHandler);

 HWND hDialog = 0;

 hDialog = CreateDialog(hinst, MAKEINTRESOURCE(DLG_MAIN), 0, DialogProc);

 if (!hDialog) {

char buf[100];

wsprintf(buf, "Error x%x", GetLastError);

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

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Наследница Драконов

Суббота Светлана
2. Наследница Драконов
Любовные романы:
современные любовные романы
любовно-фантастические романы
6.81
рейтинг книги
Наследница Драконов

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Темный Лекарь 2

Токсик Саша
2. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 2

Восход. Солнцев. Книга IX

Скабер Артемий
9. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга IX

Попаданка в деле, или Ваш любимый доктор

Марей Соня
1. Попаданка в деле, или Ваш любимый доктор
Фантастика:
фэнтези
5.50
рейтинг книги
Попаданка в деле, или Ваш любимый доктор

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Бремя империи

Афанасьев Александр
Бремя империи - 1.
Фантастика:
альтернативная история
9.34
рейтинг книги
Бремя империи

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит