Теоретичні відомості:
До програми можна додати меню.
Меню бувають двох типів - головне меню і контекстне меню. Перше розміщується у вікні під рядком заголовку, друге при правому клацанні мишею на будь-якому об’єкті.
Головне Меню
Меню можна додати двома способами: вписати до файлу ресурсів вручну або через редактор ресурсів. Перший спосіб вважається за кращий, оскільки можна контролювати ситуацію.
Створіть новий проект з іменем MyMenu. Файл MyMenu.cpp має бути текстом 2-ї лабораторної роботи. Створіть порожній файл ресурсів MyMenu.rc та додайте його до проекту.
//Текст файлу MyMenu.rc
#include "windows.h"
#define IDM_EXIT 1
MainMenu MENU //імя меню MainMenu
{
POPUP "Файл" // меню "Файл"
{
MENUITEM "Вихід", IDM_EXIT //Пункт меню. Йому відповідає ідентификатор IDM_EXIT
}
}
Ім’я цього меню слід оголосити в тексті програми, як це робили для іконок, курсорів і картинок:
char szMenu[]="MainMenu"; //розмістити на початку програми
...
w.lpszMenuName=szMenu; //в структурі WNDCLASS посилання на меню
Після компіляції та запуску програми, вікно отримає маленьке меню з одного пункту: "Файл", в якому є вкладка "Вихід", яка поки не працює.
Меню - це своєрідне, дочірнє вікно, якому потрібний свій цикл обробки повідомлень, щоб задавати реакцію на вибір відповідного пункту. Все це має бути прописано в цьому циклі.
Кожний пункт головного меню (на мові ресурсів POPUP) має пункти MENUITEM, які мають текст меню. Кожному пункту відповідає ідентифікатор, що звичайно починається з префікса IDM_ (Identifer menu), наприклад, IDM_EXIT. В бібліотечному файлі зберігаються ідентифікатори пунктів меню.
Якщо треба створити підменю, застосовується така конструкція:
POPUP "&User Name"
{
MENUITEM "User &number", IDM_NUM
POPUP "User &status"
{
MENUITEM "A&dministrator", IDM_ADMIN
MENUITEM "&Guest", IDM_GUEST
}
}
Таким чином, вкладка "User status" буде мати підменю з двох пунктів: Administrator і Guest.
Знак & (амперсанд) ставиться перед тією літерою, натиснувши яку, можна швидко вибрати цей пункт. В меню слово "Файл" (&Файл) , буде записано, як Файл, і натиснувши Alt+Ф, можна перейти на цей пункт. Це є ознакою гарного стилю програмування.
Для швидкого створення меню існує редактор ресурсів Visual C++. За допомогою Ctrl+R, дати йому імя. У вкладці MENU з’явиться нове меню. Після подвійного клацання на екрані зявиться його схема, в яку можна впиувати нові пункти, додавати разділювачі і вкладки.
Усі властивості меню і його пунктів задаються через вікно Properties.
Меню обробляється повідомленням WM_COMMAND. Воно викликається тоді, коли користувач натискає на один з рядків меню.
switch(messg)
{
case WM_COMMAND:
switch(LOWORD(wParam)) {
//Вибір пункту з ідентифікатором IDM_ADMIN
case IDM_ADMIN: {
....
break;
}
//Вибір наступного пункту
case IDM_GUEST: {
....
break;
}
}
....
}
Лістинг програми:
#include<windows.h>
//#define IDM_EXIT 1
//#define IDM_NUM 2
//#define IDM_ADMIN 3
//#define IDM_GUEST 4
#include "sdf.h"
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg,
WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
LOGFONT lf;
HFONT hFont;
switch(messg)
{
case WM_COMMAND:
switch(LOWORD(wParam)) {
//Вибір пункту з ідентифікатором IDM_ADMIN
case IDM_ADMIN:
MessageBox(0, "Привет, Admin", "Приветствие...", MB_ICONINFORMATION|MB_OK);
break;
//Вибір наступного пункту
case IDM_GUEST:
MessageBox(0, "Привет, Guest", "Приветствие...", MB_ICONINFORMATION|MB_OK);
break;
}
MessageBox(0, "Good bye!", "Приветствие...", MB_ICONINFORMATION|MB_OK);
}
switch(messg)
{
case WM_PAINT :
hdc=BeginPaint(hWnd, &ps);
//Создаём свой шрифт
strcpy(lf.lfFaceName,"Times New Roman");
lf.lfHeight=20;
lf.lfItalic=1;
lf.lfStrikeOut=0;
lf.lfUnderline=0;
lf.lfWidth=10;
lf.lfWeight=20;
lf.lfCharSet=DEFAULT_CHARSET;
lf.lfPitchAndFamily=DEFAULT_PITCH;
lf.lfEscapement=900;
hFont = CreateFontIndirect(&lf);
SelectObject(hdc, hFont);
SetTextColor(hdc, RGB(0,0,100));
TextOut(hdc,80,280, "Коренюк Марк!!!", 15);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных
}
return 0;
}
char szProgName[]="Ім’я программы";
char szIconName[]="IDI_MYICON"; //тут додана іконка
char szCursorName[]="IDC_MYCURSOR"; // тут доданий курсор
char szMenu[]="MainMenu";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;
MSG lpMsg;
WNDCLASS w; //створення екземпляру структури WNDCLASS
//її заповнення
w.hbrBackground = CreateSolidBrush(RGB(50,50,100));
w.lpszClassName=szProgName; //ім’я програми - оголошено вище
w.hInstance=hInstance; //ідентифікатор поточного додатку
w.lpfnWndProc=WndProc; //вказівник на функцію вікна
w.hCursor=LoadCursor(hInstance, szCursorName); //завантаження курсору
w.hIcon=LoadIcon(hInstance, szIconName); // завантаження іконки
w.lpszMenuName=szMenu; // меню поки є
//w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //колір фону вікна
w.style=CS_HREDRAW|CS_VREDRAW; //стиль - перемалювання по х і по у
w.cbClsExtra=0;
w.cbWndExtra=0;
if(!RegisterClass(&w))
return 0;
hWnd=CreateWindow(szProgName, //імя програми
"Демонстрація меню в Win32 API", //Заголовок окна
WS_OVERLAPPEDWINDOW, //Стиль вікна - перекриває
100, //положення вікна на екрані по х
100, // положення по у
500, //ширина
400, //висота
(HWND)NULL, //ідентифікатор батьківського вікна
(HMENU)NULL, // ідентифікатор меню
(HINSTANCE)hInstance, // ідентифікатор екземпляру програми
(HINSTANCE)NULL); //відсутність додаткових параметрів
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&lpMsg, NULL, 0, 0)) { //отримання повідомлення з черги
TranslateMessage(&lpMsg); //перетворення повідомлень клавіш у символиы
DispatchMessage(&lpMsg); //Передає повідомлення відповідній функції вікна
}
return(lpMsg.wParam);
}
Вікно результату:
Висновок:
Під час даної лабораторної роботи було створено меню вікна засобами API.
Лабораторна робота №5
Тема: Обробка повідомлень з клавіш миші.
Мета: Навчитись обробляти повідомлення миші у вікні засобами API.