Теоретичні відомості:
До програми можна додати меню.
Меню бувають двох типів - головне меню і контекстне меню. Перше розміщується у вікні під рядком заголовку, друге при правому клацанні мишею на будь-якому об’єкті.
Головне Меню
Меню можна додати двома способами: вписати до файлу ресурсів вручну або через редактор ресурсів. Перший спосіб вважається за кращий, оскільки можна контролювати ситуацію.
Створіть новий проект з іменем 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;
}
}
....
}
Лістинг програми:
//lab2.cpp
#include<windows.h>
#include<tchar.h>
#include "resource.h"
const wchar_t szTitle[]=_T("ЗПЗС-114 Лаб№4 Вариницький С.В.");
const wchar_t szMenu[]=_T("MainMenu");
const wchar_t szProgName[]=_T("Лаб№4");
const wchar_t szIconName[]=_T("IDI_MYICON");
const wchar_t szCursorName[]=_T("IDC_MYCURSOR");
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd; MSG lpMsg;
WNDCLASS w;
w.style = CS_HREDRAW|CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.cbClsExtra = 0;
w.cbWndExtra = 0;
w.hInstance = hInstance;
w.hIcon = LoadIcon(hInstance, szIconName);
//w.hCursor = LoadCursor(NULL, IDC_ARROW); //загружаем курсор
w.hCursor = LoadCursor(hInstance, szCursorName);
w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
w.lpszMenuName = szMenu;
w.lpszClassName = szProgName;
if(!RegisterClass(&w)) {
MessageBox(NULL, _T("Can't register class"), _T("Error"), MB_OK); return 0;
}
hWnd = CreateWindow(szProgName, szTitle, WS_OVERLAPPEDWINDOW,100, 100, 300, 200, (HWND)NULL, (HMENU)NULL,(HINSTANCE)hInstance, (LPVOID) NULL);
if(!hWnd) {
MessageBox(NULL, _T("Can't create window"), _T("Error"), MB_OK); return 0;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&lpMsg, hWnd, 0, 0)) {
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
return (lpMsg.wParam);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)
{
HDC hdc; PAINTSTRUCT ps;
switch(messg)
{
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDM_NF: MessageBox(NULL, _T("Файл\\Создать\\Файл"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_ND: MessageBox(NULL, _T("Файл\\Создать\\Папку"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_OF: MessageBox(NULL, _T("Файл\\Открыть\\Файл"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_OD: MessageBox(NULL, _T("Файл\\Открыть\\Папку"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_EXIT: DestroyWindow(hWnd);
case IDM_PLD: MessageBox(NULL, _T("Вид\\Показать\\Личные данные"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_PKRP: MessageBox(NULL, _T("Вид\\Показать\\Компактный режим просмотра"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_OUT: MessageBox(NULL, _T("Вид\\Другие окна\\Журнал"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_RC: MessageBox(NULL, _T("Вид\\Другие окна\\Ресурсы"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_TS: MessageBox(NULL, _T("Справка\\Техническая поддержка\\Сайт"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_TP: MessageBox(NULL, _T("Справка\\Техническая поддержка\\Почта"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_INFO: MessageBox(NULL, _T("Справка\\Просмотр справки"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
case IDM_ABOUT: MessageBox(NULL, _T("Справка\\О программе"), _T("выбранный пункт"), MB_ICONINFORMATION|MB_OK); break;
}
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_PAINT :
hdc=BeginPaint(hWnd, &ps);
//TextOut(hdc, 60,75, szText, 24);
ValidateRect(hWnd, NULL);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, messg, wParam, lParam);
}
return 0;
}
//lab4.rc
#include "windows.h"
IDI_MYICON ICON "ico.ico"
IDC_MYCURSOR CURSOR "c.cur"
#include "resource.h"
MainMenu MENU {
POPUP "&Файл" {
POPUP "&Создать" {
MENUITEM "Файл", IDM_NF
MENUITEM "Папку", IDM_ND
}
POPUP "&Открыть" {
MENUITEM "Файл", IDM_OF
MENUITEM "Папку", IDM_OD
}
MENUITEM "В&ихід", IDM_EXIT
}
POPUP "&Вид" {
POPUP "&Показать" {
MENUITEM "Личные данные", IDM_PLD
MENUITEM "Компактный режим просмотра", IDM_PKRP
}
POPUP "&Другие окна" {
MENUITEM "Журнал", IDM_OUT
MENUITEM "Ресурсы", IDM_RC
}
}
POPUP "&Справка" {
POPUP "&Техническая поддержка" {
MENUITEM "Сайт", IDM_TS
MENUITEM "Почта", IDM_TP
}
MENUITEM "&Просмотр справки", IDM_INFO
MENUITEM "&О программе", IDM_ABOUT
}
}
Вікно результату:
Висновок:
Під час даної лабораторної роботи було створено меню вікна засобами API.
Лабораторна робота №5
Тема: Обробка повідомлень з клавіш миші.
Мета: Навчитись обробляти повідомлення миші у вікні засобами API.