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

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

Жанры

Применение 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);

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

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

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

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

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

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

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

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали

Надуй щеки! Том 4

Вишневский Сергей Викторович
4. Чеболь за партой
Фантастика:
попаданцы
уся
дорама
5.00
рейтинг книги
Надуй щеки! Том 4

Мечников. Из доктора в маги

Алмазов Игорь
1. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Мечников. Из доктора в маги

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Наследник, скрывающий свой Род

Тарс Элиан
2. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник, скрывающий свой Род

Вперед в прошлое 4

Ратманов Денис
4. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое 4

Звездная Кровь. Изгой V

Елисеев Алексей Станиславович
5. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
технофэнтези
рпг
фантастика: прочее
5.00
рейтинг книги
Звездная Кровь. Изгой V

ЖЛ 9

Шелег Дмитрий Витальевич
9. Живой лёд
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
ЖЛ 9

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

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