- •Вопрос 77. Требования к программному и аппаратному обеспечению Windows приложений. Требования к программному обеспечению. Требования к аппаратуре.
- •Вопрос 78. Доступ к оболочке Windows. Система координат. Основные режимы отображения. Координаты устройства.
- •Вопрос 79. Доступ к оболочке Windows. Поля вывода. Изменение пределов поля вывода и окна. Координаты, определяемые пользователем. Выбор начальных атрибутов окна.
- •Вопрос 80. Вывод окна. Изменение вида окна. Часто используемые элементы управления и диалоговые окна. Статические элементы управления. Элементы управления - кнопки.
- •Модальная диалоговая панель
- •Немодальная диалоговая панель
- •Элементы управления
Немодальная диалоговая панель
Процедура создания и использования немодальной диалоговой панели несколько отличается от процедуры создания модальной диалоговой панели.
Как и в случае с модальной диалоговой панелью, в первую очередь необходимо создать шаблон диалоговой панели и добавить его в файл ресурсов приложения. Затем нужно создать класс CDlg, управляющий диалоговой панелью, - класс диалоговой панели. Этот класс наследуется непосредственно от базового класса CDialog. Затем можно модифицировать шаблон и класс панели для нужд приложения.
В классе немодального диалога следует переопределить метод Create базового класса CDialog следующим образом:
void CDlg::Create(CWnd* pParent)
{ CDialog::Create(IDD,pParent); } // Вызов метода базового класса Parent=pParent; - окно-родитель
Предварительно в класс диалога необходимо добавить элемент Parent - указатель на родительский объект, например, CWnd *Parent - указатель на родительское окно. Если родительский объект не окно, то можно добавить в метод Create параметр, отвечающий за передачу указателя на родительский объект, и присвоить его переменной Parent, объявив его в определении класса как указатель на объект соответствующего типа. Указатель на родительский объект позволяет при необходимости вызывать для родительского объекта методы его класса непосредственно из методов класса диалога, что обеспечивает связь немодального диалога и его родительского объекта.
Метод Create возвращает управление сразу после отображения на экране диалоговой панели. Он возвращает ненулевое значение, если создание диалоговой панели завершилось успешно, и нуль в противном случае.
При помощи ClassWizard в классе CDlg также следует создать заготовки методов-обработчиков сообщений от кнопок IDOK(OnOK) и IDCANCEL (OnCancel),для сообщения WM_DESTROY (OnDestoy).
В момент создания объекта класса CDlg диалоговая панель как окно еще не создана и не появляется на экране. Для этого надо вызвать метод Create класса CDlg. Если диалоговая панель имеет стиль WS_VISIBLE, то она сразу появляется на экране. В противном случае для этого надо вызвать метод ShowWindow. Итак, в методе, который вызывает немодальный диалог (например, в методе-обработчике какого-либо сообщения для окна приложения), следует проверить, не отображается ли уже эта диалоговая панель, а затем создать ее методом Create класса CDlg:
if(Dlg.GetSafeHwnd()==NULL)
Dlg.Create(this);
Чтобы закрыть немодальную диалоговую панель, можно воспользоваться методом DestroyWindow:
if(Dlg.GetSafeHwnd()!=NULL)
Dlg.DestroyWindow();
Элементы управления
Элементы управления — это компоненты, объединяющие графический интерфейс с предварительно разработанной функциональностью. Элементы управления представляют собой многократно используемые блоки кода, предназначенные для выполнения определенных задач. Все элементы управления являются производными базового класса Control.
Элемент управления можно добавлять в форму или контейнерный элемент управления во время разработки посредством перетаскивания из Toolbox. Многие свойства элемента управления настраиваются графически в конструкторе с помощью мыши, а другие можно изменять в окне Properties(Свойства).
Основные элементы управления:
Флаг. Применяется для множественного выбора. Может иметь 2 состояния (true и false)
Переключатель. Во многом повторяет возможности флага, но часто используется в группе. Группа позволяет сделать единственный выбор из списка.
Кнопка
Поле группы. Значения элементов группы по умолчанию устанавливаются по порядку создания (0,1,2,3). Эти значения могут быть изменены пользователем
Полосы прокрутки
Список. Делает возможным выбор из множества значений
Окно редактирования. Неотъемлемая часть диалогового окна. Делает возможным ввод, редактирование или отображение данных
Пиктограмма. Размещение рисунка в диалоговом окне.
Статические органы управления
Статический орган управления - это окно, создаваемое на базе предопределенного класса "static". Строго говоря, статический орган управления нельзя использовать для управления работой приложения, так как он не воспринимает щелчки мыши и не способен обрабатывать сообщения от клавиатуры. Статический орган управления не посылает родительскому окну сообщение WM_COMMAND. Обычно этот орган управления используется для оформления внешнего вида диалоговых панелей или окон приложения. Задавая различные стили, вы можете создать статический орган управления в виде закрашенного или незакрашенного прямоугольника, а также строки текста. Статические органы управления могут использоваться внутри диалоговых панелей для отображения пиктограмм.
Для создания статического органа управления нужно использовать функцию CreateWindow. В качестве первого параметра этой функции следует указать класс окна "static":
HWND hStatic;
hStatic = CreateWindow("static", NULL,WS_CHILD | WS_VISIBLE | SS_BLACKFRAME,20, 40, 100, 50,hWnd, (HMENU)-1, hInstance, NULL);
Второй параметр определяет текст, который будет расположен внутри органа управления. Вы можете указать этот параметр как NULL, если текст не используется.
В третьем параметре следует указать один из стилей статического органа управления. В нашем примере указан стиль SS_BLACKFRAME.
Так как статический орган управления не посылает сообщения родительскому окну, в качестве девятого параметра (идентификатор органа управления) можно указать любое число, например, 1.
Стили статического органа управление определяют внешний вид и применение органа. Стили SS_BLACKFRAME, SS_GRAYFRAME и SS_WHITEFRAME предназначены для создания прямоугольных рамок. При помощи этих стилей создаются, соответственно, черные, серые и белые рамки. Внутренняя область рамки остается незакрашенной.
Цвета рамки соответствуют системным цветам, определенным в Windows. Эти цвета можно изменить при помощи стандартного приложения Windows с названием Control Panel. При создании статических органов управления со стилями SS_BLACKFRAME, SS_GRAYFRAME и SS_WHITEFRAME текст заголовка окна не используется. Соответствующий параметр функции CreateWindow следует указать как NULL.
Для создания закрашенных прямоугольников используются стили SS_BLACKRECT, SS_GRAYRECT и SS_WHITERECT. Эти стили позволяют создать статические органы управления в виде закрашенных прямоугольников, соответственно, черного, серого и белого цветов (используются системные цвета, как это описано выше). Для этих стилей текст заголовка окна не используется. Соответствующий параметр функции CreateWindow следует указать как NULL.
Статические органы управления удобно использовать для вывода текста. Вы можете использовать пять базовых стилей SS_LEFT, SS_RIGHT, SS_CENTER, SS_LEFTNOWORDWRAP, SS_SIMPLE и один модификатор SS_NOPREFIX.
При использовании стиля SS_LEFT приложение задает размер органа управления, внутри которого будет выведен текст. Орган управления выводит текст (используя для этого функцию DrawText), выравнивая его влево и выполняя свертку слов. Текст, который не поместился в окне, обрезается. Выполняется замена символов табуляции на пробелы.
Стили SS_RIGHT и SS_CENTER используются аналогично, но текст выравнивается, соответственно, по правой границе органа управления или центрируется.
При использовании стиля SS_LEFTNOWORDWRAP текст выводится без использования свертки слов и выравнивается по левой границе. Часть текста, которая не поместилась в окне, обрезается. Выполняется замена символов табуляции на пробелы.
Стиль SS_SIMPLE похож на стиль SS_LEFTNOWORDWRAP, но вывод текста выполняется быстрее (используется функция TextOut) и замена символов табуляции на пробелы не выполняется. Часть текста, которая не поместилась в окне, обрезается.
Модификатор SS_NOPREFIX используется также в тех случаях, когда необходимо отменить специальную обработку символа "&". Обычно этот символ не выводится статическими органами управления на экран, а следующий за ним символ изображается подчеркнутым (для изображения символа "&" его надо повторить два раза подряд)
Стиль SS_ICON используется для изображения пиктограмм в диалоговых панелях.
Элемент управления «Кнопка»
Кнопка — это прямоугольное окно обычно небольшого размера и имеющее название, в котором указано ее назначение. Кнопки являются широко используемыми элементами управления Windows-приложений, что обусловлено их разнообразием. Существует пять основных типов кнопок, определенных в классе CButton библиотеки MFC:
обыкновенные (нажимаемые) кнопки
специализированные кнопки ОК и Cancel (Отмена), используемые в диалоговых окнах
радиокнопки (Отличительным признаком радиокнопок является то, что активной является только одна кнопка из группы, такие кнопки часто создаются в тестах, где правильным ответом является только один из вариантов)
отмечаемые кнопки (если в тесте несколько вариантов ответа)
В библиотеке MFC также есть класс CBitMapButton для кнопок с растровыми изображениями, производный от класса CButton и наследующий все его возможности. Кнопка с растровым изображением — это стандартная кнопка, которая вместо поясняющего текста содержит растровый рисунок (пиктограмму).
Кнопки могут применяться несколькими способами.
Для ввода команды пользователя используется нажимаемая кнопка.
Если существует взаимоисключающий набор опций, то применяется сгруппированный набор радиокнопок.
Если несколько опций не являются взаимоисключающими (пользователь одновременно может выбрать несколько возможностей), то используется набор отмечаемых кнопок (флажков).
Чтобы создать видимую рамку вокруг взаимосвязанной группы элементов управления (например, группы радиокнопок или отмечаемых кнопок), используется блок группировки.
Два класса кнопок— CButton и CBitMapButton— имеют простой набор методов, что упрощает работу с ними.
Для управления кнопкой можно использовать сообщение BM_SETSTATE, которое позволяет установить кнопку в нажатое или отжатое состояние.
Для установки кнопки в нажатое состояние следует передать ей сообщение BM_SETSTATE с параметром wParam, равным TRUE, и lParam, равным 0:
SendMessage(hButton, BM_SETSTATE, TRUE, 0L);
Для возврата кнопки в исходное состояние передаётся ей то же самое сообщение, но с параметром wParam, равным FALSE:
SendMessage(hButton, BM_SETSTATE, FALSE, 0L);
Сообщения от кнопок (объектов CButton и CBitMapButton) представлены в таблице
Сообщение |
Отправленное к родительскому элементу, когда… |
ON_BN_CLICKED или ON_COMMAND |
Пользователь нажимает кнопку. |
ON_BN_DOUBLECLICKED |
Пользователь дважды щелкает кнопку. |
Для создания кнопки приложение должно создать дочернее окно на базе предопределенного класса "button". После этого родительское окно будет получать от кнопки сообщение с кодом WM_COMMAND. Этим сообщением кнопка информирует родительское окно о том, что с ней что-то сделали, например, нажали.
Для создания кнопки надо вызвать функцию CreateWindow.
HWND CreateWindow(LPCSTR lpszClassName,LPCSTR lpszWindowName, DWORD dwStyle,int x, int y, int nWidth, int nHeight,HWND hwndParent, HMENU hmenu, HINSTANCE hinst,void FAR* lpvParam);
Параметр функции lpszClassName - указатель на строку, содержащую имя класса, на базе которого создается окно. Для создания кнопки необходимо указать имя класса "button".
Параметр функции lpszWindowName - указатель на строку, содержащую заголовок окна (Title Bar). Эта строка будет написана на кнопке.
Параметр dwStyle - стиль создаваемого окна. Этот параметр задается как логическая комбинация отдельных битов. Для кнопки следует задать стиль как комбинацию констант WS_CHILD, WS_VISIBLE и константы, определяющей один из возможных стилей кнопки.
Парамеры x и y функции CreateWindow определяют горизонтальную (x) и вертикальную (y) координату кнопки относительно верхнего левого угла родительского окна.
Параметры nWidth и nHeight определяют, соответственно, ширину и высоту создаваемой кнопки.
Параметр hwndParent определяет идентификатор родительского окна, на поверхности которого создается кнопка.
Параметр hmenu - идентификатор меню или идентификатор порожденного (child) окна. Для каждого создаваемого вами дочернего окна вы должны определить собственный идентификатор. Родительское окно будет получать от дочерних окон сообщения. При помощи идентификатора дочернего окна функция родительского окна сможет определить дочернее окно, пославшее сообщение родительскому окну.
Параметр hinst - идентификатор приложения, которое создает окно. Необходимо использовать значение, передаваемое функции WinMain через параметр hInstance.
Последний параметр функции (lpvParam) представляет собой дальний указатель на область данных, определяемых приложением. Этот параметр передается в функцию окна вместе с сообщением WM_CREATE при создании окна. Для кнопки вы должны указать значение NULL.
Для создания кнопки с надписью "Help" в точке с координатами (10, 30) и размерами (40, 20) можно использовать, например, такой вызов функции CreateWindow:
hHelpButton = CreateWindow("button", "Help",WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,10, 30,40, 20,hWnd,(HMENU)IDB_Help, hInstance, NULL);
Некоторые стили кнопок:
BS_DEFPUSHBUTTON - Стандартная кнопка с толстой рамкой вокруг
BS_PUSHBUTTON - Стандартная кнопка без рамки
BS_LEFTTEXT - Этот стиль указывается вместе с другими и означает, что текст, расположенный около кнопки, должен находиться слева, а не справа от кнопки
BS_OWNERDRAW - Внешний вид кнопки определяется родительским окном, которое само рисует кнопку во включенном, выключенном или неактивном состоянии
BS_GROUPBOX - Прямоугольная область, внутри которой могут находиться другие кнопки. Обычно используется в диалоговых панелях. Этот орган управления не воспринимает сообщения от мыши или клавиатуры
