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

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

Жанры

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

Легалов А. И.

Шрифт:

MessageBox(0, buf, "CreateDialog", MB_ICONEXCLAMATION | MB_OK);

return 1;

 }

 MSG msg;

 int status;

 while ((status = GetMessage(&msg, 0, 0, 0)) != 0) {

if (status == –1) return –1;

if (!IsDialogMessage(hDialog, &msg)) {

TranslateMessage(&msg);

DispatchMessage(&msg );

}

 }

 return msg.wParam;

}

Процедура

диалога — точно такая же как и процедура Windows, за исключением того, что она возвращает TRUE, когда она обрабатывает сообщение и FALSE, когда его не обрабатывает. Нет никакой потребности вызывать процедуру, заданную по умолчанию, потому что Windows делает это за нас всякий раз, когда процедура диалога возвращает FALSE (делает за Вас это дело, так почему же не сделано точно также при использовании оконной процедуры…). Первое сообщение, которое диалог получает — WM_INITDIALOG, а последнее — WM_CLOSE. В ходе обработки этих сообщений мы создаем и уничтожаем «Контроллер» (Controller). Других случаях, отличных от этих, диалог ожидает сообщения от его элементов управления управления, передаваемого как WM_COMMAND. Одно из элементов управления, требует специальной обработки. Это (горизонтальная) линейка прокрутки (scrollbar). Она посылает сообщение WM_HSCROLL. Средства управления линейкой прокрутки (scrollbar) имеются в частотном анализаторе, и там показано, как иметь с ними дело.

BOOL CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {

 static Controller* control = 0;

 switch (message) {

 case WM_INITDIALOG:

try {

control = new Controller(hwnd);

}

catch (WinException e) {

MessageBox(0, e.GetMessage, "Exception", MB_ICONEXCLAMATION | MB_OK);

PostQuitMessage(1);

} catch (…) {

MessageBox(0, "Unknown", "Exception", MB_ICONEXCLAMATION | MB_OK);

PostQuitMessage(2);

}

return TRUE;

 case WM_COMMAND:

control->Command(hwnd, LOWORD (wParam), HIWORD (wParam));

return TRUE;

 case WM_HSCROLL:

control->Scroll(hwnd, LOWORD(wParam), HIWORD(wParam));

return 0;

 case WM_DESTROY:

PostQuitMessage(0);

return TRUE;

 case WM_CLOSE:

delete control;

DestroyWindow(hwnd);

return TRUE;

 }

 return FALSE;

}

Давайте, взглянем на «Контроллер». Обратите внимание, что каждый элемент управления на поверхности диалогового окна имеет соответствующий (внедренный) объект управления внутри «Контроллера». Имеются редакторы, селективные списки, радиокнопки и линейки прокрутки. Встречается специальный элемент управления «metafile», который рисует шкалу частот и два объекта отображения, соответствующие двум статическим подокнам, в которые мы рисуем графики. И, наконец, мы имеем объект Painter, который является ответственным за асинхронную перерисовку каждого из двух подокон.

class Controller {

public:

 Controller(HWND hwnd);

 ~Controller;

 void Command(HWND hwnd, int id, int code);

 void Scroll(HWND hwnd, int cmd, int pos);

 void Paint(HWND hwnd);

 void ReInit(HWND hwnd);

 void Stop(HWND hwnd);

private:

 void InitScrollPositions;

 void PaintScale;

 BOOL _isStopped;

 int _bitsPerSample;

 int _samplesPerSecond;

 int _fftPoints;

 int _samplesPerBuf;

 EditReadOnly _edit;

 Combo _comboFreq;

 Combo _comboPoints;

 RadioButton _radio8;

 RadioButton _radio16;

 ScrollBarMap _scroll;

 StaticEnhMetafileControl _scaleFreq;

 ViewWave _viewWave;

 ViewFreq _viewFreq;

 Painter _display;

};

Конструктор

«Контроллера» заботится об инициализации всех элементов управления, передавая им дескриптор диалогового окна и соответствующие идентификаторы. Как косметическую добавку, мы присоединяем нашу собственную иконку к диалогу. В противном случае система использовала бы стандартную иконку Windows.

Controller::Controller(HWND hwnd) :_isStopped(TRUE), _bitsPerSample(16), _samplesPerSecond(SAMPLES_SEC), _fftPoints(FFT_POINTS * 4), _samplesPerBuf(FFT_POINTS * 2), _radio8(hwnd, IDC_8_BITS), _radio16(hwnd, IDC_16_BITS), _scroll(hwnd, IDC_SCROLLBAR), _edit(hwnd, IDC_EDIT), _comboFreq(hwnd, IDC_SAMPLING), _comboPoints(hwnd, IDC_POINTS), _viewWave(hwnd, IDS_WAVE_PANE, FFT_POINTS * 8), _viewFreq(hwnd, IDS_FREQ_PANE), _scaleFreq(hwnd, IDC_FREQ_SCALE), _display(hwnd, _viewWave, _viewFreq, _samplesPerBuf, _samplesPerSecond, _fftPoints) {

 // Attach icon to main dialog

 HICON hIcon = LoadIcon(TheInstance, MAKEINTRESOURCE(ICO_FFT));

 SendMessage(hwnd, WM_SETICON, WPARAM(ICON_SMALL), LPARAM(hIcon));

 // Other initializations…

}

Использование диалогового окна в качестве главного — очень удобная и простая техника, особенно для приложений, которые используют панелеподобный интерфейс. Между прочим, приложение "Морской бой" (см. домашнюю страницу) использует тот же самый прием.

Далее: использование диалоговых окон в Windows приложениях .

Использование фабрики классов для окон диалога

Окно диалога

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

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

Отсюда можно загрузить программу, демонстрирующую окно диалога (zip архив 14 кб)

Диалоговое окно для Windows программы является тем же, чем является вызов функции для программы на языке C. Сначала, Windows программы передают некоторые данные диалоговому окну, чтобы инициализировать его. Затем диалоговое окно обменивается информацией с пользователем. Когда пользователь решает, что любопытство программы было удовлетворено, он (или она) нажимает кнопку OK. Вновь полученные данные возвращаются обратно программе.

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

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Жених из гроба

Сотис Майя
1. Гробокопательница
Фантастика:
юмористическое фэнтези
сказочная фантастика
фэнтези
5.00
рейтинг книги
Жених из гроба

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Заклятие предков

Прозоров Александр Дмитриевич
3. Ведун
Фантастика:
фэнтези
альтернативная история
8.49
рейтинг книги
Заклятие предков

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Экспансия: Сотрудничество. Том 5

Белов Артем
5. Планетарный десант
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Экспансия: Сотрудничество. Том 5

Отверженный III: Вызов

Опсокополос Алексис
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Отверженный III: Вызов

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Возвышение Меркурия. Книга 8

Кронос Александр
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 8

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

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

Локки 7. Потомок бога

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

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

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