На рис. 3 зображено створений шаблон меню згідно з завданням в індивідуальному завданні.
Рисунок 3 – Візуальний шаблон меню
Після візуального створення шаблону меню кожен його пункт отримує певні атрибути. Зовнішній вигляд вікна властивостей, що визначає атрибути, приведений на рис. 4.
Рисунок 4 – Атрибути меню в вікні властивостей
Підключення меню в програму базується на використанні методу Create() класу CFrameWnd, який створює головне вікно програми. В цьому методі можна вказати спеціальний макрос MAKEINTRESOURCE, аргументом якого буде ідентифікатор підключаємого ресурсу меню. В результаті отримаємо:
CMyFrameWin::CMyFrameWin()
Create(NULL,"Курсова 2KС-06", WS_OVERLAPPEDWINDOW, rectDefault, NULL, MAKEINTRESOURCE(IDR_MAINFRAME));
Ідентифікатори меню та всіх пунктів меню мають бути представлені в заголовочному файлі ресурсів Resource.h:
#define IDR_MAINFRAME 128
#define ID_ RENAME 40002
#define ID_RUN 40003
#define ID_RESULT 40021
Після запуску на виконання в верхній частині клієнтської області вікна можна буде побачити створене меню.
Тепер вже можна перейти до третього етапу створення меню. Обробку повідомлень від команд меню в головному програмному файлі проекту необхідно виконати в такій послідовності.
1) В класі вікна з рамкою CMyFrameWnd оголосити функції-обробники всіх пунктів меню;
2) Включити в карту повідомлень MESSAGE_MAP макроси, які зв’язують ідентифікатори кожного пункту меню з функцією-обробником;
3) Написати всі функції-обробники, які були вказані в класі вікна з рамкою CMyFrameWnd та карті повідомлень MESSAGE_MAP[1].
class CMyFrameWin:public CFrameWnd
public:
CMyFrameWin();
CMenu PopupMenu;
protected:
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
HICON m_hIcon;
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnOpen();
afx_msg void OnHelp();
DECLARE_MESSAGE_MAP();
BEGIN_MESSAGE_MAP(CMyFrameWin, CFrameWnd)
ON_WM_CREATE()
ON_COMMAND(ID_OPEN,OnOpen)
ON_COMMAND(ID_HELP1,OnHelp)
END_MESSAGE_MAP();
void CMyFrameWin::OnRun()
void CMyFrameWin::OnAbout()
3.2 Таблиця акселератора
Для прискорення доступу до елементів меню за допомогою клавіатури, а також для виклику потрібних функцій, не пов'язаних з меню, в Windows використовується таблиця акселераторів. Вона знаходиться в ресурсах додатку і визначає відповідність між акселератором і значенням параметра WM_COMMAND, що передається у функцію, при натисненні комбінації клавіш[10].
Щоб комбінація клавіш стала працювати як акселератор, вона повинна бути описана в таблиці акселераторів і додаток повинен завантажити таблицю акселераторів з ресурсів.
Створення таблиці відбувається добавленням нового ресурсу Accelerator в пункті меню Edit - Add Resource, як показано на рис. 2.
Для завантаження таблиці акселераторів використовується функція:
this->LoadAccelTable(MAKEINTRESOURCE(IDR_MAINFRAME));
Зовнішній вигляд вікна властивостей акселератора показано на рис. 5.
Рисунок 5 – Вікно властивостей акселератора для меню About
По замовчуванню, коли клавіша акселератора відповідає пункту меню, система виділяє цей пункт меню.
Зовнішній вигляд таблиці акселератора зображено на рис. 6.
Рисунок 6 – Таблиця акселератора для всієї програми
3.3 Контекстне меню програми
Контекстне меню створюється за допомогою класу CMenu:
CMenu menu;
Але CMenu по замовчуванню не створює меню. Для його створення необхідно скористатись функцією CreatePopupMenu().
menu.CreatePopupMenu();
Щоб додати елементи в контекстне меню, потрібно виконати наступне:
PopupMenu.CreatePopupMenu();
CPoint p;
GetCursorPos(&p);
PopupMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,p.x, p.y, this);
Метод LoadMenu зв’язує об’єкт з створеним раніше візуальним меню.
PopupMenu.LoadMenu(IDR_MENUPOPUP);
Стан елемента задається параметром nFlags, що може утримувати одно або декілька значень.
Контекстне меню створюється так само як головне меню добавленням нового ресурсу Menu пункті меню Edit - Add Resource, як показано на рис. 2.
Зовнішній вигляд контекстного меню показано на рис. 7.
Рисунок 7 – Контекстне меню програми
4. ПАНЕЛЬ ІНСТРУМЕНТІВ ТА РЯДОК СТАНУ
4.1 Створення панелі інструментів
Панель інструментів являє собою набір растрових кнопок одного розміру(за замовчуванням їх розміри 15х16) і розподілювачів. Натиснення на кнопку панелі інструментів подібно вибору одного пункту меню. Частіше за все панель інструментів використовується разом з меню, дублюючи основні його пункти. На відміну від меню, вона більш зручна в роботі завдяки додатковим властивостям: організації підказок, встановленню різноманітних стилів і розмірів кнопок тощо.
Щоб створити панель інструментів необхідно натиснути правою кнопкою миші на папці Toolbar в вікні Resource View, а потім вибрати із контекстного меню Insert Toolbar, в результаті чого буде створена нова панель інструментів(створюється пуста панель інструментів).При її створені необхідно задати відповідний ідентифікатор ID, наприклад: IDR_MAINFRAME.
Після цього панель інструментів слід заповнити кнопками. Для цього існує спеціальний редактор. При створенні кнопки їй необхідно присвоїти ідентифікатор. В кожній кнопці даної програми прописані підказки у полі Prompt в діалоговому вікні властивостей кнопок, як показано на рис. 8.
Рисунок 8 – Властивості панелі інструментів
Рисунок 9 – Створення панелі інструментів
По закінченні створення панелі інструментів переходимо до створення програмного коду, що буде обробляти виклики з панелі інструментів. Потрібно додати в клас рамки вікна клас панелі інструментів:
CToolBar m_wndToolBar;
В функції CMyFrameWin::OnCreate(LPCREATESTRUCT lpCreateStruct) напишемо код для створення панелі інструментів:
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD
|WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS
| CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
TRACE0("Failed to create toolbar\n");
return -1;
де, TBSTYLE_FLAT – стиль кнопки; WS_CHILD,WS_VISIBLE, CBRS_TOP,CBRS_GRIPPER,CBRS_TOOLTIPS,CBRS_FLYBY,CBRS_SIZE_DYNAMIC – стилі панелі інструментів.
4.2 Рядок стану
Рядок стану розташовується в нижній частині вікна. Його призначення – відображати опис команд і стан кнопок Num Lock, Caps Lock і Scroll Lock, та інформувати користувача про стан визначених атрибутів або параметрів програми.
Для створення рядка стану необхідно виконати такі кроки.
1. В класі вікна програми оголосити змінну класу CStatusBar для об’єкта рядка стану:
CStatusBar m_wndStatusBar;
2. Створити структуру з ідентифікаторами полів, що відображаються в рядку стану:
static UINT indicators[] =
{
ID_SEPARATOR,
ID_INDICATOR_NUM,
ID_INDICATOR_CAPS,
ID_INDICATOR_SCRL,
3. В функції OnCreate CMyFrameWin код для створення панелі інструментів:
!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
Зовнішній вигляд рядка стану зображено на рис. 9.
Рисунок 9 – Зовнішній вигляд рядка стану
5. СТВОРЕННЯ ДІАЛОГОВИХ ВІКОН
5.1 Етапи розробки діалогових вікон
Діалогове вікно має всі ознаки звичайного. Його можна переміщувати, закривати, а також передавати йому повідомлення. Перевага діалогового вікна в тому, що в ньому можна легко розмістити кнопки, текстові поля та інші елементи керування.
Створення діалогового вікна починається з створення класу діалогу. Даний клас є похідним від класу CDialog.В цьому класі мають бути оголошені необхідні змінні і властивості класу діалогу, які відповідають різним елементам керування діалогового вікна. Далі відбувається ініціалізація елементів керування діалогового вікна. Ініціалізація елементів керування відбувається за допомогою стандартного методу OnInitDialog(). Після цього створюється об’єкт власного класу діалогу методом DoModal() та його активувати. Необхідно створити обробку введених користувачем даних в діалоговому вікні. Обробка відбувається після натиснення кнопки Ok та закриття діалогового вікна. Після цього відбувається передача даних із елементів керування у змінні класу діалогу згідно з DDX-макросами методу DoDatаExchange(). Якщо введені дані не потрібно зберігати або обробляти, тоді діалогове вікно закривається натисненням кнопки Cancel. Введені за допомогою діалогового вікна дані далі можуть бути використані в інших функціях програми.
Використовуючи стандартний метод опису діалогу було написано два діалогових вікна: Input і About.
5.2 Створення діалогу
Створення діалогово вікна відбувається добавленням нового ресурсу Dialog пункті меню Edit - Add Resource, як показано на рис. 2.
Діалогове вікно оформляється за допомогою панелі інструментів Toolbox і властивостей даного елементу панелі інструментів, рис. 10.
Рисунок 10 – Панель інструментів Toolbox і вікно властивостей кнопки “OK”
Діалогове вікно запускається по натисненню кнопки Input. Функція виклику діалогового вікна прописана в функції-обробнику OnInput():
void CMyFrameWin::OnInput()
CMyDialog dialog;
dialog.DoModal();
Після цього створюється об’єкт власного класу діалогу методом DoModal() та його активація. Необхідно створити обробку введених користувачем даних в діалоговому вікні. Обробка відбувається після натиснення кнопки Ok та закриття діалогового вікна.
void CMyDialog::OnOK()
char str[80];
edit1.GetWindowText(str,80);
for(int i=0;i<=strlen(str);i++)
T=T+str[i];