index9910




[Kurs Allegro GUI, C++] VI. Pozostałe mechanizmy GUI

var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));


var pageTracker = _gat._getTracker("UA-3650348-1");
pageTracker._initData();
pageTracker._trackPageview();



Serwis został przeniesiony pod nową domenę: http://cpp0x.pl/ Strona główna Kursy Artykuły Forum Pliki Promuj Nas! PowrótHistoria odwiedzonych stronPoprzednia lekcjaKurs Allegro GUI, C++ VI. Pozostałe mechanizmy GUI6.1. Co jeszcze potrafi zrobić podsystem GUI?Cóż, już prawie skończyliśmy. Pozostało jeszcze kilka rzeczy do omówienia. Znaczna część z nich jest opisana tak samo jak w dokumentacji.extern DIALOG* active_dialog;Jest to globalny wskaźnik do aktualnie aktywnego okna, lub jeżeli nie ma aktywnych okien, to wskazuje on na ostatnio aktywne okno. Może się to okazać bardzo użyteczne w procedurach okien dialogowych, w przypadku gdy obiekt ma potrzebę skomunikowania się z innymi obiektami w tym samym oknie. extern MENU *active_menu;Jeżeli procedura menu została wywołana, to zmienna ta będzie wskazywała na  pozycję w menu, która ją uruchomiła. Dzięki temu wywołana procedura może ustalać skąd została wywołana.GUI dostarcza również kilka pomocnych funkcji, które czynią życie łatwiejszym dla jego użytkowników. Wymienię je po prostu tutaj:int do_dialog(DIALOG *dialog, int focus_obj);Jest to główne jądro GUI. Wyświetla ono okno na ekranie i przekazuje do niego sterowanie za pomocą parametru focus_obj. (przekaż wartość -1 jeżeli nie chcesz aby jakiś obiekt otrzymał sterowanie). Okno dialogowe będzie kontynuować swoje działanie dopóki jedna z procedur okienkowych w tablicy nie powie menedżerowi GUI aby je zamknął. Funkcja ta zwraca indeks do obiektu w tablicy, który spowodował zamknięcie okna.int popup_dialog(DIALOG *dialog, int focus_obj);Funkcja ta jest prawie taka same jak wcześniej omawiana do_dialog() z wyjątkiem tego, że przechowuje ona tło i przywraca je po powrocie. Funkcja ta używa pierwszego obiektu okna z tablicy, aby obliczyć wymiary obszaru do przechowania tła więc upewnij się, że wszystkie inne obiekty są wewnątrz niego. int broadcast_dialog(int msg, int c);Funkcja ta przesyła daną wiadomość do wszystkich obiektów w bieżącym oknie. Parametr c jest przekazywany do procedur okienkowych w przypadku gdyby go do czegoś go potrzebowały. Funkcja zwraca D_O_K chyba, że jeden z obiektów w oknie zwraca coś innego. W tym przypadku to coś innego zostanie zwrócone przez tą funkcję.int dialog_message(DIALOG *dialog, int msg, int c, int *obj)Ta funkcja jest taka jak broadcast_dialog() z tym, że możesz jej powiedzieć, [which dialog to send the message to]. Zwracana wartość jest taka sama jak dla broadcast_dialog(). W przypadku gdy funkcja zwraca coś innego niż D_O_K, obj będzie wskazywał na indeks obiektu, który zwrócił tą wartość.int gui_textout(BITMAP *bmp, unsigned char *s, int x, int y, int color, int center)W ten sposób obiekty GUI wyświetlają swoje łańcuchy tekstowe. Funkcja ta jest jak texout(), z wyjątkiem tego, że każde wystąpienie znaku '&' w łańcuchu jest interpretowane tak, że następny znak powinien być podkreślony. Jeżeli center ma wartość TRUE, wtedy łańcuch będzie wyśrodkowany [about the x-coordinate]. Zwrócona wartość jest szerokością wyświetlonego łańcucha w pikselach.int gui_strlen(unsigned char *s)Ta funkcja jest podobna do funkcji text_length() , tylko ona zawsze używa czcionki wskazanej przez globalnego wskaźnika czcionek. Ignoruje znaki ’&’, ponieważ nie dodają się one do długości łańcucha. Wartość jest zwracana w pixelach. Ta funkcja może  być użyteczna do określania tego jak duży obiekt(albo części obiektu) ma być. Jest również użyteczny do wyrównywania rzeczy.void centre_dialog(DIALOG *dialog)To przenosi każdy obiekt do środka danego okna  tak, że okno jest wyśrodkowane na ekranie. Zwróć uwagę na brytyjską pisownię centre.void set_dialog_color(DIALOG *dialog, int fg, int bg)Ta funkcja zmienia kolory fg i bg dla każdego obiektu w danym oknie. Jest to naprawdę przydatne kiedy chcesz zmienić schemat kolorów GUI on-the-fly.int find_dialog_focus(DIALOG *dialog)To zwraca wskaźnik w tablicy obiektu wraz z wejściem ostrości. Jeżeli żaden obiekt nie posiada ostrości , zwraca-1. Jest to fajne wtedy gdy wyświetlasz okno za n-tym razem i chcesz nadać taką ostrość dla obiektu jaką miał poprzednio. Żeby to zrobić trzeba przywołać do_dialog(the_dialog, find_dialog_focus(the_dialog)).Następujące funkcje zapewniają dostęp niższego poziomu do  funkcjonalności odtwarzania okien. Możesz używać ich jeżeli chcesz zintegrować okna ze swoją metodą kontrolowania programu.DIALOG_PLAYER *init_dialog(DIALOG *dialog, int focus_obj)[This function initializes a dialog and returns a pointer to a player object that you can use with the next two functions.]int update_dialog(DIALOG_PLAYER *player)Ten algorytm aktualizuje odtwarzacz okien zwrócony przez int_dialog(). Jeżeli zwrócona wartość to TRUE  , okno jest aktywne. Jeżeli zwraca FALSE, okno zostało poproszone aby zostało zamknięte. Kiedy to się stanie możesz zobaczyć, który obiekt poprosił o zamknięcie poprzez patrzenie na player->obj.int shutdown_dialog(DIALOG_PLAYER *player)To ściera okno odtwarzacza obiektu utworzone przez int_dialog(). Zwraca wskaźnik obiektu, który spowodował zamknięcie okna( tak samo jak do_dialog()). Używając  tych funkcji, możesz utworzyć swój własny odtwarzacz okien. Dokumentacja dostarcza prosty przykład:int my_do_dialog(DIALOG *dialog, int focus_obj) {  void *player = init_dialog(dialog, focus_obj);  while (update_dialog(player))  ;  return shutdown_dialog(player);}Jest kilka pomocniczych funkcji, które są na tyle przewspaniałe, że zasługują na oddzielne omówienie. Są to: skrzynki wiadomości, wybieranie trybu graficznego i selektor plików. 6.2. Message BoxesWszystkie GUI wspomagają pewny rodzaj skrzynek wiadomości, i w przypadku Allegro GUI nie jest inaczej. Istnieją dwie funkcje stworzone do dostarczania opinii lub odbierania danych użytkownika poprzez skrzynki wiadomości.int alert(char *s1, *s2, *s3, *b1, *b2, int c1, c2)To jest zwyczajna skrzynka wiadomości. Może zawierać  do trzech linijek tekstu danych w s1,s2 i s3( każde z tych, które mogą być NIEWAŻNE). Upewnij się, że te linijki nie są za długie albo w przeciwnym wypadku okno będzie wyglądać bardzo dziwnie!Parametry b1 i b2 przetrzymują nagłówki tekstu dla dwóch klawiszy( jeżeli b2 jest NIEWAŻNY, wtedy będzie tylko jeden przycisk).Parametry c1 i c2 zawierają  skróty przycisków opcjonalnej klawiatury. Ta funkcja zwraca 1 lub 2 zależnie od tego,który przycisk został wciśnięty. Jeżeli klawisz Esc nie jest skrótem klawiatury, wtedy jest traktowany jako kliknięcie na klawisz 2(Tak jak proste"OK,zamknij" okno) jeżeli jest naciśnięty.int alert3(char *s1, *s2, *s3, *b1, *b2, *b3, int c1, c2)To jest bardzo podobne do alert() powyżej nie licząc tego, że ma trzy przyciski i zwraca 1,2 lub 3.Dla przykładu powiedzmy, że próbujesz dostać się do pliku, ale nie jest on znaleziony. Mógłbyś zrobić coś następującego:sprintf(err_msg, "Error opening %s!", file_name);ret = alert(err_msg, "What will you do?", NULL,"Abort", "Retry", 0, 0);if (ret == 1)do_abort();elsedo_retry();Te okna nie są zbyt elastyczne. Ich główną wadą jest to, że  mogą wyświetlić co najwyżej 3 linijki tekstu. Jeżeli uważasz to za duży brak możesz zawsze stworzyć swoje własne. 6.3. Dialog wyboru trybu graficznegoAllegro Wspiera wiele uchwał wideo i głębi kolorów. Często jest praktycznie pozwolić użytkownikowi wybrać w jaki trybie wideo program powinien się uruchomić.Tworzenie okna pełnego wszystkich możliwych wyborów byłoby raczej wątpliwe.Na szczęście Allegro przychodzi nam z pomocą  razem z gotowym oknem do wybierania trybów.int gfx_mode_select(int *card, int *w, int *h)int gfx_mode_select_ex(int *card, int *w, int *h, int *color_depth) Te dwa algorytmy wyświetlają okno do wyboru trybu wideo. Kiedy zwraca, parametry zostaną  wypełnione kartą graficzną, uchwałą i dla gfx_mode_select_ex()głębokością kolorów. Zwracają zero jeżeli użytkownik zamknął  je poprzez anulowanie jeżeli użytkownik wcisnął ok nie zwraca ono zero.[The gfx_mode_select_ex() function reads the parameters when it initializes, so you can suggest default values if you like.]Here's an example:int c, w, h, depth;int ret, mode_failure;/* supply defaults */c = GFX_AUTODETECT;w = 800;h = 600;depth = 24;/* ask the user */ret = gfx_mode_select_ex(&c, &w, &h, &depth);if (ret) {  /* try to set the mode */  set_color_depth(depth);  mode_failure = set_gfx_mode(c, w, h, 0, 0);  /* if it didn't work */  if (mode_failure) {    allegro_exit();    fprintf(stderr, "Couldn't set mode: %s",    allegro_error);    exit(1);  }}Upewnij się, że zawsze sprawdzasz zwrócona wartość z tych funkcji(i set_gfx_mode() także)! 6.4. File Chooser DialogFinally, we come to the file chooser dialog. This provides an easy way for Allegro programs to provide file names for loading or saving files.int file_select(char *message, char *path, char *ext)Calling this function displays the selector. The dialog caption is given in the "message" parameter. The starting path is provided in "path," and the files are filtered according to the contents of the "ext" string. If ext is NULL, then the dialog shows all files. If you want to show only certain files, pass the extensions of the files you want to show, separated by semicolons. It returns zero if the user pressed Cancel, and non-zero if the user pressed OK.The filename chosen is returned in the path string, so there had better be enough room. Make it at least 80 characters long.Here's an example:char path[] = "c:/djgpp/allegro/examples";/* show only .PCX, .BMP, and .TGA files */ret = file_select("Save As...", path, "PCX;BMP;TGA");if (ret)save_file(path);elsedo_not_save_file();One of the main problems with this (and the gfx_mode_select dialog) is that it only uses the default Allegro GUI objects. There is currently no way to hook into the dialogs and change their appearances, aside from chopping the code out of the Allegro source and using your own GUI objects. 6.5. Concluding RemarksWell, you've survivied the tutorial. I hope it wasn't too boring and verbose.I started out with the idea that this would be a real "clinic" of sorts. Hence the name of the tutorial. But, I never got around to giving Doctor Inanis a voice, and he pretty much ended up on the title page and stayed there. He never did anything. I suppose he's like the Beatles' Sergeant Pepper that way. Oh, well. I like his picture.If you have any questions, comments, suggestions, or the like, please contact me.The tutorial in earnest is over, but as a bonus, I've take the three GUI examples from the Allegro distribution and annotated them. Sometimes, just having the source in front of you isn't enough. Hopefully, these appendices will make things clearer.Again, thanks for reading, and Happy Programming!6.7. TłumaczenieGłówne tłumaczenie tekstu zostało wykonane przez Saint'a. Weryfikację tłumaczenia, drobne korekty w tłumaczeniu oraz poprawę niektórych zdań pod kątem gramatycznym wykonał Piotr Szawdyński. Przetłumaczonego tekstu nie można rozpowszechniać bez zgody osób, które go przetłumaczyły.6.8. Pozostałe informacjeMateriał został pobrany ze strony http://agdn.netfirms.com/main/gui/completing.html po uprzednim uzyskaniu zgody od jego autora. Autor materiałów dał pozwolenie na wykonanie tłumaczenia kursu do dowolnego języka i jego publikacji na łamach serwisu ddt.pl. Oryginalna wersja tekstu powstała w języku angielskim i została ona napisana przez Revin'a Guillen'a.Poprzednia lekcjaKurs Allegro GUI, C++ Wszelkie prawa zastrzeżone. Autor: źródło zewnętrzneWszystkie teksty są chronione prawami autorskimi. Kopiowanie lub rozpowszechnianie treści bez wyraźnej zgody jego autora jest zabronione.PowrótHistoria odwiedzonych stronPanel LogowaniaLogin:Hasło:Zapamiętaj mnie!Zarejestruj sięOdzyskiwanie hasłaUżytkownikówObecnie aktywnych:6Zalogowanych:0Zarejestrowanych:4367Ostatnie 24h:501Non-cookie 24h:1505Wszystkich:264704Ostatnia Aktualizacja2010-11-23 00:46:20 (38 dni temu)Ostatnio aktywniHandy905 godzPiotr Szawdyński7 godzFletcher23 godzwiew25 godzPietrzuch25 godzmat250134 godzbooncki37 godzRaver59 godzWynajem Sopot - wakacjePokój 2 osobowy 130zł/doba;Lokalizacja: Sopothttp://sopotwynajem.pl


O portaluArchiwumHistoriaIndeksRegulaminWyszukiwarkaLinkiRestauracja "ATOL" - Sopot© Wszelkie prawa zastrzeżone   2005-2010Czas wygenerowania strony: 0.057sAutor: Piotr Szawdyński





Wyszukiwarka

Podobne podstrony:
index9527
index971a
index9203
index984c
index9866
index9122
index90df
index96cc

więcej podobnych podstron