[ Pobierz całość w formacie PDF ]
.Podobnie jak wiêkszoœæ innych obiektów MFC reprezentuj¹cych obiekty Windows API, do stworzenia w pe³ni funkcjonalnego obiektu menu kontekstowego wymagane s¹ dwa kroki.Najpierw musisz zaalokowaæ obiekt C++, a nastêpnie musisz go zainicjali-zowaæ.Poni¿sze linie kodu pokazuj¹ jeden ze sposobów stworzenia i zainicjalizowania obiektu CMenu:// Alokowanie obiektu CMenu dla menu kontekstowego.g_pMenuContext = new CMenu(); if(!g pMenuCOntext) return -1;// Inicjalizacja obiektu CMenu (po³¹czenie menu z obiektem menuMFC).BOOL bSuccess = g_pMenuContext->LoadMenu(IDR_CONTEXT);if(!bSuccess) return -1;Ten fragment kodu pochodzi z funkcji oczekuj¹cej w przypadku b³êdu wartoœci -l (funkcji obs³ugi komunikatu WM_CREATE).Alokacja wi¹¿e siê z u¿yciem operatora new.Inicjalizacja wymaga wywo³ania funkcji CMenu: : LoadMenu (), która jako jedynego parametru wymaga podania identyfikatora zasobu menu.Po stworzeniu i zainicjalizowaniu menu kontekstowe jest gotowe do wyœwietlenia w dowolnym miejscu, które wska¿esz.Z punktu widzenia u¿ytkownika to menu powinno pojawiæ siê w miejscu klikniêcia prawym przyciskiem myszy.Poni¿sza funkcja obs³ugi komunikatu WM_RBUTTONDOWN wyœwietla w³aœnie menu kontekstowe:void CMainFrame::OnRButtonDown(UINT nFlags, CPoint point)// Zamiana wspó³rzêdnych roboczych na wspó³rzêdne ekranu.ClientToScreen(&point);// Wyœwietlenie menu kontekstowego w miejscu wskaŸnika myszy.CMenu *pSubMenu = g_pMenuContext->GetSubMenu(0) ; pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, // Znacznikipoint.x, // wspó³rzêdna xpoint.y, // wspó³rzêdna ythis); // "to" okno CFrameWnd::OnRButtonDown(nFlags, point);Drugi z dwóch parametrów funkcji OnRButtonDown () zawiera po³o¿enie myszy we wspó³rzêdnych obszaru roboczego okna.Jednak funkcja TrackPopupMenu () oczekuje wspó³rzêdnych ekranowych, musimy wiêc wywo³aæ funkcjê cwnd: : ClientToScreen ().Ta funkcja dokonuje konwersji pomiêdzy wspó³rzêdnymi obszaru roboczego okna (zwykle o pocz¹tku w lewym górnym rogu obszaru roboczego) a wspó³rzêdnymi ekranowymi (o pocz¹tku w lewym górnym rogu ekranu).Wiêkszoœæ parametrów funkcji CMenu: :TrackPopupMenu () jest oczywista.Jednak ostatni parametr jest wart omówienia.Gdy pojawia siê menu kontekstowe, generowany jest strumieñ komunikatów, który musi byæ przes³any do jakiegoœ okna.WskaŸnik this w kontekœcie klasy wyprowadzonej z CFrameWnd wskazuje okno, które powinno otrzymywaæ komunikaty menu.Ostatni krok wi¹¿e siê z tym, w jaki sposób powinieneœ usun¹æ menu kontekstowe, gdy ju¿ go nie potrzebujesz.W naszym przyk³adzie po prostu usuwamy obiekt CMenu, gdy ju¿ go nie potrzebujemy.Podobnie jak w przypadku innych pozycji w sta³ej mapie uchwytów, gdy obiekt jest niszczony, niszczony jest równie¿ obiekt systemowy oraz usuwana jest pozycja mapy uchwytów.Choæ móg³byœ usun¹æ obiekt menu w kilku innych miejscach, powinieneœ to jednak zrobiæ w destruktorze obiektu okna ramki:CMainFrame::-CMainFrame()if(g_pMenuContext)g pMenuContext->DestroyMenuJako czêœæ standardu interfejsu u¿ytkownika w Windows Microsoft zaleca u¿ywanie dla menu kontekstowych prawego przycisku myszy.U¿ytkownicy oczekuj¹ tej mo¿liwoœci i mo¿esz naraziæ swój program na krytykê, jeœli jej nie zaoferujesz.PodsumowanieW tym rozdziale opisaliœmy dwa mechanizmy odbierania poleceñ u¿ytkownika: poprzez klawisze akceleratorów oraz menu.W obu przypadkach, w momencie gdy u¿ytkownik wyda polecenie, wysy³any jest komunikat WM_COMMAND.Menu oraz klawisze akceleratorów wysy³aj¹ tak¿e komunikaty UPDATE_COMMAND_UI, s³u¿¹ce do okreœlenia stanu poleceñ i pozycji menu.Jak widzieliœmy, wiêkszoœæ pracy zwi¹zanej z u¿yciem tych mechanizmów wi¹¿e siê z przygotowaniem odpowiednich funkcji obs³ugi.W nastêpnym rozdziale przyjrzymy siê dwóm najpowszechniejszym metodom interakcji u¿ytkownika z aplikacj¹: poprzez klawiaturê oraz przy u¿yciu myszy.Bez klawiatury i myszy Twoje aplikacje, a tak¿e ogólnie Windows, nie zdzia³aj¹ zbyt du¿o
[ Pobierz całość w formacie PDF ]