[ Pobierz całość w formacie PDF ]
.right=framerect.left+viewrect.Width();framerect.bottom=framerect.top+viewrect.Height();frame->MoveWindow(&framerect);CView::OnInitialUpdate();}Określanie tytułuOkreślenie tytułu ramki jest proste, prawda? Przynajmniej mogłoby się tak wydawać.Wystarczy wywołać metodę SetWindowText dla odpowiedniego okna.Tytuł okna, możesz także określić w łańcuchu dokumentu (patrz Rozdział l, tabela 1.12).Zdarza się jednak, że MFC robi rzeczy, które mogą wyprowadzić Cię z równowagi.Jedną z nich jest dodawanie nazwy otworzonego dokumentu do tytułu okna.Jeśli Twój program rzeczywiście obsługuje jakieś dokumentu, to takie postępowanie jest całkiem sensowne.Jednakże wszystko wygląda inaczej gdy tworzysz grę planszową i nagle okazuje się, że ma ona tytuł: BitZapper-Untitled.Rozwiązaniem jest wyczyszczenie bitu FWS_ADDTOTITLE w stylu okna ramki.Do wykonania tego zadania najlepiej nadaj się metoda PreCreateWindow:BOOL CMyFrame::PreCreateWindow (CREATESTRUCT Łcs)BOOL rv=CFrameWnd::PreCreateWindow (es) ;es.styleŁ=~FWS_ADDTOTITLE;// metoda klasy bazowejreturn rv;Jeśli chcesz, aby nazwa dokumentu wyświetlana była z lewej strony nazwy okna, w stylu okna ramki ustaw bit FWS_PREFIXTITLE.Kilka uwag o stylu FWS_ADDTOTITLEZauważyłem, że często używam stylu FWS_ADDTOTITLE razem z wi­dokami formularza.Większość tworzonych przeze mnie widoków tego typu nie operuje na żadnych plikach, i zazwyczaj chcę im nadawać ściśle określony tytuł.Jeśli piszesz programy przeznaczone dla systemu Windows 3.1, to przez zanegowaniem wartości stylu FWS_ADDTOTITLE będziesz musiał skonwertować ten styl do typu DWORD; w przeciwnym bowiem razie niektóre bity tej wartości nie zostaną poprawnie ustawione.Stosowanie UpdateCMDUIKontrolowanie postaci tytułów i atrybutów elementów kontrolnych często wymaga za­stosowania procedury obsługi OnUpdateCmdUI (patrz Rozdział 1).Za pomocą tej metody MFC nieustannie aktualizuje postać opcji menu, przycisków na paskach narzędzi oraz innych elementów kontrolnych.Dlatego też wszelkie modyfikacje tych elementów muszą zostać wykonane wewnątrz niej (jeśli oczywiście chcesz, aby były one widoczne przez dłuższy czas).Klasa CScrollViewSpośród wszystkich widoków udostępnianych przez MFC, największe możliwości ma widok CScrolIView.Niestety, próby jego zastosowania w normalnych programach przysparzaj ą także najwięcej problemów i frustracji.Dlaczego? Istnieją dwa, podstawowe problemy związane z zastosowanie widoku CScrollView.Po pierwsze, widok ten nie udostępnia żadnych wbudowanych mechanizmów przewijania swojej zawartości za pomocą klawiatury.Po drugie, wszelkie próby nadania widokowi wirtualnej wielkości powyżej 32767 powoduje dziwne zachowanie w systemie Windows 95.Możesz pomyśleć, że nigdy nie będziesz potrzebował widoku o takiej wielkości, Zapewne masz rację, pomyśl jednak o tekście.Każda linia tekstu wyświetlonego w wi­doku zabiera określoną ilość pikseli (powiedzmy: 16).Oznacza to, że używając trybu mapowania MM_TEXT, możesz stworzyć widok zawierający jedynie 2048 linii tekstu.Im większy będzie rozmiar czcionki, tym mniej linii tekstu będziesz mógł umieścić w widoku.Zanim zajmiemy się rozwiązaniem tego problemu, przyjrzyjmy się jednak działaniu klasy CScrollView.Mówiąc jak najprościej, CScrollView okłamuje twój program w taki sposób, że nie jesteś świadomy przewijania wykonywanego przez widok.Widokowi podajesz jedynie całkowitą, logiczną wielkość dokumentu - czyli określasz jak duża ma być sumaryczna wielkość widoku (bez zwracania uwagi na aktualną wielkość okna).Dodatkowo, za pomocą metody SetScrollSizes, określasz tryb mapowania, którego chcesz używać, szerokość linii, oraz wielkość strony.Pierwszą rzeczą jaką robi przewijalny widok, jest określenie, czy logiczna wielkość do­kumentu jest mniejsza od fizycznej wielkości okna.Jeśli dokument jest większy od okna, w widoku wyświetlane są paski przewijania.Jest całkiem prawdopodobne, że Twój dokument będzie mniejszy od wymiarów okna w jednym wymiarze (na przykład w poziomie), natomiast większy w drugim (na przykład w pionie).W takim wypadku wyświetlony zostanie tylko jeden pasek przewijania.Jeśli paski przewijania nie są wyświetlone lub jeśli są one ustawione w pozycji początkowej, nie dzieje się nic specjalnego.Wszystkie rysowane informacje wyświetlane są przez Twoją metodę OnDraw.A co się dzieje, jeśli masz więcej informacji, nie zmieszczą się one na jednym ekranie? Nic, system Windows nie wyświetli informacji wychodzących poza widok.Jednak nie jest to dramatyczna sytuacja, gdyż rysowanie informacji, których system nie wyświetla (gdyż znajdują się one poza obszarem przycinania), jest znacznie szybsze od rysowania, którego efekty widzimy na ekranie.W dalszej części rozdziału pokażę Ci, w jaki sposób można poprawić efektywność rysowania.Należy powiedzieć jeszcze jedną, bardzo istotną rzecz: Otóż Twoja metoda OnDraw nie powinna ustawiać trybu mapowania.Tryb mapowania jest automatycznie ustawiany przez metodę OnPrepareDC klasy CScrollView; będzie to ten sam styl, który podałeś w wywołaniu metody SetScrollSizes.Załóżmy teraz, że użytkownik przewinie widok w dół, do połowy wysokości.Twoja metoda OnDraw nie zauważy żadnej różnicy.Jednakże widok CScrollView tak prze­kształci współrzędne początku układu współrzędnych okna oraz widoku, że 50 procent zawartości dokumentu znajdzie się ponad oknem.I znowu, system Windows odrzuci niewidoczne części wyświetlanego dokumentu.W którymś momencie rysowania za­wartości dokumentu dojdziesz to tej jego części, która będzie się znajdowała wewnątrz obszaru przycinania ta część dokumentu zostanie narysowana i wyświetlona na ekranie.Jeśli jakaś część dokumentu znajdzie się poniżej obszaru przycinania, zostanie ona od­rzucona przez system.Jeśli Twój program jest dostatecznie prosty, tak będą wyglądały wszystkie wykonywane czynności.Określ wielkości pasków przewijania i za każdym razem wyświetlaj zawartość całego dokumentu.Jeśli wielkość Twojego dokumentu nigdy nie będzie modyfikowana, możesz wywołać metodę SetScrollSizes w metodzie OnlnitialUpdate; możesz także dynamicznie modyfikować wielkości dokumentu w metodzie OnUpdate.Istnieją dwa wypadki, w których musisz wziąć pod uwagę pozycję wyświetlanego ob­szaru dokumentu.Pierwszym z nich jest obsługa komunikatów generowanych przez mysz.Komunikaty te zawsze podają pozycję wskaźnika myszy w pikselach (w trybie mapowania MM_TEXT).Koordynaty przekazane przez komunikat będziesz musiał powiększyć o wielkość przesunięcia pasków przewijania.Możesz to zrobić w bardzo prosty sposób posługując się wartościami zwróconymi przez metodę GetDeviceScrollPosition.Następnie będziesz musiał przeliczyć piksele na używane przez Ciebie jednostki logiczne (chyba że tymi jednostkami logicznymi są piksele - w takim wypadku żadnego przeliczania nie będziesz musiał wykonywać).Drugim przypadkiem, w którym wszystko się troszkę komplikuje, jest pobieranie kon­tekstu (obiektów klasy CDC) poza metodą OnDraw.Klasa ScrollView automatycznie określa pozycję początku układu współrzędnych w kontekście CDC przekazywanym do metody OnDraw [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • funlifepok.htw.pl
  •