1.1. Programowanie w Visual C++ Programowanie w Visual C++ Środowisko programisty Visual C++ Środowisko programisty Visual C++



Podobne dokumenty
Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

Microsoft Visual C++

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Programowanie na poziomie sprzętu. Programowanie w Windows API

Delphi podstawy programowania. Dialogi

Tworzenie okna dialogowego w edytorze raportu SigmaNEST. część 1

Lista wprowadzonych zmian w systemie Vario v. 3.3 od wydania do wydania

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Praca w środowisku Visual Studio 2008, Visual C

Microsoft Visual C : praktyczne przykłady / Mariusz Owczarek. Gliwice, cop Spis treści

Zaawansowane środowiska programistyczne 2009/2010

Podstawy wykorzystania bibliotek DLL w skryptach oprogramowania InTouch

1.1. System otwartych baz danych ODBC. System otwartych baz danych ODBC. Interfejs ODBC. Interfejs ODBC. System otwartych baz danych ODBC

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

16) Wprowadzenie do raportowania Rave

1. Przypisy, indeks i spisy.

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Programowanie w środowisku graficznym GUI

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wykład 5 Okna MDI i SDI, dziedziczenie

Zaawansowane aplikacje internetowe - laboratorium

Nieskonfigurowana, pusta konsola MMC

Plan. Aplikacja. Architektura aplikacji. Architektura aplikacji Tworzenie aplikacji Application Builder podstawy

Laboratorium 1 - Programowanie proceduralne i obiektowe

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

Użycie Visual Basic for Applications ("VBA")

Szybkie tworzenie grafiki w GcIde

Dodanie nowej formy do projektu polega na:

Laboratorium 7 Blog: dodawanie i edycja wpisów

Wprowadzenie do biblioteki klas C++

Samsung Universal Print Driver Podręcznik użytkownika

1. Opis okna podstawowego programu TPrezenter.

1. Opis. 2. Wymagania sprzętowe:

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Programowanie obiektowe

3.4. Opis konfiguracji layoutów.

mgr inż. Tomasz Jaworski Klasy graficzne GDI 1. Interfejs urządzeń graficznych (GDI) 2. Kontekst urządzenia

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

LABORATORIUM 6: ARKUSZ MS EXCEL JAKO BAZA DANYCH

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania KOMPUTEROWE SYSTEMY STEROWANIA (KSS)

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Zaawansowane aplikacje WWW - laboratorium

I. Spis treści I. Spis treści... 2 II. Kreator szablonów Tworzenie szablonu Menu... 4 a. Opis ikon Dodanie nowego elementu...

Zadanie1: Odszukaj w serwisie internetowym Wikipedii informacje na temat protokołu http.

Celem ćwiczenia jest zapoznanie się z podstawowymi funkcjami i pojęciami związanymi ze środowiskiem AutoCAD 2012 w polskiej wersji językowej.

Programowanie Obiektowe GUI

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Tworzenie prezentacji w MS PowerPoint

Programowanie obiektowe

Menu Plik w Edytorze symboli i Edytorze widoku aparatów

Delphi podstawy programowania. Środowisko Delphi

Pliki wchodzące w skład projektu Rozmiar formatki, okna. Wyświetlanie okien komunikatów Rzutowanie Konwersja Tworzenie standardowych przycisków

Instrukcja użytkownika

Synchronizator plików (SSC) - dokumentacja

Wybór urządzenia/ Scanner Selection Screen: Skrócony Opis Programu MetroSet 2

1. Dodawanie integracji

Lokalizacja jest to położenie geograficzne zajmowane przez aparat. Miejsce, w którym zainstalowane jest to urządzenie.

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

IFiZR Laboratorium 5 Info

Ustawienia personalne

Programowanie obiektowe

Dodawanie grafiki i obiektów

etrader Pekao Podręcznik użytkownika Strumieniowanie Excel

PWI Instrukcja użytkownika

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Advance CAD 2016 SP2. W tym dokumencie opisano ulepszenia w Advance CAD Service Pack 2. Co nowego w Advance CAD 2016 SP2

Dodawanie i modyfikacja atrybutów zbioru

Aplikacje WWW - laboratorium

System Informatyczny CELAB. Terminy, alarmy

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Podstawowe kontrolki graficzne. Obsługa plików poprzez kontrolki

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

Kierunek: ETI Przedmiot: Programowanie w środowisku RAD - Delphi Rok III Semestr 5. Ćwiczenie 5 Aplikacja wielo-okienkowa

Programowanie obiektowe

JLR EPC. Szybki start. Spis treści. Polish Version 2.0. Przewodnik krok po kroku Przewodnik po ekranach

Access - Aplikacja. Tworzenie bazy danych w postaci aplikacji

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.3

Modelowanie obiektowe - Ćw. 1.

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Podręcznik użytkownika Obieg dokumentów

ROZDZIAŁ I. BUDOWA I FUNKCJONOWANIE KOMPUTERA PC

Moduł Handlowo-Magazynowy Przeprowadzanie inwentaryzacji z użyciem kolektorów danych

Informatyka Edytor tekstów Word 2010 dla WINDOWS cz.3

Programowanie obiektowe zastosowanie języka Java SE

Instrukcja obsługi funkcji specjalnych szablonu C01 v.1.0

Programowanie obiektowe

BAZY DANYCH MAKRA I PRZYCISKI. Microsoft Access. Adrian Horzyk. Akademia Górniczo-Hutnicza

Wstęp 7 Rozdział 1. OpenOffice.ux.pl Writer środowisko pracy 9

Podstawy programowania skrót z wykładów:

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI

Implementacja aplikacji sieciowych z wykorzystaniem środowiska Qt

Przewodnik po obszarze roboczym

2. Podstawy narzędzia Application Builder, budowa strony, kreatory aplikacji

Laboratorium z Grafiki InŜynierskiej CAD. Rozpoczęcie pracy z AutoCAD-em. Uruchomienie programu

Transkrypt:

1 Katedra Optoelektroniki i Systemów Elektronicznych 2 Programowanie w Organizacja i Oprogramowanie Systemów Elektronicznych Temat wykładu Programowanie w 1. Środowisko programisty 5. 6. 3 Środowisko programisty 4 Środowisko programisty Paski narzędzi Widok klas (Class View) pozwala przeglądać kod źródłowy i manipulować na poziomie klas języka C++. Obszar roboczy (Workspace) Obszar edycji Obszar roboczy Obszar komunikacji z użytkownikiem (Output) 5 Środowisko programisty 6 Środowisko programisty Widok zasobów (Resource View) pozwala odnaleźć i edytować każdy element wchodzący w skład tworzonej aplikacji: - okna dialogowe, -ikony, - system menu, - tablice znaków. Widok zbiorów (File View) pozwala przeglądać wszystkie pliki, które wchodzą w skład tworzonej aplikacji: -pliki źródłowe, - pliki nagłówkowe, - pliki zasobów. Obszar roboczy Obszar roboczy 1.1

7 Środowisko programisty 8 Środowisko programisty Obszar edycji Obszar edycji Obszar edycji W obszarze edycji wyświetlane jest okno edycji kodu, kiedy dokonywane są zmiany w kodzie źródłowym. W obszarze edycji wyświetlane jest również okno edytora dialogów, gdy projektowane jest okno dialogowe. 9 Środowisko programisty 10 Kreator aplikacji Obszar komunikacji z użytkownikiem (Output) Obszar komunikacji z użytkownikiem dostarcza danych na temat postępów kompilatora, ostrzeżenia i komunikaty obłędach. Debugger wyświetla w tym miejscu aktualne wartości zmiennych podczas wykonywania programu krok po kroku. Kreator aplikacji (ctrl-n) umożliwia utworzenie szkieletu aplikacji. W zależności od rodzaju aplikacji w kolejnych krokach kreator pyta o określoną liczbę cech jakimi będzie się charakteryzować tworzona aplikacja. 11 Programowanie w 12 Projektowanie okna aplikacji 1. Środowisko programisty 5. 6. Tekst statyczny Ramka grupująca Pole wyboru Lista rozwijalna pasek przewijania Przycisk pokrętła Suwak Okno listy Okno karty Tekst formatowalny Kalendarz miesięczny Obraz Pole tekstowe Przycisk polecenia Przycisk opcji Pole listy pasek przewijania Pasek postępu Klawisz skrótu Struktura drzewiasta Animacja Pole czasu/daty Adres IP Rozszerzony obiekt kombi Projektując okno aplikacji umieszczamy na panelu obiekty kontrolne korzystając z palety edytora dialogów. 1.2

13 Projektowanie okna aplikacji 14 Projektowanie okna aplikacji Edycja pól właściwości obiektów kontrolnych. Push Button Edycja pól właściwości obiektów kontrolnych. Dialog 15 Projektowanie okna aplikacji 16 Dodawanie menu Ustalanie porządku poruszania się zgodnego z klawiszem Tab. Menu: Layout/Tab order (ctrl-d) 17 Dodawanie menu 18 Programowanie w 1. Środowisko programisty 5. 6. 1.3

19 Wykorzystanie kreatora klas 20 Wykorzystanie kreatora klas Kreator klas (Class Wizard) (ctrl-w) jest narzędziem pozwalającym na przypisywanie obiektom kontrolnym zasad funkcjonowania: 1. Tworzenie tablicy zdarzeń (komunikatów), generowanych przez Windows, które budowana aplikacja będzie w stanie przyjąć. 2. Dodawanie do aplikacji zmiennych i funkcji obsługujących obiekty kontrolne. Kreator klas umożliwia ponadto szybką nawigację po funkcjach obsługujących obiekty kontrolne. Dołączanie zmiennych do obiektów kontrolnych Korzystając z kreatora klas należy przyporządkować zmienną każdemu obiektowi kontrolnemu, który będzie przechowywał jakąś wartość (wyjątkiem są teksty statyczne i przyciski poleceń). Zadaniem zmiennych przypisanych kontrolkom jest przechowywanie wartości tych kontrolek. Wpisując wartości do zmiennych możemy aktualizować wartości kontrolek. Odczytując wartości zmiennych możemy odczytywać wartości wpisane przez użytkownika w obiekty kontrolne. 21 Operowanie na zmiennych kontrolnych 22 Operowanie na zmiennych kontrolnych Zmienne obiektów kontrolnych Kluczową funkcją, przy pracy ze zmiennymi obiektów kontrolnych, jest UpdateData (odśwież dane). Funkcja ta ma jeden parametr typu Boolean (TRUE/FALSE). Jeżeli wartością argumentu jest FALSE to funkcja ta pobiera wartości przechowywane w zmiennych i wyświetla je (odświeża) na ekranie. Jeżeli wartością argumentu jest TRUE to funkcja pobiera wartości z obiektów kontrolnych i umieszcza je w odpowiednich zmiennych. Widoczność obiektu kontrolnego w oknie dialogowym można zmieniać funkcją ShowWindow. ShowWindow(TRUE) pokaż obiekt, ShowWindow(FALSE) ukryj obiekt Dostępność obiektu kontrolnego można zmieniać funkcją EnableWindow. EnableWindow(TRUE) udostępnij obiekt EnableWindow(FALSE) nie udostępniaj obiektu W celu zmiany właściwości kontrolki w trakcie pracy aplikacji można wykorzystać funkcję GetDlgItem(ID), która zwraca wskaźnik do kontrolki o identyfikatorze ID, np.: //Uaktywnienie kontrolki IDC_WSC GetDlgItem(IDC_WSC)->EnableWindow(TRUE); //Ukrycie kontrolki IDC_WTLWSC GetDlgItem(IDC_WTLWSC)->ShowWindow(FALSE); Jeśli jednak z kontrolką zwiążemy zmienną typu kontrolnego Control, wówczas zmianę parametrów można uzyskać odwołując się bezpośrednio do zmiennej typu Control, np.: class CProgramDlg : public CDialog { public: CButton m_start; ; m_start.enablewindow(false); 23 Programowanie w 24 Praca z timerami 1. Środowisko programisty 5. 6. Utworzenie timera wiąże się z nadaniem mu pewnego identyfikatora, który może być dowolną wartością całkowitą. Aplikacja używa tego identyfikatora do określania, który timer został wyzwolony, jak również do uruchamiania i zatrzymywania timerów. 1.4

25 Praca z timerami 26 Praca z timerami Każdorazowe wyzwolenie timera powoduje wygenerowanie komunikatu WM_TIMER. Używając Kreatora klas, można dodać funkcję, która będzie obsługiwać to zdarzenie. Funkcje obsługi timera: Uruchomienie timera: UINT SetTimer( UINT nidevent, UINT nelapse, void (CALLBACK EXPORT* lpfntimer)(hwnd, UINT, UINT, DWORD)); nidevent identyfikator Timera nelapse częstość generowania komunikatu WM_TIMER lpfntimer funkcja obsługująca komunikat WM_TIMER Jeżeli lpfntimer == NULL to komunikat WM_TIMER jest umieszczany w kolejce komunikatów aplikacji. Komunikaty generowane przez timer są umieszczane w kolejce komunikatów aplikacji tylko wtedy, gdy jest ona pusta, a aplikacja nie jest obciążona. Jeśli program był zajęty przez dłuższy czas, w którym generowana była pewna liczba komunikatów timera w kolejce umieszczany jest tylko pojedynczy komunikat. Zatrzymanie timera: BOOL KillTimer( UINT nidevent ); nidevent identyfikator Timera 27 Praca z timerami 28 Programowanie w Funkcja obsługi kilku timerów uruchomionych w jednej aplikacji: void CTimeryDlg::OnTimer(UINT nidevent) { // Który timer wywołał to zdarzenie? switch (nidevent) { case ID_TIMER1: break; case ID_TIMER2: break; 1. Środowisko programisty 5. 6. CDialog::OnTimer(nIDEvent); 29 30 Okno informacyjne int MessageBox( LPCTSTR lpsztext, LPCTSTR lpszcaption = NULL, UINT ntype = MB_OK ); lpsztext komunikat tekstowy lpszcaption tytuł okna ntype określenie przycisków wyświetlanych w oknie oraz ikony wyświetlanej obok komunikatu. np. MessageBox( Komunikat ); Nazwa aplikacji Modyfikowanie parametru ntype odbywa się przez zastosowanie sumy bitowej identyfikatorów kombinacji przycisków i identyfikatorów ikon Identyfikator kombinacji przycisków Identyfikatory ikon MB_ABORTRETRYIGNORE MB_ICONINFORMATION MB_OK MB_ICONQUESTION MB_OKCANCEL MB_ICONSTOP MB_RETRYCANCEL MB_ICONEXCLAMATION MB_YESNO MB_YESNOCANCEL Identyfikatory wartości zwracanych przez funkcję MessageBox IDABORT IDRETRY IDIGNORE IDYES IDNO IDOK IDCANCEL 1.5

31 32 Przykład zastosowania okna MessageBox: int iwyniki; // Zmienna przechwytująca przyciśnięty klawisz // Pytanie użytkownika iwyniki = MessageBox("Naciśnij przycisk Tak, Nie, Anuluj", "Okno dialogowe Tak, Nie, Anuluj", MB_YESNOCANCEL + MB_ICONINFORMATION); // Określenie, na którym przycisku kliknięto switch (iwyniki) { case IDYES: break; case IDNO: break; case IDCANCEL: break; Predefiniowane klasy okien dialogowych: Klasa CFileDialog CFontDialog CColorDialog CPageSetupDialog CPrintDialog CFindReplaceDialog Typ okna dialogowego Wybór pliku Wybór czcionki Wybór koloru Ustawienia strony do drukowania Drukowanie Znajdź i zamień Wykorzystanie predefiniowanego okna wymaga: 1. Zadeklarowania zmiennej odpowiedniej klasy. 2. Skonfigurowanie okna przed wyświetleniem na ekranie. 3. Wywołanie metody DoModal, w celu wyświetlenia okna. 4. Przechwycenie wartości zwracanej przez metodę DoModal. 5. Odczytanie danych ustawionych przez użytkownika, jeżeli wybrano OK. 33 34 Przykład wykorzystania klasy CFileDialog: Konstruktor klasy: CFileDialog( BOOL bopenfiledialog, LPCTSTR lpszdefext = NULL, LPCTSTR lpszfilename = NULL, DWORD dwflags = OFN_HIDEREADONLY OFN_OVERWRITEPROMPT, LPCTSTR lpszfilter = NULL, CWnd* pparentwnd = NULL ); bopenfiledialog TRUE => open file, FALSE = > save file lpszdefext domyślne rozszerzenie pliku dwflags ustawianie flag konfiguracyjnych lpszfilter możliwość filtrowania wyświetlanych plików pparentwnd wskaźnik do okna nadrzędnego Przykład wykorzystania klasy CFileDialog: Cstring m_sfilename; CFileDialog m_otworzplik(true); // Katalog początkowy m_otworzplik.m_ofn.lpstrinitialdir = "C:\\"; // Wyświetlenie okna otwarcia pliku i przechwycenie rezultatu if (m_otworzplik.domodal() == IDOK) { // Pobranie nazwy pliku m_sfilename = m_otworzplik.getpathname(); // Realizacja operacji na pliku, // którego nazwa jest w zmiennej m_sfilename 35 36 1. Dodanie nowego okna do zasobów aplikacji Etapy konstruowania okna dialogowego: 1. Dodanie nowego okna do zasobów aplikacji 2. Zaprojektowanie wyglądu okna (ułożenie obiektów kontrolnych) 3. Zadeklarowanie klasy bazowej, po której tworzone okno będzie dziedziczyć właściwości. 4. Dodanie zmiennych do obiektów kontrolnych tworzonego okna dialogowego. 5. Dodanie pliku nagłówkowego do kodu źródłowego głównego okna aplikacji. 6. Utworzenie obiektu klasy okna dialogowego 1.6

37 38 2. Zaprojektowanie wyglądu okna (ułożenie obiektów kontrolnych) (1/2) 2. Zaprojektowanie wyglądu okna (ułożenie obiektów kontrolnych) (2/2) Pole Group powinno być aktywne tylko dla pierwszego przycisku opcji. 39 40 3. Zadeklarowanie klasy bazowej 4. Dodanie zmiennych do obiektów kontrolnych (1/2) 41 42 4. Dodanie zmiennych do obiektów kontrolnych (2/2) 5. Dodanie pliku nagłówkowego do kodu źródłowego głównego okna aplikacji // Okna.cpp : Defines the class // behaviors for the application. #include "stdafx.h" #include "Okna.h" #include "KonfiguracjaDlg.h" #include "OknaDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE //... 1.7

43 44 6. Utworzenie obiektu klasy okna dialogowego class COknaDlg : public Cdialog { private: CKonfiguracjaDlg m_dkonfiguracja; ; Wykorzystanie własnych okien dialogowych Dodanie przycisku do głównego okna programu, które wyświetli okno konfiguracji Główne okno programu 45 46 Wykorzystanie własnych okien dialogowych Edycja kody źródłowego funkcji OnKonfiguracja: void COknaDlg::OnKonfiguracja() { // Wyświetlenie okna i przechwycenie wyniku wykonania if (m_dkonfiguracja.domodal () == IDOK) { // Zapamiętanie nowej konfiguracji Zmienne konfiguracyjne przechowywane będą w klasie CKonfiguracjaDlg 1. Definicja zmiennych w klasie CKonfiguracjaDlg class CKonfiguracjaDlg : public CDialog { friend class COknaDlg; // Klasa COknaDlg uzyska dostęp do zmiennych prywatnych // klasy CKonfiguracjaDlg private: int m_baudtable[baud_values];// tablica prędkości transmisji int m_baudid;// tymczasowy indeks w tablicy m_baudtable int m_actuallbaudid;// aktualny indeks w tablicy m_baudtable int m_actuallcom;// aktualny numer portu COM (0 COM1,1-COM2) ; 47 48 2. Dodanie definicji BAUD_VALUES w głównym pliku nagłówkowym Okna.h #ifndef AFXWIN_H #error include 'stdafx.h' before including this file for PCH #endif #include "resource.h" // main symbols #define BAUD_VALUES 4 //liczba prędkości transmisji ////////////////////////////////////////////////////// // COknaApp: // See Okna.cpp for the implementation of this class 3. Edycja kodu źródłowego funkcji OnInitDialog() klasy COknaDlg BOOL COknaDlg::OnInitDialog() { int i; CDialog::OnInitDialog(); m_dkonfiguracja.m_baudtable[0] = 1200; for (i = 1; i < BAUD_VALUES; i++) m_dkonfiguracja.m_baudtable[i] = m_dkonfiguracja.m_baudtable[i-1] * 2; // m_baudtable = {1200, 2400, 4800, 9600 m_dkonfiguracja.m_actuallbaudid = 3;//9600 bodów m_dkonfiguracja.m_actuallcom = 1;//COM2 return TRUE; 1.8

49 50 4. Dodanie funkcji OnInitDialog() do klasy CKonfiguracjaDlg BOOL CKonfiguracjaDlg::OnInitDialog() { int i; CString str; CDialog::OnInitDialog(); for (i = 0; i < BAUD_VALUES; i++) { str.format("%d",m_baudtable[i]); m_baudrate.addstring(str); m_com = m_actuallcom; UpdateData(FALSE);//aktualizacja kontrolek IDC_COM1,IDC_COM2 m_baudrate.setcursel(m_actuallbaudid); return TRUE; 5. Dodanie funkcji DestroyWindow() do klasy CKonfiguracjaDlg BOOL CKonfiguracjaDlg::DestroyWindow() { m_baudid = m_baudrate.getcursel(); UpdateData(TRUE);//aktualizacja zmiennej m_com return CDialog::DestroyWindow(); 51 52 6. Modyfikacja funkcji OnKonfiguracja() klasy COknaDlg void COknaDlg::OnKonfiguracja() { // Wyświetlenie okna i przechwycenie wyniku wykonania if (m_dkonfiguracja.domodal() == IDOK) { //aktualizacja indeksu w tablicy m_baudtable m_dkonfiguracja.m_actuallbaudid=m_dkonfiguracja.m_baudid; //aktualizacja numeru portu m_dkonfiguracja.m_actuallcom = m_dkonfiguracja.m_com; 53 Programowanie w 54 1. Środowisko programisty 5. 6. Zintegrowanie grafiki z programem w najprościej zrealizować w oparciu o podsystem GDI Interfejs Urządzenia Graficznego (ang. Graphics Device Interface). GDI jest częścią systemu Windows odpowiedzialną za tworzenie grafiki niezależnie od konkretnych urządzeń wyświetlających (karta graficzna, drukarka). Funkcje graficzne dostępne są za pośrednictwem biblioteki GDI32.DLL. Rodzaje funkcji dostępne poprzez podsystem GDI: 1. Funkcje, które otrzymują (lub tworzą) i zwalniają (lub usuwają) tzw. kontekst urządzenia (ang. device context), np.: BeginPaint,EndPaint (przy przetwarzaniu komunikatu WM_PAINT), GetDC,ReleaseDC (przy przetwarzaniu komunikatów innych niż WM_PAINT) 2. Funkcje, które otrzymują informacje o kontekście urządzenia np. GetTextMetrics 3. Funkcje graficzne np. TextOut, FillRect 4. Funkcje, które zmieniają i pobierają atrybuty kontekstu urządzenia np. SetTextColor, GetTextColor 5. Funkcje, które współdziałają z obiektami GDI: piórami i pędzlami. 1.9

55 56 Kreślenie na graficznym urządzeniu wyjściowym (ekranie, drukarce) wymaga uzyskania uchwytu kontekstu urządzenia. Uchwyt ten wykorzystywany jest jako jeden z parametrów funkcji graficznych dostępnych w bibliotece GDI. Kontekst urządzenia wykorzystywany jest przez system operacyjny do określenia na jakim urządzeniu oraz na jakim obszarze ma być rysowana grafika. Kontekst urządzenia zawiera szereg atrybutów, które określają sposób i wynik działania funkcji GDI na danym urządzeniu. Dzięki tym atrybutom wywołania funkcji GDI mogą zawierać wyłącznie współrzędne lub wymiary kreślonych obiektów. Dostęp do zasobów GDI w programie korzystającym z biblioteki MFC jest możliwy za pomocą metod klasy CDC (ang. device context class). Klasa ta jest obiektową wersją biblioteki GDI. Kontekst urządzenia w programie korzystającym z klasy CDC tworzy się definiując w programie obiekt klasy CDC i podając jako argument konstruktora wskaźnik do okna, które ma być związane z tym kontekstem, np. CDC dc(this); Przykładowe metody klasy CDC: COLORREF SetPixel(int x,int y,colorref crcolor); rysowanie punktu COLORREF zmienna o postaci 0x00bbggrr określająca kolor punktu Jeżeli dane są składowe RGB w postaci trzech bajtów to aby utworzyć zmienną COLORDEF korzystamy z makra RGB, np. COLORREF pixelcolor = RGB(255,0,0) punkt koloru czerwonego CPoint MoveTo(int x, int y); przesunięcie bieżącej pozycji do punktu (x, y) BOOL LineTo(int x,int y) narysowanie linii od bieżącej pozycji do punktu (x,y) CPen* SelectObject( CPen* ppen ); - wybranie pióra void FillRect( LPCRECT lprect, CBrush* pbrush ); -wypełnienie obszaru określonego przez lprect (obiekt klasy CRect) BOOL Polyline( LPPOINT lppoints, int ncount ); - krzywa łamana łącząca punkty w tablicy CPoint[] BOOL TextOut(int x, int y, const CString& str); wyświetlenie napisu 57 58 Metody klasy CDC wykorzystują dwa typy zasobów do wykonywania większości czynności związanych z rysowaniem i wyświetlaniem grafiki: pióra i pędzle. Przykład użycia pióra: // Utworzenie pióra CPen lpioro(ps_solid, 1, RGB(0, 0, 0,)); // Wybranie pióra jako bieżącego narzędzia rysowania dc.selectobject(&lpioro); Przykład zastosowania klasy CDC (1/4) Podstawowe style pióra: PS_SOLID,PS_DOT,PS_DASH,PS_DASHDOT,PS_NULL. Przykłady użycia pędzla: CBrush lsolidbrush(rgb(0, 0, 0)); wypełnienie obszaru jednolitym kolorem CBrush lpatternbrush(hs_cross,rgb(0,0,0)); wypełnienie obszaru wzorem Przykładowe wzory: HS_BDIAGONAL, HS_CROSS, HS_DIAG_CROSS. 59 60 Przykład zastosowania klasy CDC (2/4) void CGrafikaDlg::OnPaint() { CPaintDC dc(this); // Utworzenie kontekstu urządzenia CPen lpioro(ps_solid, 5, RGB(0,0,0)); // Utworzenie pióra dc.selectobject(&lpioro); // Wybranie pióra CBrush lpatternbrush; // Utworzenie pędzla lpatternbrush.createsolidbrush(rgb(255, 255, 255)); dc.selectobject(&lpatternbrush); // Wybranie pędzla CRect lobszar; // Utworzenie obiektu klasy CRect GetClientRect(lObszar); // Ustalenie obszaru okna lobszar.normalizerect(); // Normalizacja współrzędnych Przykład zastosowania klasy CDC (3/4) //Obliczenie współrzędnych środka okna int middle_x = (lobszar.right - lobszar.left) / 2; int middle_y = (lobszar.bottom - lobszar.top) / 2; // odległość w osi x między punktami na wykresie double delta_x = (double)(lobszar.right-lobszar.left)/200; dc.fillrect(lobszar,&lpatternbrush); //Wypełnienie obszaru // Ustawienie pozycji przy lewej krawędzi okna dc.moveto(lobszar.left,lobszar.top + middle_y); 1.10

61 62 Programowanie w Przykład zastosowania klasy CDC (4/4) // Rysowanie wykresu double actuall_y; for (int i = 1; i <= 200; i++) { actuall_y = middle_y*(1-sin((double)i/200*2*3.14)); dc.lineto(i*delta_x, actuall_y); // Wyświetlenie tekstu na ekranie dc.textout(middle_x+20, middle_y, "y = sin(x)"); // Wywołanie funkcji OnPaint klasy Cdialog CDialog::OnPaint(); 1. Środowisko programisty 5. 6. 63 Aplikacje typu SDI 64 Aplikacje typu SDI Architektura Dokument/Widok CObject CDC CCmdTarget CGdiObject Architektura Dokument/Widok (Obiekt aplikacji) CWinApp Główna klasa aplikacji, będąca odbiorcą wszystkich komunikatów Komunikaty przekazywane do ramki okna i obiektu widoku CFrameWnd (Ramka okna) CDocument CWnd CWinThread CFrameWnd CDialog CView CWinApp Przechowuje dokument użytkownika. W tej klasie implementuje się struktury danych do przechowywania i manipulowania danymi tworzącymi dokument. (Obiekt dokumentu) (Obiekt widoku) CView CDocument Dwukierunkowy przepływ informacji pomiędzy dokumentem, a obiektem widoku 65 Aplikacje typu SDI 66 Aplikacje typu MDI Klasa CView reprezentuje wizualny wygląd dokumentu prezentowany na ekranie. Rozbudowa klasy CView dotyczy utworzenia funkcji rysowania dokumentu na ekranie oraz obsługiwania danych wprowadzanych przez użytkownika. Architektura Dokument/Widok CObject Klasy potomne względem CView: CEditView zapewnia funkcjonalność zbliżoną do pola tekstowego. CFormView umożliwia tworzenie widoków z panelami. zawierającymi obiekty kontrolne. CHtmlView zapewnia funkcjonalność przeglądarki sieciowej. CListView wprowadza funkcjonalność obiektu-listy. CRichEditView wprowadza funkcjonalność związaną z formatowaniem czcionek tekstu. CScrollView dodaje możliwość przewijania zawartości obiektu widoku. CTreeView zapewnia funkcjonalność obiektu drzewa. CDC CCmdTarget CGdiObject CDocument CWnd CWinThread CFrameWnd CDialog CView CWinApp CMDIFrameWnd CMDIChildWnd 1.11

67 Aplikacje typu MDI Architektura Dokument/Widok Komunikaty przekazywane do ramki okna i obiektu widoku (Obiekt aplikacji) CMDIFrameWnd (Ramka głównego okna) CWinApp Główna klasa aplikacji (Ramki okna potomnego) CMDIChildWnd (Obiekt widoku) CView (Obiekt dokumentu) CDocument Dwukierunkowy przepływ informacji pomiędzy dokumentem, a obiektem widoku 1.12