Microsoft Visual C++
Typy aplikacji okna dialogowe
Typy aplikacji Multiple Document
Obsługa zdarzeń - komunikaty W celu obsługi zdarzeń pochodzących z wielu źródeł funkcja MainLoop odbiera komunikaty systemowe i wywołuje funkcje napisane przez użytkownika System generuje komunikaty o: zdarzeniach związanych z klawiaturą (wciśnięciu klawisza) zdarzeniach związanych z myszy (ruchu myszki, wciśnięciu/zwolnieniem przycisku zmianą rozmiaru okna przesłonięciem, koniecznością przerysowania Mysz Klawiatura SYSTEM OPERACYJNY komunikat Program Mysz() Klawisz() MainLoop Przerysuj()
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 każdej 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.
Aplikacje wielookienkowe W VC istnieje mozliewość tworzenia aplikacji złozonej z dowolnej liczby róznych okien. Każde okno jest opisane poprzez projekt formularza oraz dedykowaną mu klasę Wyświetlenie okna modalnego polega na zadeklarowaniu obiektu klasy tegoż okna, a następnie na wywołaniu metody DoModal()
Aplikacje Wielookienkowe {//... kod metody pewnego okna CMojeOkno okno; //deklaracja nowego okna int res=okno.domodal(); //wyswietlenie okna if(res==idok) { //uzytkownik w wyswietlonym oknie wciasnal OK }
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[];