Strona startowa Ludzie pragnÄ… czasami siÄ™ rozstawać, żeby móc tÄ™sknić, czekać i cieszyć siÄ™ z powrotem.Spojrzenie na system s³owotwórczy w ca³oœci pozwala zobaczyæ kategorie s³owotwórcze w zderzeniu z klasami semantycznymi, które intuicyjnie sk³onni bylibyœmy uwa¿aæ za...Dom Clearych dzieliÅ‚a od Wahine odlegÅ‚ość piÄ™ciu mil, nic wiÄ™c dziwnego, że kiedy Meggie zobaczyÅ‚a w oddali sÅ‚upy telegraficzne, nogi, z których opadÅ‚y...Gdy podszedÅ‚ bliżej, zobaczyÅ‚em, że jest mÅ‚ody, dobrze zbudowany, ma pociÄ…gÅ‚Ä…, rumianÄ… twarz, rzadkie, jasne wÄ…sy i wÄ…skie, zaciÅ›niÄ™te usta...poszczególnych oddziałów pobierajÄ…c dokÅ‚adnie ten sam dokument z biblioteki zobaczÄ… tylko dane swojej jednostki! Filtrowanie odbywa siÄ™ automatycznie i...A jednak Jimmy nie pozwoliÅ‚ zgasnąć tej iskierce nadziei, dopóki nie zobaczy ciaÅ‚ai nie bÄ™dzie zmuszony przyznać: „Tak, to ona...Laura wyraźnie powiedziaÅ‚a, że nie zamierza nikogo poÅ›lubić, i z tego, co zobaczyÅ‚, wynikaÅ‚o, że przyczynÄ… jej postanowienia jest niechęć do fizycznego...Z jedzeniem tych zielsk najbardziej trzeba byÅ‚o pilnować siÄ™, żeby nie zobaczyÅ‚ Ott, bo ten cholernie za to biÅ‚...ktoÅ› niespodziewanie zajrzaÅ‚ przez okno, zobaczyÅ‚by zwykÅ‚y kawaÅ‚ek podÅ‚ogi z leżącÄ… na nim nieksztaÅ‚tnÄ… szmatÄ…...Kiedy mnie zobaczyÅ‚, jego ciaÅ‚o przeszedÅ‚ spazm czystego niepokoju i dzikiej radoÅ›ci...ZobaczyÅ‚, że pociski spadajÄ… na nowy, duży warsztat tuż za budynkiem, z którego wybiegali wÅ‚aÅ›nie ludzie...
 

Ludzie pragną czasami się rozstawać, żeby móc tęsknić, czekać i cieszyć się z powrotem.

2, na pasku dialogowym można umieszczać nie tylko przyciski, lecz także inne elementy kontrolne. Dlaczego w takim razie, wiÄ™kszość pro­gramistów caÅ‚y czas stosuje tradycyjne paski narzÄ™dzi? Istnieje ku temu kilka powodów. Po pierwsze, kreator App Wizard automatycznie generuje pasek narzÄ™dzi przy tworzeniu programu. Po drugie, w systemie Windows 3.1 (a także w nieco mniejszym stopniu, w systemie Windows 95) posiadanie paska dialogowego z dużą iloÅ›ciÄ… elementów kontrol­nych w dużym stopniu wyczerpuje zasoby systemu. Standardowe paski narzÄ™dzi zużywajÄ… znacznie mniej zasobów. Ostatnim powodem jest to, że pasków dialogowych nie można zakotwiczyć przy wszystkich krawÄ™dziach okna aplikacji. Wynika to z prostego faktu, że MFC nie wie, w jaki sposób należy obracać wyÅ›wietlane elementy kontrolne (obracanie bitmap jest znacznie prostsze).
Aby zrozumieć, na czym polega problem obracania pasków dialogowych, spróbuj przeciągnąć dowolny pasek narzędzi wyświetlony pod paskiem menu programu (na przykład Developer Studio) i umieścić go przy prawej krawędzi okna. Pasek narzędzi zostanie obrócony, dostosowując się do nowego położenia. Teraz spójrz na rysunek 5.3. Przedstawia on wygląd programu z rysunku 5.2 po przeciągnięciu paska dialogowego i zakotwiczeniu go przy lewej krawędzi okna. Nie jest to ładny widok, prawda?
Aby zapobiec takim sytuacjom, podczas dodawania paska dialogowego Galeria Kom­ponentów umożliwi Ci okreÅ›lenie krawÄ™dzi ekranu, przy której tworzony pasek zostanie umieszczony. Wybranie jednej z krawÄ™dzi spowoduje, iż pasek bÄ™dzie mógÅ‚ być zako­twiczony tylko przy niej lub przy drugiej, równolegÅ‚ej krawÄ™dzi. MusiaÅ‚em zmodyfikować kod umieszczony w klasie CMainFrame, aby móc sporzÄ…dzić rysunek 5.3, gdyż normalne przeciÄ…gniÄ™cie i zakotwiczenie paska przy tej krawÄ™dzi byÅ‚oby niemożliwe.
 
Modyfikowanie pasków narzędzi
Kolejną cechą pasków narzędzi, powodującą, że są one chętniej stosowane niż paski dialogowe, jest udostępnienie możliwości modyfikowania zawartości paska przez użytkownika. No, a przynajmniej coś w tym stylu. Zaraz opowiem całą historię. Otóż starsze wersje MFC udostępniały cały kod potrzeby do tworzenia pasków narzędzi. Nowsze wersje tworzą jedynie “otoczkę" pozwalającą na wykorzystywanie w programie standardowego elementu kontrolnego. To właśnie ten standardowy element kontrolny udostępnia wszystkie narzędzia potrzebne do modyfikowania postaci paska. Jednak ze względu na to, że MFC bardzo się stara, aby obiekty klasy CToolBar wyglądały tak samo jak dotychczas, niezwykle trudno jest udostępnić użytkownikowi narzędzia do modyfikacji paska. Fakt, jest to zadanie trudne, ale nie niemożliwe.
Jakie sposoby modyfikowania pasków narzędzi są dostępne? Otóż istnieją narzędzia pozwalające na przesuwanie przycisków w obrębie paska (należy w tym celu wcisnąć przycisk Shift i przeciągnąć przycisk za pomocą myszki). Jeśli przeciągniesz przycisk poza powierzchnię paska narzędzi i upuścisz, przycisk zniknie. Standardowy element kontrolny udostępnia także specjalne okno dialogowe, które pozwala użytkownikowi dodawać, usuwać oraz zmieniać kolejność przycisków na pasku narzędzi. Dodatkowo paski narzędzi dysponują także metodami pozwalającym na zapisanie ich stanu w rejestrze systemowym i późniejsze jego odtworzenie.
Wszystkie problemy z klasą CToolBar wynikają z faktu, iż jest ona “jednokierunkową otoczką" standardowego elementu kontrolnego. Oznacza to, że klasa ta wykorzystuje klasę CToolBarCtrl (standardowy element kontrolny implementujący pasek narzędzi), jednak jakiekolwiek modyfikacje dokonane na elemencie kontrolnym nie będą zauważone i uwzględnione w obiekcie klasy CToolBar. Z tego właśnie powodu, metody służące do zapisywania i odczytywania postaci paska z rejestru systemowego, są całkowicie bezużyteczne, gdyż po powtórnej inicjalizacji paska, modyfikacje wcześniej w nim dokonane nie zostaną uwzględnione. Jeśli będziesz chciał zapamiętywać i odtwarzać stan paska narzędzi, będziesz musiał stworzyć własne metody umożliwiające poprawne wykonywanie tych operacji.
Umożliwienie wykorzystania innych cech standardowego elementu kontrolnego nie przy­sparza, na szczęście, wiÄ™kszych trudnoÅ›ci. Aby umożliwić modyfikowanie postaci paska, wystarczy nadać oknu standardowego elementu kontrolnego styl CCS_ADJUSTABLE, Nie możesz podać tego stylu podczas tworzenia paska narzÄ™dzi, gdyż MFC stosuje ten sam styl (jego wartość) do zupeÅ‚nie innych celów. Możesz go okreÅ›lić już po stworzeniu paska:
::SetWindowsLong(m_wndToolBar.GetToolBarCtrl().m_hWnd,GWL_STYLE, m_wndToolBar.GetToolBar().GetStyleO |CCS^ADJUSTABLE);
Będziesz także musiał obsługiwać niektóre komunikaty WM_NOTIFY przesyłane z paska narzędzi do okna ramki (lub innego okna, w którym umieszczony jest pasek narzędzi). Procedury obsługi tych komunikatów będziesz mógł bez problemów zdefiniować za pomocą makr ON_NOTIFY umieszczonych w mapie komunikatów. Oczywiście kreator Class Wizard nie będzie miał pojęcia co chcesz zrobić, dlatego też makra te będziesz musiał umieścić w mapie komunikatów samodzielnie.
Pełną listę komunikatów wysyłanych przez paski narzędzi możesz znaleźć w elektronicznej dokumentacji dostarczanej wraz z programem Visual C++. W Tabeli 5.3 przedstawione zostały jedynie te komunikaty, które są istotne z punktu widzenia modyfikowania postaci pasków narzędzi omawianych w tym rozdziale (patrz listing 5.7).
Tabela 5.3. Komunikaty powiadamiania generowane przez paski narzędzi.
Komunikat Opis
TBN_QUERYINSERT Czy użytkownik może wstawić ten przycisk?
TBN_QUERYDELETE Czy użytkownik może usunąć ten przycisk?
TBN_GETBUTTONINFO Pobierz informacje o przycisku i umieść je w strukturze TBNOTIFY.
TBN_RESET Przywróć oryginalną postać paska narzędzi.
TBN_TOOLBARCHANGE Pasek narzędzi został zmodyfikowany.
 
Listing 5.7. Ramka z paskiem narzędzi pozwalającym na modyfikacje swojej postaci.