Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
API_LAB.doc
Скачиваний:
1
Добавлен:
06.05.2019
Размер:
485.38 Кб
Скачать

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

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

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

Головне Меню

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

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