Статический орган управления (статический текстовый объект)
Это окно, создаваемое на базе предопределенного класса "static". Строго говоря, статический орган управления нельзя использовать для управления работой приложения, так как он не воспринимает щелчки мыши и не способен обрабатывать сообщения от клавиатуры. Статический орган управления не посылает родительскому окну сообщение WM_COMMAND.
Когда курсор мыши перемещается над статическим органом управления, Windows посылает функции окна этого органа сообщение WM_NCHITTEST. В ответ на это сообщение статический орган возвращает Windows значение HTTRANSPARENT. В результате Windows посылает сообщение WM_NCHITTEST родительскому окну, лежащему под органом управления.
Используется для оформления внешнего вида диалоговых панелей или окон приложения, для отображения пиктограмм.
А) Создание
HWND hStatic = CreateWindow ("static", NULL, WS_CHILD|WS_VISIBLE| SS_BLACKFRAME, 20, 40, 100, 50, hWnd, (HMENU)-1, hInstance, NULL);
2 – текст внутри статического органа; 8 – идентификатор родительского окна
9 – так как статический орган управления не посылает сообщения родительскому окну, можно указать любое число – идентификатор статического органа
Б) Стили:
SS_BLACKFRAME, SS_GRAYFRAME и SS_WHITEFRAME – прямоугольные рамки, внутри не закрашены
SS_BLACKRECT, SS_GRAYRECT и SS_WHITERECT – закрашенные прямоугольники.
SS_LEFT, SS_RIGHT, SS_CENTER, SS_LEFTNOWORDWRAP, SS_SIMPLE – для текста.
4 – обрезает не поместившийся текст и заменяет ТАВ на пробелы
5 – то же, но без замены.
Способы создания меню
Меню – важный элемент пользовательского интерфейса Windows. Существует несколько типов меню: 1) Меню приложения; 2) Временное меню; 3) Многоуровневое меню; 4) Плавающее меню.
Включение меню может быть произведено несколькими (тремя) методами:
1) С помощью текстового редактора (простой способ)
2) С помощью графического редактора
3) Непосредственно в оперативной памяти
Рассмотрим наиболее часто используемые способы создания меню.
1. Создание меню в файле ресурсов
а) Описание шаблона в файле ресурсов
nameID MENU [load] [mem] – необязательные параметрыBEGIN . . .ENDnameID – для идентификации шаблона меню (строка, число от 1 до 65535).
MENU – служебное слово
[load] – необязательный; определяет момент загрузки меню в память. (PRELOAD – загрузка сразу после запуска приложения LOADONCALL – загрузка только при отображении меню)
[mem] – необязательный; влияет на тип памяти, выделяемой для хранения шаблона (FIXED, MOVEABLE, DISCARDABLE – не перемещаемый, перемещаемый (по умолчю.), освобождаемый).
б) Описание операторов временных меню POPUP
POPUP text [, param]BEGIN . . .ENDв) Описание операторов строк MENUITEM
MENUITEM text, id [, param] // располагаются между BEGIN и END
text – имя строки, буква после & будет подчеркнута, \t – табуляция, \a – выравнивает по правой границе
id – определяет число, кот.идентиф-ет пункт меню. (приложение получит его с сообщением WM_COMMAND при выборе данного меню)
[param] – бывает CHECKED √, GRAYED, INACTIVE (не активная, но не серая) и другие (MENUBREAK, MENUBARBREAK, HELP – слева от текста вертикальная линия)
MENUITEM SEPARATOR // создание горизонтальной разделительной линии
г) Пример меню
#include "menu.hpp"APP_MENU MENU BEGIN POPUP "&File" BEGIN MENUITEM "&New", CM_FILENEW MENUITEM "&Open...", CM_FILEOPEN ENDENDКонстанты лучше описывать в отдельном файле "menu.hpp":
#define CM_FILENEW 24331
д) Подключение меню к окну приложения
1) При регистрации класса:
Для подключения меню необходимо записать адрес текстовой строки "APP_MENU" в поле lpszMenuName структуры wc, имеющей тип WNDCLASS:
wc.lpszMenuName = "APP_MENU";2) При создании окна:hwnd = CreateWindow(…, APP_MENU, …) - девятый параметр – идентификатор меню. У дочерних окон нет меню.2. С помощью функций в теле программыПриведем перечень основных функций для работы с меню:1.HMENU WINAPI CreateMenu(void);//Создает пустое меню, возвращает ID меню в случае успеха,NULL - иначе2.HMENU WINAPI CreatePopupMenu(void); // Для создания пустого временного меню3.HMENU WINAPI DestroyMenu(void); // Для удаления меню (перед завершением работы)4. Для подключения к окну с идентификатором hwnd меню с идентификатором hmenu вы можете воспользоваться функцией: BOOL WINAPI SetMenu(HWND hwnd, HMENU hmenu);
Перед вызовом этой функции вы должны загрузить меню и получить его идентификатор, например, при помощи функции LoadMenu.
5. Для добавления строк в пустые меню можно воспользоваться функцией:
BOOL WINAPI AppendMenu(HMENU hmenu, UINT fuFlags, UINT idNewItem, LPCSTR lpszNewItem);UINT fuFlags определяет атрибуты элемента меню (MF_CHECKED – √, MF_GRAYED – строка серая, неактивная, MF_ENABLED – нормальный вид, MF_POPUP – с данным элементом связывается временное меню, MF_STRING – элемент является строкой символов).
idNewItem– указывается идентификатор создаваемой строки меню, если это не MF_POPUP
lpszNewItem – разные значения в зависимости от флага (подпись строки, как правило)
AppendMenu(hmenu, MF_ENABLED|MF_POPUP{или MF_STRING},(UINT)hmenuFile {или IDM_FOUR}, "File");
6. Для перерисовки полосы меню для hwnd окна: void WINAPI DrawMenuBar(HWND hwnd);
_______________________________________________________________________________
7. Вставка команды между имеющимися строками:
BOOL WINAPI InsertMenu(HMENU hmenu, UINT idItem, UINT fuFlags, UINT idNewItem, LPCSTR lpszNewItem);
Есть 2 флага (MF_BYCOMMAND и MF_BYPOSITION), в зависимости от которых idItem определит идентификатор или порядковый номер элемента, перед которым будет вставка). Для добавления в конец, необходимо написать -1.
8. Для изменения строк – функция (после нее нужна перерисовка):
BOOL WINAPI ModifyMenu(HMENU hmenu, UINT idItem, UINT fuFlags, UINT idNewItem, LPCSTR lpszNewItem);9. Удаление элементов меню: BOOL WINAPI DeleteMenu(HMENU hmenu, UINT idItem, UINT fuFlags);
10.Удаление элементов меню без освобождения занятых им ресурсов: