Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Создание панели инструментов





УП. 5. Панель инструментов и строка состояния

План:

УП. 5. Панель инструментов и строка состояния. 1

5.1. Панель инструментов. 1

5.1.1. Создание панели инструментов. 1

5.1.2. Управление состоянием кнопок панели. 10

5.1.3. Вывод подсказок в панели инструментов. 19

5.2. Строка состояния. 28

5.2.1. Создание строки состояния. 28

5.2.2. Сообщения о меню в строке состояния. 31

Контрольные вопросы.. 38

Упражнения. 39

 

Панель инструментов и строка состояния являются окнами дополнительных классов Win32 API.

Функции для работы с окнами таких классов объявлены в заголовочном файле commctrl.h. Поэтому в текст приложения необходимо включить файл commctrl.h. Эти функции описаны в файле comctl32.dll.

До сих пор вы использовали объекты статических библиотек системы: kernel32.lib, user32.lib, gdi32.lib, winspool.lib, comdlg32.lib, advapi32.lib, shell32.lib, ole32.lib, oleaut32.lib, uuid.lib, odbc32.lib и odbccp32.lib. Эти библиотеки автоматически подключаются к приложению Win32 API. В этом можно убедиться, заглянув в установки проекта интегрированной среды (Project\Settings\Link-> "Object/library modules:"). Для использования дополнительных классов окон сюда же нужно приписать текст "comctl32.lib".

Теперь можно пользоваться дополнительными классами.

Панель инструментов

Создание и использование панели инструментов очень похоже на работу с акселераторами. Кнопки панели, как и акселераторы, связаны с командами. Подобно дескриптору таблицы акселераторов создается и дескриптор таблицы кнопок. Отличие заключается в структуре кнопок, функции создания и форме отображения панели.

Создание панели инструментов

Для создания панели инструментов вызывают функцию

 

HWND CreateToolbarEx(HWND hwnd,

DWORD ws,

UINT wID,

int nBitmaps,

HINSTANCE hBMInst,

UINT wBMID,

LPCTBBUTTON lpButtons,

int iNumButtons,

int dxButton,

int dyButton,

int dxBitmap,

int dyBitmap,

UINT uStructSize

);

 

Она создает окно панели инструментов и добавляет в него заданные кнопки.

Параметры функции:

1. hwnd – дескриптор родительского окна панели.

2. ws – стиль панели. Должен содержать константу WS_CHILD, часто дополняют константой' TBSTYLE_TOOLTIPS.

3. wID – идентификатор панели инструментов.

4. nBitmaps – количество изображений кнопок в контейнере, хранящемся в файле hBMInst под номером wBMID. Изображения кнопок (обычно формата ICO, размером 32x32, 16 цветов) хранятся в файлах ЕХЕ и DLL, упакованные по несколько штук в контейнерах. В одном файле может быть несколько контейнеров. Функция находит контейнеры по порядковому номеру, извлекает из них нужные изображения и выводит на кнопках.

5. hBMInst – дескриптор экземпляра приложения, содержащего контейнер с кнопками.

6. wBMID – идентификатор запрашиваемого формата кнопки.

7. lpButtons – указатель на массив структур типа TBBUTTON, который содержит информацию о кнопках создаваемой панели инструментов.

8. iNumButtons – количество кнопок панели инструментов.

9. dxButton – ширина кнопок в пикселях.

10. dyButton – высота кнопок в пикселях.

11. dxBitmap – ширина изображения кнопки в пикселях.

12. dyBitmap – высота изображения кнопки в пикселях.

13. uStructSize – размер структуры TBBUTTON.

Если параметры dxButton, dyButton, dxBitmap и dyBitmap задать равными 0, то размеры кнопок берутся по умолчанию.

В случае успешного создания панели функция возвращает дескриптор окна созданной панели инструментов, иначе – NULL.

Структура TBBUTTON содержит информацию о кнопке панели инструментов:

 

typedef struct {

int iBitmap;

int idCommand;

BYTE fsState;

BYTE fsStyle;

DWORD dwData;

int iString;

} TBBUTTON;

 

Назначение полей этой структуры:

1. iBitmap – номер изображения кнопки в контейнере.

2. idCommand – идентификатор связанный с кнопкой команды. Если fsStyle = TBSTYLE_SEP, то idCommand должен быть равен 0.

3. fsState – флажки состояния кнопки. В общем случае кнопки панели могут иметь комбинацию следующих состояний:

Константа Состояние кнопки
TBSTATE_CHECKED Кнопка стиля TBSTYLE_CHECK нажата
TBSTATE_ENABLED Кнопка доступна
TBSTATE_HIDDEN Кнопка невидима и недоступна
TBSTATE_INDETERMINATE Кнопка недоступна
TBSTATE_PRESSED Кнопка нажата
TBSTATE_WRAP Используют в комбинации с константой TBSTATE_ENABLED. Тогда следующая кнопка панели будет изображена в начале очередной строки

 

Приложение может посылать панели инструментов сообщения TB_GETSTATE и TB_SETSTATE.

Сообщение TB_GETSTATE возвращает значение состояния кнопки панели (например, кнопка доступна, нажата или отмечена). При этом wParam приравнивают идентификатору команды кнопки, а lParam = 0. В случае аварии возвращаемое значение равно -1.

Сообщение TB_SETSTATE устанавливает состояние кнопки панели. При этом wParam равен идентификатору команды кнопки, а lParam =(LPARAM)MAKELONG(fsState, 0) задает устанавливаемое состояние fsState. В случае аварии возвращаемое значение равно 0.

4. fsStyle – стиль кнопки. Может быть комбинацией следующих констант:

Константа Стиль кнопки
TBSTYLE_TOOLTIPS Кнопка посылает уведомительное сообщение WM_NOTIFY при остановке курсора мыши над ней на полсекунды
TBSTYLE_WRAPABLE Кнопки разместить в несколько линий
TBSTYLE_BUTTON Стандартная кнопка
ТВSTYLE_CHECK Кнопка, которая может находиться в нажатом и ненажатом состояниях. В зависимости от состояния кнопка отображается различным цветовым фоном
TBSTYLE_CHECKGROUP Группа кнопок стиля TBSTYLE_CHECK, только одна из которых может находиться в нажатом состоянии
TBSTYLE_GROUP Группа стандартных кнопок
TBSTYLE_SEP Кнопка в виде малого промежутка

 

Кнопка стиля TBSTYLE_BUTTON ведет себя подобно стандартной кнопке. Кнопка стиля TBSTYLE_CHECK также подобна стандартной кнопке, но после каждого нажатия переключается между нажатым и ненажатым состояниями. Можно создавать группу обычных кнопок (стиль TBSTYLE_GROUP) и группу переключаемых кнопок (стиль TBSTYLE_CHECKGROUP). В последней группе только одна кнопка может находиться в нажатом состоянии.

5. dwData – задаваемое приложением значение.

6. iString – номер строки кнопки.

Параметры dwData и iString чаще всего задают нулевыми.

Задача. Главное меню окна содержит разделы "Файлы" и "Правка". При выборе строки "Файлы" отображается временное меию со строками "Открыть", "Сохранить" и "Выход". При выборе строки "Правка" отображается временное меню со строками "Найти" и "Заменить". Команды строк "Открыть", "Сохранить", "Найти" и "Заменить" продублировать кнопками панели инструментов.

Листинг 5.1. Пример меню и панели инструментов.

#include <windows.h>

#include <CommCtrl.h>

 

#pragma comment (lib, "comctl32.lib")

 

#define ID_TOOLBAR 100

#define CM_FILE_OPEN 1001

#define CM_FILE_SAVE 1002

#define CM_FILE_QUIT 1003

#define CM_EDIT_FIND 2001

#define CM_EDIT_REPLC 2002

 

BOOL RegClass(WNDPROC, LPCTSTR, UINT);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

 

HINSTANCE hInstance;

TCHAR szClass[] = TEXT("MenuTool");

 

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)

{

MSG msg;

HWND hwnd;

hInstance = hInst;

if (!RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE;

hwnd = CreateWindow(szClass, TEXT("Панель инструментов"), WS_OVERLAPPEDWINDOW | WS_VISIBLE,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL);

if (!hwnd) return FALSE;

while(GetMessage(&msg, 0, 0, 0))

{ TranslateMessage(&msg); DispatchMessage(&msg); }

return msg.wParam;

}

 

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)

{

WNDCLASS wc;

wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;

wc.lpfnWndProc = Proc;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)(brBackground +1);

wc.lpszMenuName = NULL;

wc.lpszClassName = szName;

return (RegisterClass(&wc)!= 0);

}

 

BOOL CreateMenuItem(HMENU hMenu, TCHAR *str, UINT uIns, UINT uCom, HMENU hSubMenu, BOOL flag, UINT fType)

{

MENUITEMINFO mii;

mii.cbSize = sizeof(MENUITEMINFO);

mii.fMask = MIIM_STATE | MIIM_TYPE | MIIM_SUBMENU | MIIM_ID;

mii.fType = fType;

mii.fState = MFS_ENABLED;

mii.dwTypeData = str;

mii.cch = sizeof(str);

mii.wID = uCom;

mii.hSubMenu = hSubMenu;

return InsertMenuItem(hMenu, uIns, flag, &mii);

}

 

HWND CreateToolBar(HWND hwnd, DWORD dwStyle, UINT uCom)

{

static TBBUTTON but[6];

but[0].fsStyle = TBSTYLE_SEP;

but[1].iBitmap = STD_FILEOPEN;

but[1].idCommand = CM_FILE_OPEN;

but[1].fsState = TBSTATE_ENABLED;

but[1].fsStyle = TBSTYLE_GROUP;

but[2].iBitmap = STD_FILESAVE;

but[2].idCommand = CM_FILE_SAVE;

but[2].fsState = TBSTATE_ENABLED;

but[2].fsStyle = TBSTYLE_GROUP;

but[3].fsStyle = TBSTYLE_SEP;

but[4].iBitmap = STD_FIND;

but[4].idCommand = CM_EDIT_FIND;

but[4].fsState = TBSTATE_ENABLED;

but[4].fsStyle = TBSTYLE_CHECKGROUP;

but[5].iBitmap = STD_REPLACE;

but[5].idCommand = CM_EDIT_REPLC;

but[5].fsState = TBSTATE_ENABLED;

but[5].fsStyle = TBSTYLE_CHECKGROUP;

return CreateToolbarEx(hwnd, dwStyle, uCom, 0, HINST_COMMCTRL,

IDB_STD_LARGE_COLOR, but, 6, 0, 0, 0, 0, sizeof(TBBUTTON));

}

 

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

{

static HMENU hMainMenu, hFileMenu, hEditMenu;

static HWND hToolbar;

switch (msg)

{

case WM_SIZE:

{ MoveWindow(hToolbar, 0, 0, 0, 0, TRUE); return 0; }

case WM_CREATE:

{

hMainMenu=CreateMenu();

//Создаем временное меню для раздела "Файлы"

hFileMenu=CreatePopupMenu();

int i=0; //Инициализация позиции в меню hFileMenu

CreateMenuItem(hFileMenu, TEXT("&Открыть"), i++, CM_FILE_OPEN, NULL, FALSE, MFT_STRING);

CreateMenuItem(hFileMenu, TEXT("&Coxpaнить"), i++, CM_FILE_SAVE, NULL, FALSE, MFT_STRING);

CreateMenuItem(hFileMenu, TEXT("&Bыход"), i++, CM_FILE_QUIT, NULL, FALSE, MFT_STRING);

//Создаем временное меню для раздела "Правка"

hEditMenu = CreatePopupMenu();

i=0; //Инициализация позиции в меню hEditMenu

CreateMenuItem(hEditMenu, TEXT("&Найти"), i++, CM_EDIT_FIND, NULL, FALSE, MFT_STRING);

CreateMenuItem(hEditMenu, TEXT("&Зaмeнить"), i++, CM_EDIT_REPLC, NULL, FALSE, MFT_STRING);

//Подключаем временные меню к главному меню i=0;

//Инициализация позиции в меню hMainMenu

CreateMenuItem(hMainMenu, TEXT("&Файл"), i++, 0, hFileMenu, FALSE, MFT_STRING);

CreateMenuItem(hMainMenu, TEXT("&Правка"), i++, 0, hEditMenu, FALSE, MFT_STRING);

SetMenu(hwnd, hMainMenu);

DrawMenuBar(hwnd);

//Создаем панель инструментов

DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_DLGFRAME;

hToolbar = CreateToolBar(hwnd, dwStyle, ID_TOOLBAR);

return 0;

}

case WM_COMMAND:

{

switch (LOWORD(wParam))

{

case CM_FILE_OPEN:

{ MessageBox(hwnd, TEXT("Команда CM_FILE_OPEN"), TEXT("Меню"), MB_OK); return 0; }

case CM_FILE_SAVE:

{ MessageBox(hwnd, TEXT("Команда CM_FILE_SAVE"), TEXT("Меню"), MB_OK); return 0; }

case CM_FILE_QUIT:

{ DestroyWindow(hwnd); return 0; }

case CM_EDIT_FIND:

{ MessageBox(hwnd, TEXT("Команда CM_EDIT_FIND"), TEXT("Меню"), MB_OK); return 0; }

case CM_EDIT_REPLC:

{ MessageBox(hwnd, TEXT("Команда CM_EDIT_REPLC"), TEXT("Меню"), MB_OK); return 0; }

}

return 0;

}

case WM_DESTROY: { PostQuitMessage(0); return 0;}

}

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

}

 

Нетрудно увидеть, что это приложение является развитием приложения листинга 4.1. Рассмотрим, что оно делает.

При запуске приложение создает меню и панель инструментов из шести кнопок. Первая и четвертая кнопки представляют собой "малый промежуток" на левом краю и между кнопками " Сохранить " и " Найти " панели инструментов. Остальные 4 кнопки соответствуют легко узнаваемым стандартным кнопкам Windows: " Открыть ", " Сохранить ", " Найти " и " Заменить ". При нажатии на любую из этих кнопок функция окна приложения получает такое же сообщение, как если бы была выбрана соответствующая строка меню. Например, при нажатии на кнопку " Открыть " функция окна получит сообщение WM_COMMAND с идентификатором CM_FILE_OPEN в младшем слове параметра wParam.

Рассмотрим изменения в тексте приложения:

1. Включены еще один заголовочный файл, библиотека "comctl32.1ib" и создан идентификатор окна панели инструментов:

 

#include <commctrl.h>

#pragma comment (lib, "comctl32.lib")

#define ID_TOOLBAR 100

 

Это связано с тем, что панель инструментов, по сути, есть орган управления и, как все органы управления, имеет свой идентификатор.

2. Описана функция CreateToolBar, которая в родительском окне hwnd создает панель инструментов с идентификатором uCom (в нашем случае это ID_TOOLBAR) стиля dwStyle и возвращает дескриптор окна созданной панели.

Рассмотрим операторы функции CreateToolBar:

2.1. Сначала описан массив из пяти элементов типа TBBUTTON:

 

static TBBUTTON but[5];

 

2.2. Первая и четвертая кнопки является "малым промежутком", о чем сообщает значение поля fsStyle:

 

but[0].fsStyle = TBSTYLE_SEP;

but[3].fsStyle = TBSTYLE_SEP;

 

Остальные поля кнопки этого стиля могут быть нулевыми.

2.3. Вторая кнопка связана с командой CM_FILE_OPEN. Для его отображения используется изображение с номером STD_FILEOPEN:

 

but[1].iBitmap = STD_FILEOPEN;

 

Здесь используются номера стандартных изображений иконок из файла commctrl.h:

 

#define STD_CUT 0

#define STD_COPY 1

#define STD_PASTE 2

#define STD_UNDO 3

#define STD_REDOW 4

#define STD_DELETE 5

#define STD_FILENEW 6

#define STD_FILEOPEN 7

#define STD_FILESAVE 8

#define STD_PRINTPRE 9

#define STD_PROPERTIES 10

#define STD_HELP 11

#define STD_FIND 12

#define STD_REPLACE 13

#define STD_PRINT 14

 

Для кнопок можно использовать и другие изображения. В частности, можно самим построить изображения иконок. Но эти задачи здесь не рассматриваются.

В поле idCommand второго элемента массива записывают значение команды, с которой нужно связать кнопку:

 

but[1].idCommand = CM_FILE_OPEN;

 

Далее записывают значение состояния и стиль кнопки:

 

but[1].fsState = TBSTATE_ENABLED;

but[1].fsStyle = TBSTYLE_GROUP;

 

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

 

but[4].fsStyle=TBSTYLE_CHECKGROUP;

but[5].fsStyte=TBSTYLE_CHECKGROUP;

 

Это означает, что только одна из них может находиться в нажатом состоянии. Эти кнопки будут вести себя подобно зависимым переключателям стиля BS_AUTORADIOBUTTON.

2.4. После задания массива кнопок создается панель инструментов:

 

CreateToolbarEx(hwnd, dwStyle, uCom, 0, HINST_COMMCTRL,

IDB_STD_LARGE_COLOR, but, 16, 0,0,0,0, sizeof(TBBUTTON));

 

Четвертым аргументом здесь указан 0. Это допускается только для системных контейнеров изображений.

В качестве дескриптора экземпляра приложения, содержащего контейнер, используется константа HINST_COMMCTRL. Она определена в файле commctrl.h:

 

#define HINSTCOMMCTRL ((HINSTANCE)-1)

 

Идентификатор IDB_STD_LARGE_COLOR формата кнопки для панели инструментов также описан в файле commctrl.h:

 

#define IDB_STD_SMALL_COLOR 0

#define IDB_STD_LARGE_COLOR 1

 

Во многих случаях, например в диалоговых панелях, могут пригодиться другие форматы:

#define IDB_VIEW_SMALL_COLOR 4

#define IDB_VIEW_LARGE_COLOR 5

#define IDB_HIST_SMALL_COLOR 8

#define IDB_HIST_LARGE_COLOR 9

 

2.5. Функция CreateToolBar возвращает дескриптор окна созданной панели инструментов.

3. В функции родительского окна описывают дескриптор окна панели инструментов:

 

static HWND hToolbar;

 

4. При изменении размеров родительского окна "перемещают" панель инструментов:

 

case WM_SIZE:

{ MoveWindow(hToolbar, 0, 0, 0, 0, TRUE); return 0; }

 

Обратите внимание, что все координаты и размеры "перемещения" могут быть равны нулю. Это объясняется тем, что при перемещении функция окна панели автоматически устанавливает ширину панели по ширине рабочей области родительского окна и высоту панели по высоте кнопок.

5. После создания и перерисовки полосы меню родительского окна создают панель инструментов.

5.1. Указывают стиль панели инструментов:

 

dwStyle = WS_CHILD | WS_VISIBLE | WS_DLGFRAME;

 

5.2. Вызывают функцию CreateToolBar:

 

hToolbar = CreateToolBar(hwnd, dwStyle, ID_TOOLBAR);

 

Другие изменения, обусловленные созданием панели инструментов, в тексте приложения не обязательны.

Date: 2015-05-23; view: 1524; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию