1.1 Szkielet aplikacji

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

Wykład 8: klasy cz. 4

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

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

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

Agregacja. Wykorzystanie innego komponentu bez użycia agregacji. Simple calculator. Extended calculator

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Rozdział 4 KLASY, OBIEKTY, METODY

Do obsługi plików BMP należy stworzyć klasę przechowującą zawartość obrazu i udostępniającą następujące metody:

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Programowanie obiektowe

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie obiektowe

Projekt Hurtownia, realizacja rejestracji dostaw produktów

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

DesignCAD 3D Max 24.0 PL

1. Przypisy, indeks i spisy.

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

Minimalna wspierana wersja systemu Android to zalecana 4.0. Ta dokumentacja została wykonana na telefonie HUAWEI ASCEND P7 z Android 4.

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie obiektowe

Structured storage, Monikers, Running Object Table

Instrukcja laboratoryjna cz.3

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Dell Display Manager podręcznik użytkownika

Dodanie nowej formy do projektu polega na:

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

1. Opis okna podstawowego programu TPrezenter.

Program V-SIM tworzenie plików video z przebiegu symulacji

Programowanie obiektowe

Programowanie na poziomie sprzętu. Programowanie w Windows API

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

Wprowadzenie do projektu QualitySpy

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

Misja #1 Poznajemy Prophio.

Delphi podstawy programowania. Środowisko Delphi

Programowanie obiektowe

Instrukcja obsługi programu Do-Exp

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

Materiały do zajęć VII

Formaty plików graficznych - wprowadzenie

Podstawy Programowania Obiektowego

Programowanie obiektowe

Cechy systemu X Window: otwartość niezależność od producentów i od sprzętu, dostępny kod źródłowy; architektura klient-serwer;

Wprowadzenie do biblioteki klas C++

Programowanie w Javie

PROGRAM TESTOWY LCWIN.EXE OPIS DZIAŁANIA I INSTRUKCJA UŻYTKOWNIKA

Programowanie obiektowe

Visual Basic w programie Excel

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Część 3 - Konfiguracja

Smarty PHP. Leksykon kieszonkowy

PROBLEMY TECHNICZNE. Co zrobić, gdy natrafię na problemy związane z użytkowaniem programu DYSONANS

VBA w Excel Lekcja ta ma przybliżyć pojęcia związane z programowaniem w pakiecie Office. Poniższe przykłady związane są z wersją Office2007.

Inkscape. Warstwy w programie Inscape. Budowa palety - Warstwy. Ćwiczenie 2

Grażyna Koba. Grafika komputerowa. materiały dodatkowe do podręcznika. Informatyka dla gimnazjum

Windows 10 - Jak uruchomić system w trybie

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

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

Aplikacje WWW - laboratorium

Jak dodać własny szablon ramki w programie dibudka i dilustro

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Programowanie Komputerów 2FD. Materiały pomocnicze do laboratorium

Programowanie zaawansowane

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

Obliczenie azymutu ze współrzędnych wersja C++ Builder

Tworzenie szablonów użytkownika

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

Oracle PL/SQL. Paweł Rajba.

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Tablet bezprzewodowy QIT30. Oprogramowanie Macro Key Manager

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:

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

Obsługa programu Paint materiały szkoleniowe

STWORZENIE MOBILNEJ APLIKACJI,

Palety by CTI. Instrukcja

Dell UltraSharp UP3017 Dell Display Manager Instrukcja użytkownika

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Laboratorium Systemów SCADA

Nowe funkcje w programie SYMFONIA Handel Premium w wersji 2009

Dziedziczenie. Zadanie 1

Wykład 5: Klasy cz. 3

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące

Wykład A1. AutoCAD Dr inż. Jarosław Bydłosz

Instrukcje ustawień funkcji zwalniania wydruku

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

Dodawanie grafiki i obiektów

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Projektowanie graficzne. Wykład 2. Open Office Draw

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt.

Tworzenie i edycja dokumentów w aplikacji Word.

Transkrypt:

1.1 Szkielet aplikacji Poniżej przedstawiony jest szkielet aplikacji, na którym oparte są wszystkie programy pisane w ramach ćwiczeń. Główna klasa okna programu może być wyprowadzona z klasy TForm, tak jak to jest zaprezentowane poniżej. Wytłuszczeniem zaznaczone są prywatne składowe klasy, potrzebne do zainicjowania DirectDraw. Typy danych: LPDIRECTDRAW, DDSURFACEDESC, LPDIRECTDRAWSURFACE, DDSCAPS zdefiniowane są w pliku nagłówkowym ddraw.h. class TForm1 : public TForm { published: // IDE-managed Components void fastcall FormCreate(TObject *Sender); void fastcall FormDestroy(TObject *Sender); void fastcall FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift); private: // User declarations LPDIRECTDRAW lpdd; DDSURFACEDESC ddsd; LPDIRECTDRAWSURFACE FrontBuffer; LPDIRECTDRAWSURFACE BackBuffer; DDSCAPS ddscaps; bool InitDDraw(); public: // User declarations fastcall TForm1(TComponent* Owner); }; 1.2 Obiekty COM Budowa bibliotek DirectX oparta jest bezpośrednio na obiektach COM (Component Object Model), stanowiących rozszerzenie pojęcia klas abstrakcyjnych języka C++. Obiekt COM z punktu widzenia aplikacji jest czarną skrzynką wykonującą ściśle określone operacje. Główna różnica między obiektami COM, a klasami języka C++ polega na sposobie wywoływania metod, w przypadku języka C++ wystarczy utworzyć egzemplarz danej klasy i bezpośrednio wywoływać jej funkcję. Natomiast publiczne metody obiektów COM zgrupowane są w jeden lub kilka interfejsów, a sam obiekt jest w zasadzie strukturą przechowującą wskaźniki do funkcji z nim powiązanych. Także w celu skorzystania z określonej metody, musimy utworzyć obiekt COM i uzyskać wskaźnik do odpowiedniego interfejsu. Olbrzymią zaleta obiektów COM jest możliwość ich użycia z poziomu języków nie zorientowanych obiektowo. Wszystkie interfejsy DirectX wyprowadzane są z interfejsu IUnknown, posiadającego jedynie trzy funkcje AddRef(), QueryInterface( REFIID riid, LPVOID* ppvobj ) oraz Release(). Głównymi zadaniami metod tego interfejsu jest określanie liczby odwołań aplikacji do danego obiektu COM. W przypadku języka C++ każda aplikacja tworzy niezależnie egzemplarze obiektów np. przy pomocy operatora new, w chwili gdy przestaje korzystać z danego obiektu wywołuje operator delete i usuwa obiekt z pamięci. Z obiektami COM jest zupełnie inaczej, gdyż w pamięci znajduje się pojedynczy egzemplarz danego obiektu COM, a każda z aplikacji chcących z obiektu COM skorzystać otrzymuje wskaźnik do niego. Za każ- - 1 -

dym razem, gdy aplikacja tworzy wybrany obiekt COM, tak naprawdę wywoływana jest funkcja AddRef(), zwiększająca ilość odwołań do znajdującego się w pamięci obiektu i aplikacji zwracany jest wskaźnik. Po skończonym działaniu aplikacja powinna wywoływać metodę Release() zmniejszającą o 1 liczbę odwołań do obiektu, w momencie osiągnięcia przez liczbę odwołań wartości 0, obiekt może być usunięty z pamięci. 1.3 Tworzenie obiektu DirectDraw Utworzenie obiektu DirectDraw polega na wywołaniu funkcji DirectDrawCreate, która ma następującą postać: HRESULT WINAPI DirectDrawCreate( GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, IUnknown FAR *punkouter); Parametr lpguid określa wskaźnik na identyfikator karty, w przypadku podania wartości NULL wybrana zostaje podstawowa karta graficzna. W *lplpdd podaje się adres wskaźnika LPDIRECTDRAW, który zostanie ustawiony na interfejs IDirectDraw. Ostatni parametr powinien mieć wartość NULL. W przypadku poprawnego utworzenia obiektu DirectDraw funkcja zwróci wartość DD_OK. Jeżeli utworzymy obiekt DirectDraw możemy przystąpić do ustawienia rodzaju współpracy (tryb okienkowy lub pełnoekranowy) urządzenia (DirectDraw) z naszą aplikacją. Czynności tej dokonujemy za pomocą funkcji. HRESULT SetCooperativeLevel( HWND hwnd, DWORD dwflags ); Pierwszym parametrem jaki musimy podać tej funkcji jest uchwyt naszego okna. Drugi parametr określa rodzaj współpracy, aplikacja może działać w trybie okienkowym lub pełnoekranowym, możemy zabronić systemowi reakcji na kombinację klawiszy Ctrl+Alt+Del. W związku z tym, że flag jest dość dużo opiszę jedynie dwie, których będziemy używać. DDSCL_EXCLUSIVE oznacza, że nasza aplikacja ma prawo do wyłączności ekranu. Flaga ta musi być używana z DDSCL_FULLSCREEN, która wymusza działanie aplikacji w trybie pełno ekranowym. Kolejną czynnością jest ustawienie odpowiedniego trybu graficznego, w którym pracować będzie nasz program. Rozdzielczość ekranu ustawiamy za pomocą funkcji HRESULT SetDisplayMode(DWORD dwwidth, DWORD dwheight, DWORD dwbpp ); Kolejne parametry tej funkcji to po prostu szerokość, wysokość i liczba bitów na piksel trybu graficznego, jaki chcemy uzyskać. Prawidłowo napisane aplikacje korzystające z DirectX powinny oferować użytkownikowi zarówno możliwość karty graficznej (lub trybu jej pracy np. emulacja) jak i trybu graficznego. Jednak dla naszych potrzeb wystarczające będzie podanie parametrów jednego z trybów, które są obsługiwane przez posiadaną kartę graficzną. W związku z tym, że duża część kart nie obsługuje trybu 24-bitowego (mają tryby 32-bitowe) w ramach zajęć używać będziemy trybów 8 i 16- bitowych. Wspomniane tryby graficzne wymagają szerszego omówienia. Pierwszy z nich jest trybem indeksowym, czyli takim, w którym piksel w pamięci komputera reprezentowany jest bezpośrednio przez indeks określający numer koloru w palecie barw. Jak łatwo obliczyć w trybie 8-bitowym dostępne mamy 256 kolorów 24-bitowych. W związku z tym, że paletę kolorów przypisuje się bezpośrednio do powierzchni sposób jej tworzenia przedstawiony będzie poniżej. W drugim z trybów piksel opisywany jest bezpośrednio wartościami kolorów RGB, i - 2 -

tak na składową czerwoną oraz niebieską przeznaczono 5 bitów, natomiast na zieloną 6 bitów. 1.4 Powierzchnie Powierzchnie (obiekt DirectDrawSurface) są obiektami reprezentującymi liniowe obszary pamięci graficznej, lub systemowej. Podstawowym zadaniem tych obiektów jest przechowywanie danych reprezentujących obraz, widziany na ekranie monitora. Powierzchnie mogą być również używane jako różnego typu bufory pomocnicze, służące np. jako źródło operacji kopiujących grafikę do innych powierzchni lub realizować zadanie z-bufora. Chcąc wyświetlać jakąkolwiek grafikę za pomocą DirectDraw musimy utworzyć przy najmniej jedną powierzchnię (podstawową). Dokonać możemy tego za pomocą funkcji HRESULT IDirectDraw::CreateSurface(LPDDSURFACEDESC lpddsurfacedesc, LPDIRECTDRAWSURFACE FAR *lplpddsurface, IUnknown FAR *punkouter); Pierwszym parametrem tej funkcji jest struktura typu DDSURFACEDESC, opisująca właściwości tworzonej powierzchni. W związku z tym, że struktura ta posiada dużą liczbę pól omówione zostaną tylko niezbędne. Bardzo istotnym polem jest dwsize, w zmiennej tej należy podać rozmiar struktury (przykład użycia powierzchni znajduje się poniżej). W polu dwflags podajemy kombinację flag informującą DirectDraw, które z pól całej struktury należy wziąć pod uwagę, w naszym przypadku należy podać DDSD_CAPS DDSD_BACK- BUFFERCOUNT, kombinacja ta określa, że należy prawidłowo zdefiniować pola dwback- BufferCount i ddscaps. Pierwsze z wymienionych pól określa liczbę tylnych buforów powierzchni, natomiast drugie jest strukturą typu DDSCAPS, określającą właściwości samej powierzchni. W naszych programach będziemy podawać ddscaps.dwcaps = DDSCAPS_COMPLEX DDSCAPS_FLIP DDSCAPS_PRIMARY- SURFACE DDSCAPS_VIDEOMEMORY; DDSCAPS_COMPLEX określa, że wraz z powierzchnią podstawową tworzone są tylne bufory. Flaga ta dodatkowo powoduje, że wszystkie powierzchnie mogą być usunięte tylko poprzez usuniecie powierzchni podstawowej. DDSCAPS_FLIP oznacza, że powierzchnia będzie przełączana z tylnymi buforami. DDSCAPS_PRIMARSURFACE określa, że tworzona powierzchnia jest podstawową. DDSCAPS_VIDEOMEMORY flaga ta wymusza przydzielenie pamięci na powierzchnie w przestrzeni karty graficznej. Zmienna lplpddsurface powinna zawierać adres wskaźnika na interfejs IDirectDrawSurface. Ostatni parametr powinien mieć wartość NULL. Po utworzeniu podstawowej powierzchni możemy uzyskać dostęp do tylnego bufora, utworzonego wraz z nią. Można tego dokonać za pomocą funkcji HRESULT IDirectDrawSurface::GetAttachedSurface( LPDDSCAPS lpddscaps, LPDI- RECTDRAWSURFACE3 FAR *lplpddattachedsurface ); Pierwszy z parametrów jest adresem struktury DDSCAPS, opisującym właściwości powierzchni, którą chcemy uzyskać. W naszym wypadku pole dwcaps tej struktury powinno mieć wartość DDSCAPS_BACKBUFFER. Ostatni parametr powinien zawierać adres wskaźnika na interfejs IDirectDrawSurface. - 3 -

1.5 Palety kolorów Paletę kolorów w DirectX reprezentuje interfejs IDirectDrawPalette. Dostęp do tego interfejsu można uzyskać za pomocą funkcji HRESULT IDirectDraw::CreatePalette( DWORD dwflags, LPPALETTEENTRY lpcolor- Table, LPDIRECTDRAWPALETTE FAR *lplpddpalette, IUnknown FAR *punkouter); Pierwszym parametrem jest flaga określająca typ palety, w naszym przypadku (dla trybu 8- bitowego) należy podać DDPCAPS_8BIT. Kolejny parametr jest adresem do tablicy elemantów PALETTEENTRY, opisujących kolor w postaci RGB. Kolejny argument powinien zawierać adres wskaźnika na interfejs IDirectDrawPalette. Ostatni parametr powinien mieć wartość NULL. Utworzoną w ten sposób paletę możemy skojarzyć z wybraną powierzchnią za pomocą funkcji HRESULT IDirectDrawSurface::SetPalette(LPDIRECTDRAWPALETTE lpddpalette ); Jedynym argumentem tej funkcji jest adres wskaźnika na interfejs IdirectDrawPalette. Poniżej zamieszczony jest kod funkcji inicjującej obiekt DirectDraw oraz tworzącej podstawową oraz tylną powierzchnię. HRESULT ddrval; LPDIRECTDRAW lpdd; DDSURFACEDESC ddsd; HWND hwnd; LPDIRECTDRAWSURFACE FrontBuffer=NULL; LPDIRECTDRAWSURFACE BackBuffer=NULL; DDSCAPS ddscaps; bool TForm1::InitDDraw() { ddrval = DirectDrawCreate( NULL, &lpdd, NULL ); ddrval=lpdd->setcooperativelevel(hwnd,ddscl_exclusive DDSCL_FULLSCREEN ); ddrval = lpdd->setdisplaymode( 640, 480, 16 ); ZeroMemory(&ddsd, sizeof(ddsd));//zawsze należy wyzerować wszystkie pola ddsd.dwsize = sizeof(ddsd); //ustawiamy rozmiary struktury ddsd.dwflags = DDSD_CAPS DDSD_BACKBUFFERCOUNT; ddsd.ddscaps.dwcaps = DDSCAPS_COMPLEX DDSCAPS_FLIP DDSCAPS_PRIMARYSURFACE DDSCAPS_VIDEOMEMORY; ddsd.dwbackbuffercount = 1; ddrval = lpdd->createsurface( &ddsd, &FrontBuffer, NULL ); ddscaps.dwcaps = DDSCAPS_BACKBUFFER; - 4 -

ddrval = FrontBuffer->GetAttachedSurface( &ddscaps, &BackBuffer ); return true; } 1.6 Dostęp bezpośredni do zawartości powierzchni oraz rysowanie na powierzchni Najprostszą metodą rysowania obrazu na powierzchniach jest użycie standardowych funkcji GDI. Zasadnicza różnica w stosunku do rysowania w zwykłym oknie Windows polega na pobieraniu uchwytu kontekstu urządzenia. W zwykłej aplikacji wystarczy pobrać wspomniany uchwyt raz (np. po utworzeniu okna) i stosując zmienną globalną odwoływać się do niej za każdym razem, gdy chcemy użyć funkcji GDI. W przypadku powierzchni takie podejście jest niedopuszczalne, gdyż powierzchnia zostaje zablokowana po pobraniu uchwytu kontekstu i żadne operacje na niej nie będą mogły być przeprowadzone do czasu zwolnienia uchwytu. Funkcja pobierająca uchwyt jest bardzo podobna do standardowej funkcji API i ma następującą składnie: HRESULT IDirectDrawSurface::GetDC(HDC FAR *lphdc ); Jedynym parametrem tej metody jest adres zmiennej, w której ma zostać zwrócony uchwyt. Do zwalniania kontekstu powierzchni używa się następującej funkcji HRESULT IDirect- DrawSurface::ReleaseDC(HDC hdc ); Poniżej znajduje się przykład wydrukowania napisu na powierzchni LPDIRECTDRAWSURFACE FrontBuffer; HDC hdc; FrontBuffer->GetDC(&hDC); //pobieramy uchwyt SetBkColor(hDC,0); //ustawiamy kolor tła SetTextColor(hDC,0xffffff); //ustawiamy kolor tekstu TextOut(hDC, 0,0, Tekst,5); //drukujemy napis FrontBuffer->ReleaseDC(hDC); //zwalniamy uchwyt Inną i znacznie ciekawszą metodą rysowania grafiki jest bezpośrednie odwoływanie się do obszarów pamięci powierzchni. Jednak aby móc odwołać się do jakiegokolwiek obszaru pamięci należy znać jego adres. W przypadku powierzchni adres uzyskuje się po wywołaniu następującej funkcji Lock() o następującej składni: HRESULT IdirectDrawSurface::Lock( LPRECT lpdestrect, LPDDSURFACEDESC lpddsurfacedesc, DWORD dwflags, HANDLE hevent); Pierwszym argumentem jest wskaźnik na strukturę RECT opisującą prostokątny obszar, który ma być zablokowany. Jeżeli podamy NULL blokowana jest cała powierzchnia. Kolejnym parametrem jest wskaźnik na strukturę DDSURFACEDESC, w której zostaną zwrócone informacje dotyczące powierzchni (między innymi adres pamięci). Struktura ta ma szereg pól jednak dla naszych potrzeb istotne są dwa. Pierwsze z nich to lpsurface w przypadku poprawnego wywołania funkcji pole to będzie adresem pamięci powierzchni. Drugie z pól to lpitch i określa ono odstęp między początkami dwóch kolejnych linii wyrażony w bajtach. Należy o tym pamiętać, gdyż często zdarza się, że w trybie graficznym 640x480x8 pojedyncza linia ekranu ma więcej niż 640 bajtów. Wynika to bezpośrednio z mechanizmów zarządzania pamięcią. Kolejny parametr określa sposób blokowania powierzchni dla naszych potrzeb należy podać wartość DDLOCK_WAIT, co oznacza, że powierzchnia nie zostanie zablokowana jeżeli jakiekolwiek operacje graficzne są na niej w danej chwili wykonywane. - 5 -

Ostatni parametr powinien zawierać wartość NULL. Po zakończeniu operacji na powierzchni należy ją odblokować za pomocą funkcji HRESULT IDirectDrawSurface::Unlock(LPVOID lpsurfacedata ); Jedynym parametrem tej funkcji jest adres obszaru blokowanego. Parametr ten może mieć wartość NULL, jeżeli blokowana była cała powierzchnia. Poniżej znajduje się fragment kodu prezentujący dostęp do powierzchni i przykład postawienia punktu o współrzędnych (56,124). DDSURFACEDESC ddsd; LPDIRECTDRAWSURFACE pdds ; if((pdds ->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL))!= DD_OK) return FALSE; BYTE *screen=(byte*)ddsd.lpsurface; DWORD pitch=ddsd.lpitch; screen[124*pitch+56]=255; pdds->unlock(null); 1.7 Konfiguracja środowiska programowania W celu skompilowania szkieletowego programu należy dodać do projektu bibliotekę ddraw.lib. W tym celu należy po utworzeniu projektu (z wszystkimi niezbędnymi plikami) wybrać z menu View pole Projekt Manager. Po wykonaniu opisanej czynności powinno ukazać się okno takie, jak na rysunku poniżej Rys 1. Konfiguracja bibliotek linkowanlych dla Borland Builder C++ 5.0. - 6 -

We wspomnianym oknie należy na nazwie naszego programu (np. projekt.exe ) kliknąć prawym przyciskiem i z menu kontekstowego wybrać opcję Add Następnie należy wskazać na plik z biblioteką, którą chcemy dodać. Standartowo plik ddraw.lib mieści się w katalogu..\lib w podkatalogu PSDK. Po prawidłowo wykonanej konfiguracji w głównym pliku projektu powinna pojawić się następująca linia USELIB("..\Lib\PSDK\ ddraw.lib "); - 7 -