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

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

Жанры

Применение 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. Вновь полученные данные возвращаются обратно программе.

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

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

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

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

Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Ву Тим
Деловая литература:
о бизнесе популярно
5.00
рейтинг книги
Главный рубильник. Расцвет и гибель информационных империй от радио до интернета

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Каратила

Поповский Андрей Владимирович
Детективы:
боевики
6.50
рейтинг книги
Каратила

Я не князь. Книга XIII

Дрейк Сириус
13. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я не князь. Книга XIII

Курс 1. Сентябрь

Фокс Гарри
1. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Курс 1. Сентябрь

На границе империй. Том 10. Часть 7

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 7

#Бояръ-Аниме. Газлайтер. Том 37

Володин Григорий Григорьевич
37. История Телепата
Фантастика:
фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 37

Геном хищника. Книга третья

Гарцевич Евгений Александрович
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга третья

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Старшеклассник без клана. Апелляция кибер аутсайдера 3

Афанасьев Семён
3. Старшеклассник без клана. Апелляция аутсайдера
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Старшеклассник без клана. Апелляция кибер аутсайдера 3

Абсурдистан

Штейнгарт Гари
Проза:
современная проза
5.00
рейтинг книги
Абсурдистан

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1