lekcjaE MM6HZT4EC46IUT5WMXAM7H6W5YUP3OEJSARVQ2Y


LEKCJA 45

Dołączanie zasobów - menu i okienka dialogowe.

Jak dodać menu i okienka dialogowe do aplikacji.

Aby dodać do aplikacji menu należy utworzyć plik (ASCII) zasobów *.RC, który zostanie użyty w projekcie. Pierwszą instrukcją jest MENU, "NazwaMenu", MENU i para słów kluczowych (znanych z Pascala) BEGIN oraz END, między którymi znajdzie się kombinacja instrukcji MENUITEM oraz POPUP. MENUITEM definiuje pozycję na głównym pasku menu - określa - jak będzie wyglądać i jaki identyfikator będzie ją reprezentował. Instrukcja POPUP pozwala, rozwinąć listę pozycji wchodzących w skład danego menu. Nazwa menu może być użyta podczas rejestracji klasy danego okna jako wpisana w odpowiednie pole struktury na której oparte jest okno. W ten sposób uzyskamy menu dla wszystkich okien danej klasy.

BEGIN

POPUP "Rozkaz"

BEGIN

MENUITEM "Rozkaz 1", IDM_R1

MENUITEM "Rozkaz 2", IDM_R2

MENUITEM "Rozkaz 3", IDM_R3

END

POPUP "Kolor"

BEGIN

MENUITEM "Czarny", IDM_BLACK

MENUITEM "Niebieski", IDM_BLUE

MENUITEM "Zielony", IDM_GREEN

END

MENUITEM "Koniec", IDM_EXIT

END

Każda pozycja ma własny identyfikator, np. IDM_EXIT, IDM_BLUE, który Windows przekazują do aplikacji, gdy zostaje ona wybrana przez użytkownika z systemu menu. Ponieważ każdy identyfikator powinien być unikalny, najlepiej jest go zdefiniować w pliku zasobów .RC lub własnym pliku nagłówkowym .H:

#define IDM_EXIT 100

#define IDM_BLUE 101

#define IDM_R1 102

...

Mamy już zdefiniowane menu w pliku zasobów, należy je teraz dołączyć do aplikacji na jeden z dwóch sposobów:

- Można określić menu jako menu danej klasy okien, gdy klasa ta jest rejestrowana. W ten sposób dołączymy menu do każdego okna opartego na tej klasie. Aby to wykonać, wystarczy przypisać odpowiedniemu polu struktury nazwę naszego menu. Jeżeli obiekt klasy WNDCLASS nazwiemy Window1, to:

Window1.lpszMenuName = "NazwaMenu";

Gdy klasa zostanie zarejestrowana, każde okno tej klasy będzie miało to samo menu, chyba że dostarczymy odpowiedni identyfikator menu w momencie tworzenia okna funkcją CreateWindow().

- Drugim sposobem jest dołączenie menu w momencie tworzenia okna, wtedy tylko tworzone okno będzie miało dane menu.

Należy najpierw załadować menu przy użyciu funkcji LoadMenu(), która zwraca jego identyfikator:

HMENU hMenu = LoadMenu(hInstance, "NazwaMenu");

hWnd = CreateWindow(szAppName,

"Nazwa Aplikacji",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

hMenu, <-- tu

hIstance,

NULL );

Typową praktyką jest dołączenie pozycji menu do instrukcji switch w funkcji okienkowej. Ponieważ Windows wysyła komunikat WM_COMMAND do odpowiedniej funkcji okienkowej w odpowiedzi na wybór pozycji przez użytkownika, a parametr wParam zawiera identyfikator tejże pozycji - można napisać tak:

case WM_COMMAND:

switch (wParam)

{

case IDM_R1:

... obsługa ...; break;

case IDM_R2:

... obsługa ...; break

case IDM_QUIT:

...DestroyWindow(...);

}

Jak rozbudowuje się menu.

API Windows zawiera funkcje, umożliwiające rozbudowę menu nawet w ruchu aplikacji (run-time). Rozbudowa menu w konkretnym oknie nie pociąga za sobą zmian w innych, opartych na tej samej klasie oknach. Jest to możliwe, ponieważ w chwili tworzenia okna otrzymuje ono swoją kopię menu (tradycyjne w C/C++ przekazywanie kopii zmiennej do funkcji). Nie wszystkie pozycje w menu są w danym stadium pracy aplikacji sensowne (możliwe do wykonania). Zaraz przekonasz się, jak to się dzieje, że niektóre pozycje "robi się na szaro". W API Windows służy do tego funkcja:

EnableMenuItem (hMenu, IDM_R1, MF_DISABLED);

EnableMenuItem (hMenu, IDM_R1, MF_GRAYED);

EnableMenuItem (hMenu, IDM_R1, MF_ENABLED);

Rozkaz R1 skojarzony z identyfikatorem IDM_R1 i znajdujący się w systemie menu o oznaczniku hMenu stanie się kolejno zablokowany, widoczny-lecz-niedostępny, dostępny. Dodawanie i usuwanie pozycji w menu Dodawanie pozycji do menu może być wykonane dwoma sposobami: przez wstawienie pomiędzy istniejące pozycje lub na końcu listy. W pierwszym przypadku należy użyć funkcji InsertMenu(). Funkcja ta pozwala jednocześnie określić status pozycji, między innymi czy będzie umieszczone nowe pole można określić dwoma sposobami: przez identyfikator pozycji mającej być przed nową lub przez numerację poszczególnych, licząc id lewej skrajnej pozycji (C++ tradycyjnie liczy od zera). Sposób "odliczania" pozycji w systemie menu określa tryb (BYCOMMAND lub BYPOSITION - rozkaz, bądź pozycja):

InsertMenu(hMenu, IDM_R1, MF_BYCOMMAND |MF_DISABLED, IDM_R5,

"Rozkaz 5");

InsertMenu(hMenu, 1, MF_ENABLED, IDM_R5, "Rozkaz 5");

Funkcja wstawi za pozycją "Rozkaz 1" nową pozycję "Rozkaz 5", jednocześnie ustawia jej status. Drugą funkcją dodającą pozycję do utworzonego systemu menu jest:

AppendMenu(hMenu, MF_ENABLED, IDM_R4, "Rozkaz 4");

Poniżej przykład zdefiniowania menu aplikacji w taki właśnie sposób:

case WM_CREATE:

hMenu = CreateMenu(); //Utworzenie menu

AppendMenu(hMenu, MF_ENABLED, IDM_R1, "Rozkaz 1");

AppendMenu(hMenu, MF_ENABLED, IDM_R2, "Rozkaz 2");

AppendMenu(hMenu, MF_ENABLED, IDM_R3, "Rozkaz 3");

SetMenu(hWnd, hMenu); //Wyświetlenie menu

...

break;

Usuwanie pozycji z menu można przeprowadzić dwoma sposobami:

- poprzez wskazanie numeru pozycji w systemie menu:

DeleteMenu(hMenu, 1, MF_BYPOSITION); //usunięta zostanie druga

//pozycja z systemu menu

- przez wyszczególnienie identyfikatorem pozycji

DeleteMenu(hMenu, IDM_R3, MF_BYCOMMAND);

Po usunięciu pozycji z menu Window usunie również wszystkie związane z nią submenu.

Zaznaczanie pozycji w menu (mark).

Obok pozycji w menu można umieścić znak markujący ("ptaszek"). Znak markujący można zainicjować w pliku zasobów .RC. Dzięki temu, użytkownik w momencie otwarcia okna dowie się z wyglądu menu o początkowym ustawieniu opcji.

MENUITEM "Rozkaz 2", IDM_R2, CHECKED

W trakcie pracy aplikacji należy posłużyć się funkcją CheckMenuItem(). Zwykle najpierw kasujemy "ptaszka" przy poprzedniej pozycji:

CheckMenuItem( hMenu, IDM_R2, MF_UNCHECKED);

CheckMenuItem(hMenu, IDM_R3, MF_CHECKED);

Zmiany pozycji menu

Funkcja ModyfyMenu() pozwala na zmianę nazwy pozycji i jej atrybutów. Oto przykłady użycia tej funkcji:

ModifyMenu(hMenu, IDM_R2, MF_BYCOMMAND, IDM_R2, "Polecenie 2");

Identyfikator pozycji nie ulegnie zmianie, jedynie nazwa pola z "Rozkaz 2" na "Polecenie 2". Możemy zmienić jednocześnie i identyfikator, by nie pomylić się w programie:

ModifyMenu(hMenu, IDM_R2, MF_BYCOMMAND, IDM_P2, "Polecenie 2");

Dodatkowo można ustawić za jednym zamachem i atrybuty:

ModifyMenu(hMenu, IDM_R2, MF_BYCOMMAND | MF_CHECKED | MF_GRAYED,

IDM_R2, "Polecenie 2");

Użycie grafiki w systemie menu.

W systemie menu aplikacji możemy zamiast łańcucha znaków "Rozkaz 2" umieścić element graficzny - np. w postaci mapy bitowej. Zamiast pola o nazwie "Pole", wprowadza mapę bitową:

HMENU hMenu = GetMenu(hWnd);

HBITMAP hBitmap = LoadBitmap (hIstance, "Pole");

ModifyMenu(hMenu, IDM_R2, MF_BYCOMMAND | MF_BITMAP, IDM_R2,

(LPSTR) MAKELONG (hBitmap, 0));

GetMenu() zwraca oznacznik aktualnego menu, potrzebny jako pierwszy parametr funkcji ModifyMenu(). Drugim parametrem tej funkcji jest identyfikator pozycji, którą chcemy zmienić. Trzecia określa, że zmiana ma być wykonana przez wyszukanie pozycji za pośrednictwem jej identyfikatora oraz że nową pozycję ma reprezentować mapa bitowa. Czwarty parametr określa identyfikator nowej pozycji. Ponieważ ostatnim parametrem nie jest już wskaźnik do łańcucha znakowego, należy przesłać oznacznik mapy bitowej jako mniej znaczące słowo tego parametru. W tym celu 16-bitowy oznacznik jest łączony z 16-bitową stałą, a następnie poddawany konwersji do typu Long Pointer to STRing.

Zmiana menu aplikacji na kolejne.

Aplikacja w różnych stadiach pracy może mieć na ekranie różne (kilka czasem kilkanaście) menu. Wymiany menu w oknie aplikacji można dokonać, załadowując nowe menu funkcją LoadMenu() i ustawiając je jako aktualne funkcją SetMenu():

...

hMenu2 = LoadMenu (hIstance, "Menu2");

SetMenu (hWnd, hMenu2);

DrawMenuBar(...);

...

Menu i Menu2 powinny być zdefiniowane w pliku zasobów *.RC. Po każdej zmianie menu należy użyć funkcji DrawMenuBar(), aby wprowadzone zmiany pojawiły się na ekranie. Oto przykład stosownego pliku zasobów:

Menu1 MENU

BEGIN

POPUP "&File"

BEGIN

MENUITEM "&New" , IDM_NEW

MENUITEM "&Save", IDM_SAVE

MENUITEM "E&xit", IDM_EXIT

END

POPUP "&Options"

BEGIN

MENUITEM "Menu&1", IDM_M1,CHECKED

MENUITEM "Menu&2" , IDM_M2

END

END

Menu2 MENU

BEGIN

POPUP "&File"

BEGIN

MENUITEM "&Open", IDM_OPEN

MENUITEM "&New" , IDM_NEW

MENUITEM "&Save", IDM_SAVE

MENUITEM "Save &As", IDM_SAVEAS

MENUITEM "&DOS shell", IDM_DOSSHELL

MENUITEM "E&xit", IDM_EXIT

END

POPUP "&Options"

BEGIN

MENUITEM "Menu&1", IDM_M1,

MENUITEM "Menu&2" , IDM_M2, CHECKED

END

END

ZASTOSOWANIE Resource Worshop

Takie pliki zasobów w Borland C++ mało kto tworzy dziś "na piechotę". BORLAND C++ oferuje do tego celu dwa narzędzia: Edytor zasobów - Resource Workshop Automatyczny generator - DialogExpert (wersje 4+) Najwygodniejszym sposobem jest zastosowanie edytora zasobów Resource Workshop. Jest to tym wygodniejsze, że Resource Workshop pozwala jednocześnie obserwować i źródłowy plik *.RC (ASCII) i efekt - menu w ruchu. W środowisku Borland C++ okienka dialogowe tworzy się także zwykle przy pomocy Resource Worshop. Tworzenie okienek dialogowych przy pomocy Resource Workshop przypomina składanie budowli z gotowych klocków. Kolejne elementy sterujące możemy umieszczać w okienku dialogowym poprzez wybranie ich z palety narzędzi i przeniesienie do projektowanego okienka techniką "pociągnij i upuść" (drag & drop). Po skróconym omówieniu najważniejszych funkcji z API Windows przejdźmy to niemniej krótkiej prezentacji zasad tworzenia aplikacji przy pomocy biblioteki obiektów OWL.

[Z]

1. Przeanalizuj program w pełnej wersji (na dyskietce).

2. Zmodyfikuj dowolną aplikację przykładową tak, by dołączyć do niej inną ikonę.

3. Opracuj własne menu i własną ikonę przy pomocy Resource Workshop.

Krótka instrukcja do Resource Workshop.

1. Uruchomienie: Ikonka Worshop w oknie grupowym Borland C++.

2. Początek pracy: File | New Project...

3. Rodzaje zasobów do wyboru w okienku dialogowym "New project":

[ ] RC - plik zasobów

[ ] CUR - kursor

[ ] BMP - mapa bitowa

[ ] RES - plik zasobów w formie skompilowanej

[ ] ICO - ikonka

[ ] FNT - czcionki (Fonts)

Wybieramy odpowiednio: RC

4. Zmieni się menu w głównym oknie Resource Workshop. Z menu wybieramy Resource | New W okienku dialogowym z listy Resource Type (rodzaj zasobów): ACCELERATORS, BITMAP, CURSOR, DIALOG, FONT, ICON, MENU, RCDATA, STRINGTABLE, VERSINFO wybieramy odpowiednio MENU lub DILOG.

Kolejny raz zmieni się menu. W przypadku menu wybieramy: Menu:

New pop-up - nowa pozycja POPUP

New menu item - nowa pozycja MENUITEM Zwróć uwagę, że typowe menu File, Edit, Help jesy już gotowe do wstawienia (ukryte pod pozycjami New file pop-up, New edit pop-up...). W przypadku okienka dialogowego najważniejsze jest menu Control. Są tam wszyskie rodzaje podstawowych elementów sterujących (Push button, Radio button, scroll bar, List box, Combo box, Edit box, itd.). Projektując okienko możesz również wyświetlić siatkę (Grid).

Przy pomocy Resource Workshop możesz poddawać edycji i modyfikować pliki zasobów zarówno należące do programów przykładowych zawartoch na dyskietce, jak i zasoby "firmowych" przykładów Borlanda. W katalogach \SOURCE (kody źródłowe .CPP) i \EXAMPLES (przykłady - projekty) znajdziesz wiele rozmaitych przykładów. Możesz także poddawać edycji pliki .BMP, .ICO i inne niekoniecznie należące do pakietu Borland C++.

4



Wyszukiwarka

Podobne podstrony:
Lekcja kliniczna 2 VI rok WL
Lekcja Przysposobienia Obronnego dla klasy pierwszej liceum ogólnokształcącego
Lekcja wychowania fizycznego jako organizacyjno metodyczna forma lekcji ruchu
Lekcja kliniczna nr 2 VI rok WL
04 Lekcja
PF7 Lekcja2
lekcja52
Printing bbjorgos lekcja41 uzupelnienie A
lekcja 18 id 265103 Nieznany
Hydrostatyka i hydrodynamika lekcja ze wspomaganiem komputerowym
Lekcja 6 Jak zapamietywac z notatki Tajemnica skutecznych notatek
lekcja 20
lekcja20
Lekcja 04 Szene 04
LINGO ROSYJSKI raz a dobrze Intensywny kurs w 30 lekcjach PDF nagrania audio audio kurs
Printing bbjorgos lekcja01 05 A
'Half Life', czyli pół życia przed monitorem zagrożenia medialne foliogramy gim modul 3 lekcja 5
Lekcja od mamy
lekcja 3 id 265134 Nieznany

więcej podobnych podstron