260 likes | 443 Views
Microsoft Visual C++. Typy aplikacji – okna dialogowe. Typy aplikacji – Multiple Document. Komunikacja w Windows komunikaty. Komunikaty okna: WM_CREATE, WM_INIT, WM_WM_CLOSE, WM_KILLFOCUS, WM_ACTIVATE, WM_MOVE Komunikaty myszy: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONCLIC,
E N D
Komunikacja w Windows komunikaty • Komunikaty okna: • WM_CREATE, WM_INIT, WM_WM_CLOSE, • WM_KILLFOCUS, WM_ACTIVATE, WM_MOVE • Komunikaty myszy: • WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONCLIC, • WM_MOUSEMOVE, WM_MOUSEWHEEL • Komunikaty klawiatury: • WM_KEYDOWN, WM_KEYUP, WM_CHAR
Komunikacja w Windows komunikaty cd. • Komunikaty przycisku • BN_CLICKED, BN_DOUBLECLICKED, BN_SETFOCUS • Komunikaty listy: • LBN_SELCHANGE, LBN_DBCLICK • Komunikaty Timera: • WM_TIMER
Elementy składowe okna • Projekt okna dialogowego (interface’u) jest odsprzęgnięty od obiektów i klas aplikacji. • Każdy element okna opisywany jest przez szereg cech – właściwości: • ID -identyfikator komponentu (Etykieta, której przypisana jest liczba) • Caption – napis widoczny na ekranie (o ile komponent na to pozwala
Zmienne skojarzone (member variable) • Każda aplikacja ma szereg klas. Część z nich są skojarzone z oknami dialogowymi, dokumentami, widokami i aplikacją. • Każde okno dialogowe ma skojarzoną z nim klasę pochodzącą od klasy CDialog • Każdy widok dokumentu ma skojarzoną z nim klasę pochodzącą od CView • Wewnątrz tych klas mogą znajdować się deklarację atrybutów (zmiennych, które są skojarzone z elementami okna)
Zmienne skojarzone cd. • Wyróżnia się 2 typy zmiennych skojarzonych z komponentami okna • Control – pozwalające na sterowanie elementem okna (ukrywanie, zmianę ustawień, oraz dostęp do wartości) • Value – zmienna przechowująca wartość danego elementu
Synchronizacja zmiennych skojarzonych • Okno jest w pewien sposób odsprzęgnięte od obsługującej go klasy. • Stan zmiennych skojarzonych jest synchronizowany z zawartością okna w metodzie DoDataExchange • Metoda ta wywoływana jest pośrednio przez metodę: • UpdateData(true);// gdy należy ukatualnić wartości zmiennych na podstawie wartości w oknie dialogowym • UpdateData(false); //gdy należy uaktualnić zawartość okna dialogowego na podstawie wartości zmiennych
Klasa kontrolująca stan listy • Do obsługi listy służy klasa CListBox • Obiekt (m_lista) klasy CListBox ma następujące metody: • int idx=m_lista.AddString(„napis”); //dodaje napis, zwraca pozycję na liście • m_lista.DeleteString(n); //usuwa napis nr n z listy • idx=m_lista.GetCurSel(); //Zwraca nr aktualnie podswietlonego napisu • int MAX=m_lista.Count(); //zwraca ilosc elementow na liscie
Inne klasy MFC • Klasa do obsługi łańcuchów tekstowych CString napis; napis=„tekst”; • Klasa punktu CPoint – przechowuje pozycję: CPoint a(3,5); //punkt x=3, y=5 a.x=6; //punkt x=6, y=5 • Bitampa CBitmap bt; bt.LoadBitmap(„Nazwa”); bt.LoadBitmap(ID_ZASOBOW);
Rysowanie – kontekst okna • Kontekst jest obiektem, który umożliwia rysowanie i wyświetlanie w obszarze okna, które zostało z nim skojarzone. • Stworzenie kontekstu (wewnątrz klasy pochodzącej od CView lub CDialog: CClientDC kontekst(this); Metody klasy CClientDC: Kontekst.MoveTo(x,y); Kontekst.LineTo(x,y); Kontekst.TextOut(x,y,”napis”);
Konteksty pamięciowe • Są wykorzystywane w celu przygotowania rysunku w pamięci, a następnie można go wyświetlić w pewnym oknie w zadanej lokalizacji jeśli zdefiniowane jest pole klasy: CBitmap Buffor; to można wykonać następujące operacje: CClientDC Kontekst(this); //tworzy kontekst okna CDC MemDC; //obiekt kontekstu pamięciowego Buffor.CreateCompatibileBitmap(&Kontekst,szerokosc,wysokosc); //tworzy bitmape o rozdzielczosci i ustawieniach takich jak kontekst okna MemDC.CreateCompatibileDC(&Kontekst); //Tworzy kontekst pamięciowy kompatybilny kontekstem okna MemDC.SelectObject(&Buffor); //powiązanie bufora z kontekstem pamięciowym MemDC.LineTo(10,10); //rysowanie w kontekście pamięciowym; Kontekst.StretchBlt(poz_x,poz_y,szer,wys,&MemDC,poz_x_źr, poz_y_źr,szer_x_źr, szer_y_źr,SRCCOPY); //wyświetla kontekst pamięciowy na ekranie
Przerysowywanie okien • Każde okno gdy jest ukryte, przysłonięte, lub gdy zmienia się jego rozmiar, wymaga przerysowania. • Wszystkie obiekty widoczne w oknie muszą być rysowane w metodzie: • OnPaint (gdy okno pochodzi z klasy CDialog) • OnDraw (gdy okno pochodzi z klasy CView) • Przerysowanie okna może być wymuszone przez wywołanie metody: Invalidate();
Komendy (menu, przyciski, skróty) • Każda komenda w aplikacji może być wowyłwana z: • menu • tzw. toolbox’u • za pomocą skrótu klawiszowego (accelerator) • W Visual C z dla kadej komendy tworzy się odpowiedni identyfikator (np. przez dodanie pozycji menu, a następnie ten sam identyfikator przypisuje się ikonce (toolbar) lub klawiszowi skrótu (accelerator) • Po wybraniu odpowiedniej pozycji z menu generowany jest komunikat (message) • Obsługa takiego komunikatu może znajdować się w dowolnej klasie aplikacji.
Wyświetlanie komunikatów • Dla MFC dowyświetlania okien komunikatów o błędach, ostrzeżeń i pytań wykorzystuje się funkcię int wynik=AfxMessageBox(„komunikat”,typ,0); gdzie typ określa typ okna: • MB_ABORTRETRYIGNORE • MB_OK • MB_OKCANCEL • MB_RETRYCANCEL • MB_YESNO • MB_YESNOCANCEL Wynik jest zależny od typu wciśniętego przycisku
Praca równoczesna - Timer • Inicjacja: SetTimer(nr,T,NULL); //nr – numer Timera 0-65535, T – czas w [ms] //Musi być wykonana po stworzeniu okna dialogowego lub widoku (powinna się znajdować bądź w metodzie OnInitialUpdate, lub OnInitDialog) • Należy skojarzyć komunikat WM_TIMER z odpowiednią funkcją która będzie wywoływana cyklicznie co T [ms]
Praca równoczesna - wątki • Watek jest pewną częścią programu, która wykonywana jest równocześnie (współbieżnie) z programem głównym. • Funkcja wątku (działa analogicznie jak funkcja main programu głównego ma następującą definicję: UINT FunkcjaWatku(LPVOID dane) { //kod watku…. }
Wątki cd… • Gdzie argument dane są typu void*, (dowolny wskaźnik) • Kod uaktywniający wątek: CWinThread *watek; watek = AfxBeginThread( FunkcjaWatku, (LPVOID)&dane)); gdzie drugi argument jest w wskaźnikiem do dowolnej zmiennej lub obiektu
Metody CWinThread • watek->SuspendThread(); //zatrzymuje (usypia) wątek; • watek->ResumeThread(); //Aktywuje wątek z uśpienia • watek->AfxEndThread(ExitCode); //wymusza zakończenie wątku z kodem (ExitCode)
Pożyteczne funkcje • Operaceje na plikach: • CreateFile //stworzenie otwarcie pliku (również portu RS232) • CloseHandle //zamknięcie pliku • ReadFile • WriteFile
Pożyteczne funkcje • Konwersja • atoi //char[]->int • atof //char[]->float • itoa //int ->char[] • ftoa //float -> char[];
Tematy projektów • Aplikacja do dystrybucji informacji wewnątrz grupy osób • Karta dźwiękowa jako oscyloskop • Aplikacja do wizualizacji i komunikacji z oscyloskopem i multimetrem (za pomocą łącza RS232) + moduł do przesyłąnia danych przez sieć • Aplikacja do wizualizacji pulpitu na innych komputerach
Tematy projektów 2 • Aplikacja do zaawansowanego wyświetlania i przetwarzania danych pomiarowych (prezentacja wykresów, wydruki+komunikacja z excelem i wordem (DDE)) • Organizer dla wielu użytkowników, z możliwością wysyłania powiadomień na maila
Tematy 3 • Wyścigi samochodowe (sieć) • Karty np. makao etc. (cała grupa) ok. 5 różnych gier • Gra planszowa (np. Monopol)(sieć)
Fazy projektowania • Zawiązanie się grupy i wybór lidera • Słowny opis reguł i elementów aplikacji • Z opisu należy wyodrębnić rzeczowniki (na ich bazie stworzyć listę potrzebnych obiektów) • Z opisu wyodrębnić przymiotniki i czasowniki i przypisać je do konkretnych obiektów jako ich metody • Dokonać szkiców elementów graficznych: plansz, okien itp. • Po raz drugi dokonać przeglądu obiektów pod katem ich funkcji, (co będą robić, jak mają wyglądać) na podstawie tej analizy poszerzyć listę metod i właściwości. • Stworzyć nagłówki klas i podzielić zadania • Zaimplementować poszczególne metody.