Читать «Применение Windows API» онлайн - страница 16
А. И. Легалов
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) {