69272

Створення і маніпулювання панелями інструментів

Лекция

Информатика, кибернетика и программирование

Оскільки панелі інструментів займають дорогоцінний екранний простір вони повинні містити лише найбільш часто використовувані команди. У достатньо великих застосуваннях для вирішення різних завдань застосовується декілька різних панелей інструментів.

Украинкский

2014-10-02

58 KB

0 чел.

Лекція № 14

Тема: Створення і маніпулювання панелями інструментів

План

  1.  Створення і ініціалізація панелі інструментів
  2.  Закріплені і плаваючі панелі
  3.  Відображення і заховання панелі інструментів
  4.  Додавання спливаючих підказок і тексту рядка стану
  5.  Додавання елементів управління, відмінних від кнопок
  6.  Оновлення елементів управління, відмінних від кнопок

Створення і ініціалізація панелі інструментів

Панелі інструментів (toolbar) надають користувачам прямий доступ до команд додатку. Замість того, щоб ритися в меню або в пам'яті, намагаючись пригадати потрібну комбінацію клавіш, досить клацнути на відповідній кнопці панелі інструментів що входить до складу призначеного для користувача інтерфейсу. Оскільки панелі інструментів займають дорогоцінний екранний простір, вони повинні містити лише найбільш часто використовувані команди. У достатньо великих застосуваннях для вирішення різних завдань застосовується декілька різних панелей інструментів. Навіть якщо створюване застосування має тільки одну панель інструментів, все одно має сенс передбачити спосіб, що дозволяє користувачеві видалити її з екрану.

З програмної точки зору панель інструментів — це дочірнє вікно, що володіє поряд кнопок з малюнками на поверхні. Створивши панель інструментів і зробивши її видимою, про останнє можна не турбуватися, оскільки вона генерує ті ж самі повідомлення (WM_COMMAND), що і меню і акселератори (комбінації клавіш). Проте, ідентифікатори команд панелі інструментів повинні співпадати з ідентифікаторами команд меню і акселераторів.

У приведених нижче розділах розглянутий ряд питань, пов'язаних з розробкою панелей інструментів. Спочатку описано місце панелей інструментів в ієрархії MFC, а потім ряд інших, складніших питань, зв'язаних з використанням панелей інструментів, включаючи їх динамічне створення і зміну.

Створення панелі інструментів — це процес з п'яти етапів.

1. Спочатку необхідно завантажити растрове зображення, що містить всі малюнки кнопок. Зображення необхідно зберегти як растровий ресурс, тому відкрийте файл ресурсів створюваного проекту (.RC) і за допомогою графічного редактора створіть зображення для кнопок. За умовчанням прийнятий розмір зображення 16 пікселів шириною і 15 пікселів заввишки. Коли майстер AppWizard створює стандартний проект додатку MFC, що володіє панеллю інструментів, він використовує для неї растрові зображення, що розміщуються в каталозі \res даного проекту. Використання зображень, розміри яких відрізняються від прийнятих за умовчанням, цілком можливо, але про це необхідно повідомити об'єкт панелі інструментів за допомогою функції CToolBar : : SetSizes.

2. Визначите масив код команд (command code), які пов'яжуть зображення кнопок з ідентифікаторами команд. Як показано в приведеному нижче прикладі, це масив цілих беззнакових чисел (тип UINT):

// Кнопки панелі - ідентифікатори команд

static UINT BASED_CODE buttons[] =

{

// Порядок такий же, як і в растровому

// зображенні 'bitmap1.bmp'

ID_TOOLBAR_CREATE,

ID_SEPARATOR,

ID_TOOLBAR_SHOW

};

Два ідентифікатори ID_TOOLBAR_CREATE і ID_TOOLBAR_SHOW— це власне коди команд, а елемент ID_SEPARATOR— це ідентифікатор роздільника, що додає невеликий інтервал між двома кнопками.

3. Створіть і ініціалізуйте об'єкт панелі інструментів. Подібно до будь-яких інших вікон, спочатку створюється сам об'єкт панелі інструментів, а потім здійснюється його ініціалізація за допомогою виклику відповідної функції:

// Отримати екземпляр об'єкту C++ і створити вікно.

m_wndToolbar = new CToolBar ();

m__wndToolbar.Create (this, WS_CHILD | CBRS_TOP, 0x9100);

Функція ініціалізації Create класу CToolBar перевизначає однойменну функцію базового класу CWnd. Подібно до об'єктів вікон інших типів панель інструментів володіє полем стилю, що дозволяє встановити декілька атрибутів, що визначають зовнішній вигляд і поведінку панелі. До прапорів стилю, наприклад, відносяться WS_CHILDH CBRS_TOP. Прапор WS_CHILD встановлює для панелі інструментів стандартний стиль поведінки дочірнього вікна, для якого за допомогою покажчика this вказано батьківське вікно. Прапор CBRS_TOP встановлює стиль, специфічний для панелей управління, який визначає місце розміщення панелі (в даному випадку вверху фреймового вікна). Список найбільш корисних прапорів стилю приведений в таб.

4. Нанесіть зображення на поверхню кнопок панелі інструментів. Для цього приміняється функція CToolBar: :LoadBitmap:

m__wndToolbar.LoadBitmap (IDR_TOOLS) ;

 5. Крім того, з кнопками необхідно асоціювати ідентифікатори команд. Для цього досить викликати функцію CToolBar::SetButtons, передавши їй масив ідентифікаторів ресурсів кнопок, а також кількість кнопок, що підлягають установці:

m_wndToolbar.SetButtons(buttons, sizeof(buttons) /sizeof(UINT));

Отже, панель інструментів закінчена. Якщо всі вищеописані інструкції виконані правильно, то повинна вийти панель інструментів, що відображає декілька кнопок із зображеннями з файлу ресурсу додатку. Тепер можна зробити наступні дії. що дозволяють перенастроювати поведінку створюваної панелі інструментів.

Таблиця. Константи CToolBar::Create

прапор  Опис

WS_VISIBLE Робить вікно панелі інструментів видимим

CBRS_BOTTOM Поміщає панель управління внизу фреймового вікна

CBRS__FLYBY Вирішує відображення опису команди у вікні стану, коли курсор миші знаходиться над кнопкою панелі інструментів

CBRS__NOALIGN Запобігає переміщенню панелі управління при зміні розмірів її батьківського вікна

CBRS_TOOLTIPS Вирішує відображення спливаючої підказки, коли курсор миші знаходиться над кнопкою панелі інструментів

CBRS_TOP  Поміщає панель управління вверху фреймового вікна

Закріплені і плаваючі панелі

За умовчанням положення панелі інструментів класу CToolBar можна змінити тільки програмно. Але можна дозволити користувачам самостійно переміщати панель інструментів і розташовувати її в інших частинах фреймового вікна. Про те, що така можливість дозволена, необхідно повідомити як панель інструментів, так і фреймове вікно. Для цього необхідно викликати функції CToolBar::EnableDocking і CFrameWnd::EnableDocking таким чином:

m_wndToolbar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

Користувач може самостійно закріпити панель інструментів або залишити її плаваючим. Для програмного закріплення панелі інструментів можна скористатися функцією CFrameWnd: : DockControlBar, а щоб зробити її плаваючою — функцією CFrameWnd: FloatControlBar. Створена і закріплена біля однієї з рамок фреймового вікна панель інструментів цілком працездатна, і робити з нею більше вже нічого не потрібно, хіба що можна організувати її заховання і відновлення на вимогу. Саме ця тема і обговорюється в наступному розділі.

Відображення і заховання панелі інструментів

Головне, що необхідно мати на увазі при організації відображення і заховання панелі інструментів, це те, що вона теж є вікном. Практичним наслідком цього факту є наявність у класу CToolBar всіх стандартних функцій-членів класу CWnd, які і здійснюють всі операції по управлінню вікном.

Перш ніж приховувати або відображати панель інструментів, слід з'ясувати її поточний стан (отображена/скрыта). Інформацію про видимість панелі інструментів містить прапор WS_VISIBLE стилю її вікна. Для цього за допомогою функції CWnd::GetStyle необхідно набути спочатку значення стилю вікна панелі інструментів, а потім порівняти його по масці із значенням прапора WS_viSIBLE. Приведений нижче фрагмент коди встановлює стан логічної змінної bVisible на підставі видимості вікна панелі інструментів:

// З'ясувати поточний стан видимості.

BOOL bVisible = (m_wndToolbar.GetStyle() & WS_VISIBLE);

Звернення до функції CWnd: :SetStyle дозволяє змінити деякі із значень стилю вікна; на жаль, WS__yiSIBLE — не один з них. Тому доведеться скористатися функцією CWnd: ShowWindow, виклик якої з аргументом SW_HIDE приховує панель інструментів, а з аргументом SW_SHOWNORMAL робить її видимою знов. Приведений нижче фрагмент коди перемикає прапор видимості, звертаючись до значення змінної, встановленого в попередньому прикладі:

// Показати або приховати.

int nShow = (bVisible) ? SW_HIDE : SW_SHOWNORMAL;

m wndToolbar.ShowWindow(nShow) ;

Про всі програмні зміни панелі інструментів необхідно повідомляти фреймове вікно, повторно обчисливши при цьому позицію панелі. Для цього достатньо виклику функції CFrameWnd: :RecalcLayout без параметрів:

// Переконфігурувати елементи панелі інструментів.

RecalcLayout ();

Додавання спливаючих підказок і тексту рядка стану

У сучасних додатках панелі інструментів надають користувачеві допомогу як у вигляді спливаючої підказки (ToolTip), так і у вигляді тексту рядка стану (flyby text). Текст рядка стану — це повідомлення, яке відображається в рядку стану, зазвичай в першій її панелі (відокремленою від інших панелей роздільником, ідентифікатор ID_SEPARATOR якого обговорювався раніше в цьому розділі). Текст допомоги, що відображається в рядку стану, може бути трохи довше, ніж текст спливаючої підказки, оскільки для нього відведено більше місця.

При додаванні кнопки в панель або пункту в меню середовище розробки Visual C++ привласнює їм ідентифікатор ресурсу і зберігає інформацію про це в таблиці ресурсів додатку. Ідентифікатори ресурсу (Resource ID) унікальні усередині кожної категорії ресурсів, а отже, дві кнопки панелі не можуть мати однакового ідентифікатора ресурсу і двох рядка строкових ресурсів також не можуть мати однакового ідентифікатора. Але це не означає, що кнопка панелі і рядок не можуть мати однакового ідентифікатора. Насправді саме цей факт і використовується для організації автоматичного відображення спливаючих підказок і тексту рядка стану.

Отримавши під час виконання ідентифікатор ресурсу кнопки або пункту меню, середовище виконання MFC перевіряє, чи немає в таблиці ресурсів додатку рядків з тим же самим ідентифікатором. Як не дивно це звучить, але унікальні ідентифікатори ресурсів унікальні тільки усередині своїх категорій. Кожен елемент таблиці рядків містить як текст для рядка стану, так і текст для спливаючої підказки. Розібратися в рядку ресурсу просто: весь текст перед символом нового рядка відображається в рядку стану, а той, що розташований після нього (коротший), — в спливаючій підказці.

Додавання елементів управління, відмінних від кнопок

Безумовно, кнопки займають найбільшу частину площ більшості панелей інструментів. Але існують і інші типи елементів управління, які можна додати в панель інструментів. Наприклад, панель інструментів текстового процесора MS Word містять дуже зручні списки, що розкриваються, дозволяють користувачеві вибрати зображення і розмір шрифту.

Першим етапом додавання елементу управління, відмінного від кнопки, є створення місця для нього – на панелі інструментів. Для цього можна відкрити і відредагувати ресурс панелі інструментів, вставивши в нього роздільник як місце для елементу управління:

IDRJTOOLBAR 16,15 BEGIN

BUTTON ID__CUT

BUTTON ID_COPY BUTTON ID_PASTE

SEPARATOR

SEPARATOR // Місце для елементу управління

 

Другий етап має на увазі виділення простору на панелі інструментів для елементу управління. У цих цілях за допомогою функції CToolBar:: SetButtonlnf про необхідно збільшити ширину області, займаної роздільником:

SetButtonlnfo (4, IDC_FONTS, TBBS_SЕPARATOR, nWidth) ;

У приведеному вище фрагменті перший аргумент містить позицію елементу управління на панелі інструментів, IDC_FONTS— ідентифікатор ресурсу елементу управління, TBBS SEPARATOR — константа MFC, що представляє роздільник панелі інструментів, а аргумент nWidth містить ширину елементу управління. Після звернення до функції CToolBar : : SetButtonlnfo можна нарешті створювати елемент управління:

CRect rect;

GetltemRect (4, &rect);

rect.bottom = rect.top + nHeight;

m_ctlFonts.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_SORT | CBS_DROPDOWNLIST, rect, this, IDC_FONTS);

На практиці, весь вищеописаний код і звернення до функції SetButtonlnfo розміщують зазвичай у функції-обробнику події OnCreate панелі інструментів.

Оновлення елементів управління, відмінних від кнопок

Якщо панель інструментів містить лише кнопки, то для їх оновлення використовується стандартний механізм класу CCmdUI. Але якщо в панель інструментів додані елементи управління, відмінні від кнопок, то цей механізм непридатний. Зневірятися не варто, бібліотека MFC надає вирішення у вигляді іншого класу панелі інструментів, CControlBar, і його механізму оновлення — функції CControlBar : : OnUpdateCmdUI.

Все, що необхідне для його застосування, — це створити клас панелі інструментів як похідний від класу CControlBar, а не від класу CToolBar. Після внесення такої зміни стане доступна функція OnUpdateCmdUI. Якщо її перевизначити, можна оновлювати навіть такі елементи управління, які не мають обробників подій оновлення (наприклад, списки або списки, що розкриваються)


 

А также другие работы, которые могут Вас заинтересовать

36121. Управління поведінкою споживача 1.03 MB
  Підходи та етапи моделювання поведінки споживачів. Поведінка споживачів у промисловому маркетингу. Поведінка споживачів це дії які здійснює окрема особа купуючи і користуючись продукцією чи послугами це розумові і соціальні процеси що передують цим діям або настають за ними. Поведінка споживачів у промисловому маркетингу це процес прийняття рішення яким користується підприємство чи організація для визначення потреби у продуктах послугах ідентифікації оцінювання й вибору торгових марок і постачальників.
36122. Проектування трубопроводів 892.5 KB
  Особливості різних способів транспортування нафтинафтопродуктів і газу. Особливості трубопровідного транспорту. Особливості залізничного транспорту. Особливості морського транспорту. Особливості річкового транспорту. Особливості автомобільного транспорту. Економіка різних видів транспортування нафти інафтопродуктів. Вибір раціонального способу транспортування нафтовихвантажів. Методика розрахунку характеристик за способамитранспортування. Розрахунок економічних показників трубопровідноготранспорту...
36124. Основи статистики. Конспект лекцій 342.46 KB
  Статистичні спостереження. Статистичні спостереження. Суть та організаційні форми статистичного спостереження. План статистичного спостереження.
36125. Релігієзнавство. Основи філософських знань 181 KB
  Філософія релігії Мені довелося потіснити знання щоб звільнити місце вірі І. Центральний обєкт релігійної віри Бог саме з нього виводиться зміст усієї релігії. Розподіл філософії та релігії на самостійні форми суспільної свідомості відбувається лише в Новий час коли починають розвиватися природничі науки механіка. Філософія прагне заповнити емоційнодушевну пустоту відновити властиву релігії психологічну рівновагу.
36126. Основи національної економіки 2.85 MB
  Основні етапи розвитку національної економіки України. Особливості й ключові завдання сучасного етапу розвитку української національної економіки. Основні показники рівня розвитку національної економіки. ПОНЯТТЯ НАЦІОНАЛЬНОЇ ЕКОНОМІКИ ЯК РЕЗУЛЬТАТУ ЕКОНОМІЧНОЇ ДІЯЛЬНОСТІ Поняття національна економіка досить багатозначне оскільки це перш за все певний підсумок багатовікового розвитку народногосподарського комплексу країни.
36127. Соціальне страхування 462.5 KB
  Сутність принципи й роль соціального страхування План Сутність і необхідність соціального страхування в умовах ринкової економіки. Становлення і розвиток соціального страхування. Сутність і необхідність соціального страхування в умовах ринкової економіки. У багатьох країнах діє система взаємодоповнюючого соціального страхування що містить у собі такі елементи як: Державне соціальне забезпечення; Корпоративні соціальні програми; Індивідуальне часткове страхування.
36128. Системне програмне забезпечення 506.5 KB
  Переміщаючі завантажувачі можуть помістити програму в будьяке вільне місце в памяті. Очевидно що в більшості випадків початкові дані потрапляють в оперативну память із зовнішніх пристроїв. Класифікація ресурсів При розробці перших систем ресурсами вважалися процесорний час память канали вводу виводу і периферійні пристрої. Відповідно доки здійснювався обмін даними між оперативною памяттю і зовнішніми пристроями процесор не міг виконувати обчислення.
36129. КОНСПЕКТ ЛЕКЦІЙ НАВЧАЛЬНОЇ ДИСЦИПЛІНИ ЕКОЛОГІЧНА СТАНДАРТИЗАЦІЯ І СЕРТИФІКАЦІЯ для студентів 5 курс 130 KB
  Національні стандарти мають позначку абревіатуру ДСТУ державний стандарт України. Міжнародні стандарти що введені в дію в Україні мають позначки ДСТУ ISO і ДСТУ EN. Розроблені державні стандарти України отримали абревіатуру ДСТУ. Зявилися екологічні стандарти з позначками: ДСТУ ISO ДСТУ EN.