- •Затверджую
- •Індивідуальне завдання
- •Анотація
- •Аналіз індивідуального завдання
- •Загальна структура проекту
- •Розробка меню програми
- •Панель інструментів та рядок стану
- •Створення діалогових вікон
- •Створення та підключення бібліотеки dll
- •Реалізація математичної функції мовою assembler
- •Керівництво системного програміста
- •Керівництво оператора
- •Висновки
- •Література
- •Додатки
Розробка меню програми
Головне меню програми
Головне меню програми розташовується у верхній частині вікна. Призначення елементів меню – виконувати певні команди шляхом відправлення відповідних повідомлень в чергу додатку. Елементи меню можуть мати різні типи і містити ряд модифікаторів. Зовнішній вигляд вікна властивостей, що визначає атрибути, приведений на рисунку 3.1.
Рисунок 3.1 – Атрибути меню у вікні властивостей
Процес створення меню в MFC-програмах, як і в API-програмах, складається із трьох етапів:
створення шаблона меню;
підключення ресурсу меню до головної програми;
обробка повідомлень від команд меню [3].
Підключення меню в програму базується на використанні методу Create() класу CFrameWnd, який створює головне вікно програми. В цьому методі можна вказати спеціальний макрос MAKEINTRESOURCE, аргументом якого буде ідентифікатор ресурсу меню. В результаті отримаємо:
Create(NULL," Курсова робота, ст. гр. 3К-14 Семенюк М.В.",
WS_OVERLAPPEDWINDOW,rectDefault,NULL,
MAKEINTRESOURCE(IDR_MAINFRAME));
Ідентифікатори меню та всіх пунктів меню мають бути представлені в заголовочному файлі ресурсів Resource.h:
#define IDM_PICTURE 40004
…
#define IDM_QUIT 40017
Після запуску на виконання в верхній частині клієнтської області вікна можна буде побачити створене меню.
Тепер можна перейти до третього етапу створення меню – обробки повідомлень від команд меню. В головному програмному файлі проекту необхідно виконати такі дії.
1. В класі вікна з рамкою CMyFrameWnd оголосити функції-обробники всіх пунктів меню.
2. Включити в карту повідомлень MESSAGE_MAP макроси, які зв’язують ідентифікатори кожного пункту меню з функцією-обробником.
3. Написати всі функції-обробники, які були вказані у класі вікна з рамкою CMyFrameWnd та карті повідомлень MESSAGE_MAP.
class CMyFrameWin:public CFrameWnd
{
public:
CMyFrameWin();
protected:
afx_msg void OnPicture();
...
afx_msg void OnQuit();
DECLARE_MESSAGE_MAP();
};
BEGIN_MESSAGE_MAP(CMyFrameWin, CFrameWnd)
ON_COMMAND(IDM_PICTURE, OnPicture)
...
ON_COMMAND(IDM_QUIT, OnQuit)
END_MESSAGE_MAP();
void CMyFrameWin:: OnPicture()
{
}
...
void CMyFrameWin:: OnQuit()
{
}
Таблиця акселератора
Для прискорення доступу до елементів меню за допомогою клавіатури, а також для виклику потрібних функцій, не пов'язаних з меню, в Windows використовується таблиця акселераторів. Вона знаходиться в ресурсах додатку і визначає відповідність між акселератором і значенням параметра WM_COMMAND, що передається у функцію, при натисненні комбінації клавіш
Щоб комбінація клавіш стала працювати як акселератор, вона повинна бути описана в таблиці акселераторів і додаток повинен завантажити таблицю акселераторів з ресурсів.
Створення таблиці відбувається добавленням нового ресурсу Accelerator в пункті меню Edit - Add Resource.
Для завантаження таблиці акселераторів використовується функція:
this->LoadAccelTable(MAKEINTRESOURCE(IDR_MAINFRAME));
Зовнішній вигляд вікна властивостей та список акселераторів показано на рисунку 3.
Рисунок 3 – Вікно властивостей акселератора
По замовчуванню, коли клавіша акселератора відповідає пункту меню, система виділяє цей пункт меню.
Контекстне меню програми
Контекстне меню створюється за допомогою класу CMenu:
CMenu menu;
Створивши екземпляр класу CMenu, для створення контекстного меню необхідно скористатись функцією CreatePopupMenu().
menu.CreatePopupMenu();
Контекстне меню буде виводитись при натисненні правої клавіші миші на робочому полі програми. Для цього необхідно описати функцію обробника повідомлень ON_WM_RBUTTONDOWN():
void CMyFrameWin::OnRButtonDown(UINT nFlags, CPoint point)
{
CPoint t;
GetCursorPos(&t);
PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,t.x, t.y, this);
}
Також, в конструкторі класу CMyFrameWin необхідно завантажити контекстне меню в пам'ять. Це робиться за допомогою метода LoadMenu, він зв’язує об’єкт зі створеним раніше візуальним меню.
PopupMenu.LoadMenu(IDR_POPUPMENU);
Контекстне меню створюється так само як головне меню – шляхом додання нового ресурсу Menu. Зовнішній вигляд контекстного меню показано на рисунку 4.
Рисунок 4 – Контекстне меню програми
