Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 8.pptx
Скачиваний:
41
Добавлен:
18.02.2023
Размер:
110.46 Кб
Скачать

Лекция 8

SDI и MDI приложения. Таймеры. Ресурсы. Диалоговые окна

SDI и MDI приложения

Существуют два основных стиля интерфейсов пользователей: интерфейс с одним документом (single-document interface, SDI) и интерфейс со многими документами (multiple-document interface, MDI). Примером интерфейса SDI является текстовый редактор WordPad, включённый в Microsoft Windows.

Такое приложение как Microsoft Word 2010, является приложением с интерфейсом MDI. Оно позволяет открывать одновременно несколько документов в одном окне.

Стиль SDI является наиболее распространенным. Есть третий стиль - интерфейс в стиле проводника. Это интерфейс состоит из одного окна, содержащего две панели. На левой панели представлено дерево или иерархический вид, правая панель является областью отображения, как например в Microsoft Windows Explorer (Проводник).

MDI приложение

Интерфейс MDI позволяет создавать приложения, которые поддерживают много форм в одной форме- контейнере. Такие приложения как Paint.NET и Notepad++, имеют многодокументный интерфейс.

Приложение MDI позволяет пользователю отображать несколько документов одновременно, причём каждый документ отображается в собственном окне. Документы, или подчинительные окна (child windows), помещаются в родительское окно (parent windows), которое представляет рабочую область (workspace) для всех подчинённых окон в приложении. Например, Google Chrome позволяет создавать и отображать разные типы окон, Каждое индивидуальное окно ограничено областью родительского окна. При сворачивании которого все окна документов также сворачиваются.

SDI приложение

Интерфейс SDI в отличии от интерфейса MDI не позволяет создавать приложения, которые поддерживают много форм в одной форме- контейнере. Такой интерфейс характерен таких программ где пользователю не надо открывать одновременно два документа.

Например, в программе «Календарь» пользователю вряд ли понадобится два одинаковых календаря в одном окне. Программы у которых SDI интерфейс: Калькулятор, Skype, различные игровые приложения.

Таймеры

Операционная система Windows позволяет для каждого приложения создать несколько виртуальных таймеров. Все эти таймеры работают по прерываниям одного физического таймера.

Приложение может заказать для любого своего окна несколько таймеров, которые будут периодически посылать в функцию окна сообщение с кодом WM_TIMER.

Несмотря на возможность указания интервалов времени в миллисекундах, реальная дискретность таймера определяется периодом прерываний, посылаемых таймером. Этот период (то есть длительность одного такта таймера) можно узнать с помощью функции GetTimerResolution:

DWORD WINAPI GetTimerResolution(void);

Создание и удаление таймера

Для создания виртуального таймера приложение должно использовать функцию SetTimer:

UINT WINAPI SetTimer(HWND hwnd, UINT idTimer, UINT uTimeout, TIMERPROC tmprc);

hwnd - идентификатор окна, функция которого будет получать сообщения от таймера, или NULL. В последнем случае с создаваемым таймером не связывается никакое окно и сообщения от таймера будут приходить в специально созданную для этого функцию.

idTimer - идентификатор таймера (он не должен быть равен нулю).

uTimeout - период следования сообщений от таймера в миллисекундах.

Tmprc - адрес функции, которая будет получать сообщения WM_TIMER.

Возвращаемое функцией SetTimer значение является идентификатором созданного таймера (если в качестве первого параметра функции было указано значение NULL). В любом случае функция SetTimer возвращает нулевое значение, если она не смогла создать таймер.

Если приложение больше не нуждается в услугах таймера, оно должно уничтожить таймер, вызвав функцию

KillTimer:

BOOL WINAPI KillTimer (HWND hwnd, UINT idTimer);

hwnd - идентификатор окна, указанный при создании таймера функцией SetTimer;

idTimer - идентификатор уничтожаемого таймера.

Функция KillTimer возвращает значение TRUE при успешном уничтожении таймера или FALSE, если она не смогла найти таймер с указанным идентификатором.

Пример

 

Программа должна выводить звуковой сигнал

каждую секунду.

 

 

 

 

Функция MessageBeep

предназначена

для

воспроизведения

«стандартных­

звуков

Windows»,

оповещающих пользователя о тех или иных событиях, проис­­

ходящих в системе. В заголовочном

файле windows.h эта

функция определена следующим образом:

 

bool MessageBeep(int uType);

 

 

 

Флаг:

Описание:

 

Код:

 

MB_ICONASTERISK

диалоговое окно с

(0x000.000.40L);

примечанием

 

 

 

 

 

MB_ICONEXCLAMATION

«восклицание»

(0x000.000.30L);

MB_ICONHAND

окно с ошибкой

(0x000.000.10L);

MB_ICONQUESTION

окно с запросом

(0x000.000.20L);

MB_OK

по умолчанию

(0x000.000.00L);

Более подробно о таймерах:

http://www.frolov-lib.ru/books/bsp.old/v11/ch7.htm

#define BEEP_TIMER 1

LRESULT CALLBACK _export WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch (msg)

{

case WM_CREATE: {

// Создаем таймер, посылающий сообщения функции окна раз в секунду SetTimer(hwnd, BEEP_TIMER, 1000, NULL);

return 0;

}

case WM_TIMER: {

// В ответ на сообщение таймера выдаем звуковой сигнал MessageBeep(-1);

return 0;

}

case WM_DESTROY: {

// Перед уничтожением окна уничтожаем созданный ранее таймер KillTimer(hwnd, BEEP_TIMER);

PostQuitMessage(0); return 0;

}

}

return DefWindowProc(hwnd, msg, wParam, lParam);

}

Ресурсы

При создании приложений с использованием Win32API очень удобно использовать ресурсные файлы – ASCII файлы с расширением .rc, в которых в специальном формате описываются различные элементы приложения.

Файл описания ресурсов транслируется компилятором ресурсов (rc.exe – Visual Studio, porc.exe – PellesC) в бинарный файл с расширением .res.

Затем компоновщик подключает этот файл вместе с объектными файлами (.obj) и файлами статических библиотек (.lib) в исполняемый файл программы.