menu



















Menu






Menu i jego obsługa
Teraz zaczynamy wchodzić coraz głębiej. Jeżeli jeszcze masz jakieś wątpliwości co do jakiejś klasy, i nie wiesz poco jest któraś linijka to zawróć i przeanalizuj jeszcze raz, pokompiluj sobie troszkę, spróbuj coś pozmieniać... Ale dobra do rzeczy.
Chyba wiesz co to jest menu. Najpierw trzeba je utworzyć w zasobach. Będziemy bazowali na projekcie z poprzedniego rozdziału. Dodamy tylko do niego menu. Trzeba to zrobić tak jak z ikoną i kursorem, tylko teraz wybrać menu. Zmieniamy identyfikator na IDR_MENU. No to trzeba teraz utworzyć jakieś menu. Klikamy w kwadrat na pasku przypominającym puste menu. Pojawia się nam okienko.

Jeżeli nazwie przed literką wystąpi znak and - & to literka po tym znaku będzie podkreślona i będzie ona oznaczała literę, po naciśnięciu której na klawiaturze menu zostanie oznaczone.
Zróbmy sobie takie menu:
Okna O..
Komunikat 1
Komunikat 2

Komunikat 1 niech będzie też dostępny pod klawiszem F1. W tym celu trzeba Dodać do zasobów tablicę akceleratorów. Jak już będziemy mieli utworzoną tablicę akceleratorów, to trzeba dodać akcelerator. Pojawi się nam takie okienko:
Jako ID podajemy ID menu które nam nadał program, dla komunikatu 1. Można je odczytać we właściwościach każdej z komórek menu. Jako key wpisujemy VK_F1 co oznacza klawisz F1. To by było chyba tyle narazie. Przejdźmy do kodu.
W kodzie pozwoliłem sobie pozmieniać nazwy zmiennych i klas. Oto kod:

#include <afxwin.h>
#include "resource.h"

class CNaszaApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};

CNaszaApp NaszaAplikacja;

class CNaszeOkno : public CFrameWnd
{
public:
CNaszeOkno();
};

CNaszeOkno::CNaszeOkno()
{
HBRUSH hBrush=::CreateSolidBrush(RGB(255,255,255));
CString KlasaOkna = AfxRegisterWndClass(CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW,
AfxGetApp()->LoadCursor(IDC_KURSOR),
hBrush,
AfxGetApp()->LoadIcon(IDI_IKONA));


Create(KlasaOkna,"Nasza aplikacja.");
::DeleteObject(hBrush);
}

BOOL CNaszaApp::InitInstance()
{
m_pMainWnd = new CNaszeOkno();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}

Trzeba dodać metody obsługujące poszczególne pozycje menu. Trzeba więc zmodyfikować klasę CNaszeOkno

class CNaszeOkno : public CFrameWnd
{
public:
CNaszeOkno();
private:
void Komunikat1();
void Komunikat2();
void O();

DECLARE_MESSAGE_MAP()

};

Następnie trzeba przypisać znaczenie odpowiednich pól w menu do odpowiednich metod. Umieszcza się to na końcu pliku.

BEGIN_MESSGE_MAP (CNaszeOkno, CFrameWnd)
ON_COMMAND(ID_OKNA_KOMUNIKAT1, Komunikat1)
ON_COMMAND(ID_OKNA_KOMUNIKAT2, Komunikat2)
ON_COMMAND(ID_O, O)
END_MESSAGE_MAP()

Powyższy kod nie może być zagnieżdrzony w żadnej klasie ani metodzie. Trzeba jeszcze zrobić żeby pokazało się menu w oknie, i działały akceleratory.

CNaszeOkno::CNaszeOkno()
{
HBRUSH hBrush=::CreateSolidBrush(RGB(255,255,255));
CString KlasaOkna = AfxRegisterWndClass(CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW,
AfxGetApp()->LoadCursor(IDC_KURSOR),
hBrush,
AfxGetApp()->LoadIcon(IDI_IKONA));


Create(KlasaOkna,"Nasza aplikacja.",WS_OVERLAPPEDWINDOW,rectDefault,NULL,
MAKEINTRESOURCE(IDR_MENU)); //Ładujemy menu
LoadAccelTable(MAKEINTRESOURCE(IDR_ACC)); //ładujemy akcelerator
::DeleteObject(hBrush);
}
Potrzebne nam są jeszcze metody które mamy zadeklarowane.

void CNaszeOkno::Komunikat1()
{
MessageBox("To jest komunikat 1","Komunikat",MB_ICONINFORMATION|MB_OK);
}
void CNaszeOkno::Komunikat2()
{
MessageBox("To jest komunikat 2","Komunikat",MB_ICONINFORMATION|MB_OK);
}
void CNaszeOkno::O()
{
MessageBox("W ten sposób też to działa","O...",MB_ICONINFORMATION|MB_OK);
}









Wyszukiwarka

Podobne podstrony:
pu srvc menu nl
menu cwiczenia14
menu
menu
l menu
menu
menu (67)
Menu 3
181 menu (6)
184 menu (2)
265 menu
java awt Menu
280 menu

więcej podobnych podstron