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 nlmenu cwiczenia14menumenul menumenumenu (67)Menu 3181 menu (6)184 menu (2)265 menujava awt Menu280 menuwięcej podobnych podstron