Udostępnij przez


Informacje o interfejsie wielu dokumentów

Każdy dokument w aplikacji interfejsu wielu dokumentów (MDI) jest wyświetlany w osobnym oknie podrzędnym w obszarze klienta głównego okna aplikacji. Typowe aplikacje MDI obejmują aplikacje do przetwarzania wyrazów, które umożliwiają użytkownikowi pracę z wieloma dokumentami tekstowymi i aplikacjami arkusza kalkulacyjnego, które umożliwiają użytkownikowi pracę z wieloma wykresami i arkuszami kalkulacyjnymi. Aby uzyskać więcej informacji, zobacz następujące tematy.

Ramka, klient i okna podrzędne

Aplikacja MDI ma trzy rodzaje okien: okno ramki, okno klienta MDI, a także wiele okien podrzędnych. okno ramki przypomina główne okno aplikacji: ma obramowanie zmiany rozmiaru, pasek tytułu, menu okna, przycisk minimalizacji i przycisk maksymalizacji. Aplikacja musi zarejestrować klasę okien dla okna ramowego i udostępnić procedurę okna do jej obsługi.

Aplikacja MDI nie wyświetla danych wyjściowych w obszarze roboczym okna głównego. Zamiast tego zostanie wyświetlone okno klienta MDI. Okno klienta MDI jest specjalnym typem okna podrzędnego należącego do wstępnie wyrejestrowanej klasy okien MDICLIENT. Okno klienta jest elementem podrzędnym okna ramowego; służy jako tło dla okien potomnych. Zapewnia również obsługę tworzenia i manipulowania oknami podrzędnymi. Na przykład aplikacja MDI może tworzyć, aktywować lub zmaksymalizować okna podrzędne, wysyłając komunikaty do okna klienta MDI.

Gdy użytkownik otworzy lub utworzy dokument, w oknie klienta zostanie utworzone okno podrzędne dokumentu. Okno klienta jest oknem nadrzędnym wszystkich okien podrzędnych MDI w aplikacji. Każde okno podrzędne ma obramowanie regulacji rozmiaru, pasek tytułu, menu okna, przycisk minimalizacji i przycisk maksymalizacji. Ponieważ okno podrzędne jest przycięte, jest ograniczone do obszaru klienta i nie może pojawić się poza nim.

Aplikacja MDI może obsługiwać więcej niż jeden rodzaj dokumentu. Na przykład typowa aplikacja arkusza kalkulacyjnego umożliwia użytkownikowi pracę z wykresami i arkuszami kalkulacyjnymi. Dla każdego obsługiwanego typu dokumentu aplikacja MDI musi zarejestrować podrzędną klasę okien i udostępnić procedurę okna do obsługi okien należących do tej klasy. Aby uzyskać więcej informacji na temat klas okien, zobacz Klasy okien. Aby uzyskać więcej informacji na temat procedur okien, zobacz Procedury okien.

Poniżej przedstawiono typową aplikację MDI. Nosi nazwę Multipad.

Zrzut ekranu przedstawiający wielopadowe okno ramki aplikacji mdi i okno klienta.

Tworzenie okna podrzędnego

Aby utworzyć okno podrzędne, aplikacja MDI wywołuje funkcję CreateMDIWindow lub wysyła komunikat WM_MDICREATE do okna klienta MDI. Bardziej wydajnym sposobem utworzenia okna podrzędnego MDI jest wywołanie funkcji CreateWindowEx, określając WS_EX_MDICHILD rozszerzony styl.

Aby zniszczyć okno podrzędne, aplikacja MDI wysyła komunikat WM_MDIDESTROY do okna klienta MDI.

Aktywacja okna podrzędnego

Dowolna liczba okien podrzędnych może pojawić się w oknie klienta w dowolnym momencie, ale tylko jeden może być aktywny. Aktywne okno podrzędne jest umieszczone przed wszystkimi innymi oknami podrzędnymi, a jego obramowanie jest wyróżnione.

Użytkownik może aktywować nieaktywne okno podrzędne, klikając je. Aplikacja MDI aktywuje okno podrzędne, wysyłając komunikat WM_MDIACTIVATE do okna klienta MDI. Gdy okno klienta przetwarza ten komunikat, wysyła komunikat WM_MDIACTIVATE zarówno do procedury okna podrzędnego, które ma zostać aktywowane, jak i do procedury okna podrzędnego, które jest dezaktywowane.

Aby zapobiec aktywowaniu okna podrzędnego, zarządzaj komunikatem WM_NCACTIVATE skierowanym do okna podrzędnego, zwracając FALSE.

System śledzi położenie każdego okna podrzędnego w stosie okien, które się na siebie nakładają. Ten układ jest znany jako Z-Order. Użytkownik może aktywować następne okno podrzędne w kolejności Z, klikając Dalej z menu okna w aktywnym oknie. Aplikacja aktywuje następne (lub poprzednie) okno podrzędne w kolejności Z, wysyłając komunikat WM_MDINEXT do okna klienta.

Aby pobrać dojście do aktywnego okna podrzędnego, aplikacja MDI wysyła komunikat WM_MDIGETACTIVE do okna klienta.

Menu wielu dokumentów

Główne okno aplikacji MDI powinno zawierać pasek menu z menu okna. Menu okna powinno zawierać elementy rozmieszczające okna podrzędne w oknie klienta lub zamykające wszystkie okna podrzędne. Menu okna typowej aplikacji MDI może zawierać elementy w poniższej tabeli.

Pozycja menu Cel
kafelka Rozmieszcza okna podrzędne w formie kafelkowej, tak aby każde z nich było wyświetlane w całości w oknie klienta.
Cascade Rozmieszcza okna podrzędne w formacie kaskadowym. Okna podrzędne nakładają się na siebie, ale pasek tytułu każdego z nich jest widoczny.
rozmieszczanie ikon Rozmieszcza ikony zminimalizowanych okien podrzędnych u dołu okna klienta.
Zamknij wszystkie Zamyka wszystkie okna podrzędne.

Za każdym razem, gdy zostanie utworzone okno podrzędne, system automatycznie dołącza nowy element menu do menu okna. Tekst elementu menu jest taki sam jak tekst na pasku menu nowego okna podrzędnego. Klikając element menu, użytkownik może aktywować odpowiednie okno podrzędne. Gdy okno podrzędne zostanie zniszczone, system automatycznie usunie odpowiedni element menu z menu okna.

System może dodać do dziesięciu elementów menu w menu okna. Po utworzeniu dziesiątego okna podrzędnego system dodaje element Więcej okien do menu okna. Kliknięcie tego elementu spowoduje wyświetlenie okna dialogowego Wybieranie okna. Okno dialogowe zawiera pole listy z tytułami wszystkich obecnie dostępnych okien podrzędnych MDI. Użytkownik może aktywować okno podrzędne, klikając jego tytuł w polu listy.

Jeśli aplikacja MDI obsługuje kilka typów okien podrzędnych, dostosuj pasek menu w celu odzwierciedlenia operacji skojarzonych z aktywnym oknem. W tym celu podaj oddzielne zasoby menu dla każdego typu okna podrzędnego obsługiwanego przez aplikację. Po aktywacji nowego typu okna podrzędnego, aplikacja powinna wysłać komunikat WM_MDISETMENU do okna klienta, przekazując mu uchwyt do odpowiedniego menu.

Jeśli okno podrzędne nie istnieje, pasek menu powinien zawierać tylko elementy używane do tworzenia lub otwierania dokumentu.

Gdy użytkownik przechodzi przez menu aplikacji MDI przy użyciu kursora, klucze zachowują się inaczej niż wtedy, gdy użytkownik przechodzi przez typowe menu aplikacji. W aplikacji MDI kontrolka przechodzi z menu okna aplikacji do menu okna aktywnego okna podrzędnego, a następnie do pierwszego elementu na pasku menu.

Wiele akceleratorów dokumentów

Aby odbierać i przetwarzać klucze akceleratora dla okien podrzędnych, aplikacja MDI musi zawierać funkcję TranslateMDISysAccel w pętli komunikatów. Pętla musi wywoływać TranslateMDISysAccel przed wywołaniem funkcji TranslateAccelerator lub DispatchMessage.

Klucze akceleratora w menu okna dla okna podrzędnego MDI różnią się od tych dla okna podrzędnego innego niż MDI. W oknie podrzędnym MDI kombinacja ALT+ – (minus) otwiera menu okna, kombinacja CTRL+F4 zamyka aktywne okno podrzędne, a kombinacja CTRL+F6 aktywuje następne okno podrzędne.

Rozmiar i rozmieszczenie okien podrzędnych

Aplikacja MDI kontroluje rozmiar i położenie okna podrzędnego, wysyłając komunikaty do okna klienta MDI. Aby zmaksymalizować aktywne okno podrzędne, aplikacja wysyła komunikat WM_MDIMAXIMIZE do okna klienta. Gdy okno podrzędne jest zmaksymalizowane, jego obszar klienta całkowicie wypełnia okno klienta MDI. Ponadto system automatycznie ukrywa pasek tytułu okna podrzędnego i dodaje ikonę menu okna podrzędnego i przycisk Przywróć na pasku menu aplikacji MDI. Aplikacja może przywrócić okno klienta do jego oryginalnego (przed maksymalizacją) rozmiaru i położenia, wysyłając do okna klienta komunikat WM_MDIRESTORE.

Aplikacja MDI może rozmieścić okna podrzędne w układzie kaskadowym lub kafelkowym. Gdy okna podrzędne są kaskadowane, okna pojawiają się w stosie. Okno w dolnej części stosu zajmuje lewy górny róg ekranu, a pozostałe okna są przesunięte w pionie i w poziomie, tak aby lewe obramowanie i pasek tytułu każdego okna podrzędnego były widoczne. Aby rozmieścić okna podrzędne w formacie kaskadowym, aplikacja MDI wysyła komunikat WM_MDICASCADE. Zazwyczaj aplikacja wysyła ten komunikat, gdy użytkownik kliknie Kaskada w menu okien.

Gdy okna podrzędne są ustawiane w formie kafelków, system wyświetla każde okno podrzędne w całości, nie nakładając się na żadną z nich. Wszystkie okna mają rozmiar, zgodnie z potrzebami, aby mieściły się w oknie klienta. Aby rozmieścić okna podrzędne w postaci kafelków, aplikacja MDI wysyła komunikat WM_MDITILE do okna klienta. Zazwyczaj aplikacja wysyła ten komunikat, gdy użytkownik kliknie płytkę w menu okna.

Aplikacja MDI powinna podać inną ikonę dla każdego typu okna podrzędnego, które obsługuje. Aplikacja określa ikonę podczas rejestrowania klasy okna podrzędnego. System automatycznie wyświetla ikonę okna podrzędnego w dolnej części okna klienta po zminimalizowaniu okna podrzędnego. Aplikacja MDI kieruje system do rozmieszczania ikon okien podrzędnych przez wysłanie komunikatu WM_MDIICONARRANGE do okna klienta. Zazwyczaj aplikacja wysyła ten komunikat, gdy użytkownik kliknie Rozmieść ikony w menu okna.

Tytuł ikony — Windows

Ponieważ okna podrzędne MDI mogą być zminimalizowane, aplikacja MDI musi unikać manipulowania oknami tytułów ikon tak, jakby były normalnymi oknami podrzędnym MDI. Okna z tytułami ikon pojawiają się, gdy aplikacja wylicza okna podrzędne klienta MDI. Okna tytułów ikon różnią się od innych okien podrzędnych tym, że należą do okna podrzędnego MDI.

Aby określić, czy okno podrzędne to okno tytułu ikony, użyj funkcji GetWindow z indeksem GW_OWNER. Nietytułowe okna zwracają NULL. Należy pamiętać, że ten test jest niewystarczający w przypadku okien najwyższego poziomu, ponieważ okna menu i okna dialogowe są własnością okien.

Dane okna podrzędnego

Ponieważ liczba okien podrzędnych różni się w zależności od liczby otwieranych dokumentów, aplikacja MDI musi mieć możliwość skojarzenia danych (na przykład nazwy bieżącego pliku) z każdym oknem podrzędnym. Istnieją dwa sposoby, aby to zrobić:

  • Przechowywanie danych okna podrzędnego w strukturze okna.
  • Użyj właściwości okna.

Struktura okna

Gdy aplikacja MDI rejestruje klasę okien, może zarezerwować dodatkowe miejsce w strukturze okien dla danych aplikacji specyficznych dla tej konkretnej klasy okien. Aby przechowywać i pobierać dane w tym dodatkowym miejscu, aplikacja używa funkcji GetWindowLong i SetWindowLong.

Aby zachować dużą ilość danych dla okna podrzędnego, aplikacja może przydzielić pamięć dla struktury danych, a następnie zapisać uchwyt do pamięci zawierającej strukturę w dodatkowej przestrzeni skojarzonej z oknem podrzędnym.

Właściwości okna

Aplikacja MDI może również przechowywać dane poszczególnych dokumentów przy użyciu właściwości okna. Dane dla poszczególnego dokumentu to dane specyficzne dla typu dokumentu zawartego w określonym oknie podrzędnym. Właściwości różnią się od dodatkowego miejsca w strukturze okna, ponieważ nie trzeba przydzielać dodatkowego miejsca podczas rejestrowania klasy okna. Okno może mieć dowolną liczbę właściwości. Ponadto, gdy przesunięcia są używane do uzyskiwania dostępu do dodatkowego miejsca w strukturach okien, właściwości są określane przez nazwy ciągów. Aby uzyskać więcej informacji o właściwościach okna, zobacz właściwości okna .