Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗвЫт_ЛР_C++.doc
Скачиваний:
1
Добавлен:
05.05.2019
Размер:
513.02 Кб
Скачать

Теоретичні відомості:

До програми можна додати меню.

Меню бувають двох типів - головне меню і контекстне меню. Перше розміщується у вікні під рядком заголовку, друге при правому клацанні мишею на будь-якому об’єкті.

Головне Меню

Меню можна додати двома способами: вписати до файлу ресурсів вручну або через редактор ресурсів. Перший спосіб вважається за кращий, оскільки можна контролювати ситуацію.

Створіть новий проект з іменем 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]