Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Gdy obiekt jest aktywny w kontenerze, protokół scalania menu dokumentów OLE daje obiektowi pełną kontrolę nad menu Pomoc . W związku z tym tematy Pomocy kontenera nie są dostępne, chyba że użytkownik dezaktywuje obiekt. Architektura zawierania dokumentów aktywnych rozszerza reguły scalania menu w miejscu, aby umożliwić udostępnianie menu zarówno kontenerowi, jak i dokumentowi, który jest aktywny. Nowe reguły są po prostu dodatkowymi konwencjami dotyczącymi tego, jaki składnik jest właścicielem której części menu i jak skonstruowane jest udostępnione menu.
Nowa konwencja jest prosta. W aktywnych dokumentach menu Pomoc zawiera dwa elementy menu najwyższego poziomu uporządkowane w następujący sposób:
Help
Container Help >
Object Help >
Na przykład gdy sekcja programu Word jest aktywna w narzędziu Binder pakietu Office, menu Pomoc będzie wyświetlane w następujący sposób:
Help
Binder Help >
Word Help >
Oba elementy menu to kaskadowe menu, w których dodatkowe elementy menu specyficzne dla kontenera i obiektu są dostępne dla użytkownika. Elementy wyświetlane w tym miejscu będą się różnić w zależności od kontenera i obiektów.
Aby skonstruować to scalone menu Pomoc, aktywna architektura zarządzania dokumentami modyfikuje standardową procedurę dokumentów OLE. Zgodnie z dokumentami OLE, scalony pasek menu może mieć sześć grup menu, a mianowicie File, Edit, Container, Object, Window, Help, w tej kolejności. W każdej grupie może istnieć zero lub więcej menu. Grupy Plik, Kontener i Okno należą do kontenera, a grupy Edytuj, Obiekt i Pomoc należą do obiektu . Gdy obiekt chce przeprowadzić scalanie menu, tworzy pusty pasek menu i przekazuje go do kontenera. Następnie kontener wstawia swoje menu, wywołując polecenie IOleInPlaceFrame::InsertMenus. Obiekt przekazuje również strukturę, która jest tablicą sześciu wartości LONG (OLEMENUGROUPWIDTHS). Po wstawieniu menu kontener określa liczbę menu dodanych w każdej z jego grup, a następnie zwraca wartość. Następnie obiekt wstawia menu, zwracając uwagę na liczbę menu w każdej grupie kontenerów. Na koniec obiekt przekazuje scalony pasek menu i tablicę (która zawiera liczbę menu w każdej grupie) do OLE, co zwraca niejawny opis "deskryptora menu". Później obiekt przekazuje ten uchwyt i scalony pasek menu do kontenera za pośrednictwem polecenia IOleInPlaceFrame::SetMenu. W tej chwili kontener wyświetla scalony pasek menu i przekazuje uchwyt do OLE, aby OLE mogło właściwie zarządzać komunikatami menu.
W zmodyfikowanej procedurze aktywnego dokumentu obiekt musi najpierw zainicjować elementy OLEMENUGROUPWIDTHS do zera przed przekazaniem ich do kontenera. Następnie kontener wykonuje normalne wstawianie menu z jednym wyjątkiem: kontener wstawia menu Pomoc jako ostatni element i przechowuje wartość 1 w ostatnim, czyli szóstym wpisie tablicy OLEMENUGROUPWIDTHS (to znaczy szerokość[5], która należy do grupy Pomocy obiektu). To menu Pomoc będzie zawierać tylko jeden element, który jest podmenu, menu kaskadowe "Pomoc> kontenera" zgodnie z wcześniejszym opisem.
Następnie obiekt wykonuje normalny kod wstawiania menu, z tą różnicą, że przed wstawieniem menu Pomoc sprawdza szósty wpis tablicy OLEMENUGROUPWIDTHS . Jeśli wartość to 1, a nazwa ostatniego menu to Pomoc (lub odpowiedni zlokalizowany ciąg), obiekt wstawia menu Pomoc jako podmenu menu Pomoc kontenera.
Następnie obiekt ustawia szósty element OLEMENUGROUPWIDTHS na zero i zwiększa piąty element o jeden. Dzięki temu ole informuje, że menu Pomoc należy do kontenera, a komunikaty menu odpowiadające temu menu (i jego podmenu) powinny być kierowane do kontenera. Następnie kontener jest odpowiedzialny za przekazywanie WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND i innych komunikatów związanych z menu, należących do części menu Pomoc obiektu. Jest to realizowane przy użyciu WM_INITMENU w celu wyczyszczenia flagi, która informuje kontener, czy użytkownik przechodził do menu Pomoc obiektu. Następnie kontener obserwuje WM_MENUSELECT pod kątem wejścia do lub wyjścia z dowolnego elementu menu Pomoc, którego kontener nie dodał. Podczas wprowadzania oznacza to, że użytkownik przechodził do menu obiektu, więc kontener ustawia flagę "w menu Pomocy obiektu" i używa stanu tej flagi do przekazywania wszelkich WM_MENUSELECT, WM_INITMENUPOPUP i WM_COMMAND komunikatów, co najmniej do okna obiektu. (Po zakończeniu kontener czyści flagę, a następnie przetwarza te same komunikaty). Kontener powinien używać okna zwróconego z funkcji obiektu IOleInPlaceActiveObejct::GetWindow jako miejsca docelowego dla tych komunikatów.
Jeśli obiekt wykryje zero w szóstym elememencie OLEMENUGROUPWIDTHS, będzie on kontynuowany zgodnie z normalnymi regułami dokumentów OLE. Ta procedura obejmuje kontenery, które uczestniczą w łączeniu menu Pomoc, a także te, które w nim nie uczestniczą.
Gdy obiekt wywołuje IOleInPlaceFrame::SetMenu, przed wyświetleniem scalonego paska menu, kontener sprawdza, czy menu Pomoc ma dodatkowe podmenu, oprócz tego, co zostało wstawione przez kontener. Jeśli tak, kontener pozostawia menu Pomoc w scalonym pasku menu. Jeśli menu Pomoc nie ma dodatkowego podmenu, kontener usunie menu Pomoc z scalonego paska menu. Ta procedura dotyczy zarówno obiektów, które biorą udział w scalaniu menu Pomoc, jak i tych, które nie uczestniczą w tym procesie.
Na koniec, gdy nadszedł czas na dezasemblowanie menu, obiekt usuwa wstawione menu Pomoc oprócz usuwania innych wstawionych menu. Gdy kontener usunie menu, usunie menu Pomoc oprócz innych wstawionych menu.