Interfejs graficzny w systemie Windows (GDI - Graphics Device Interface) GDI dostarcza funkcje i odpowiednie struktury, które aplikacja może wykorzystywać do obsługi graficznego wyjścia (różne urządzenia). Typ urządzenia graficznego Display Supports drawing operations on a video display. Printer Supports drawing operations on a printer or plotter. Memory Supports drawing operations on a bitmap. Information Supports the retrieval of device data. Aplikacja uzyskuje dostęp do urządzenia wyjściowego poprzez kontekst urządzenia (DC device context). Kontekst urządzenia to struktura opisująca stan urządzenia (producent, technologia, rozdzielczość). Funkcje GDI pozwalają tworzyć kontekst urządzenia i zarządzać nimi. funkcje GDI posługują się uchwytem do kontekstu urządzenia, który identyfikuje urządzenie, przy obsłudze graficznego wyjścia. Kontekst urządzenia jest najczęściej związany z oknem. Przyporządkowanie graficznego wyjścia do okna zapobiega interferencji wyjścia wielu aplikacji. Można tworzyć graficzne urządzenia logiczne (obok istniejących urządzeń fizycznych). Urządzenie logiczne służy do symulacji urządzenia fizycznego i wykorzystywane jest najczęściej do gromadzenia efektów operacji wyjścia, które mogą być łatwo przenoszone na urządzenie fizyczne. Urządzenie fizyczne możne być wykorzystywane do przechowywania kopii zawartości urządzenia fizycznego. Program wyświetla w oknie w różnych momentach: w momencie tworzenia okna, zmiany rozmiaru okna, maksymalizacji i minimalizacji okna, wyprowadzania przetworzonych danych. Odświeżenie graficznej zawartości okna jest wymuszane przez system lub przez program. System operacyjny zarządza oknami i komunikuje program o konieczności odświeżenia zawartości okna komunikat WM_PAINT. Program może sam wyświetlać w oknie np. w momencie zmiany danych. Program może uaktualniać wyjście graficzne w sposób asynchroniczny lub synchroniczny. metoda asynchroniczna Program zaznacza obszar wymagający uaktualnienia i wymusza komunikat WM_PAINT. metoda synchroniczna wysyłanie danych graficznych do urządzenia poprzez kontekst urządzenia: z wykorzystaniem niekolejkowanego komunikatu WM_PAINT, z pominięciem komunikatu WM_PAINT. 1
Kontekst urządzenia (DC device context) obsługa komunikatu WM_PAINT HDC BeginPaint( HWND hwnd, // handle to window LPPAINTSTRUCT lppaint // pointer to structure for paint // information zwraca kontekst urządzenia, informuje o regionie, który ma zostać odświeżony, zatwierdza unieważniony region (komunikat WM_PAINT zostanie usunięty z kolejki komunikatów) BOOL EndPaint( HWND hwnd, // handle to window CONST PAINTSTRUCT *lppaint // pointer to structure for paint data zwalnia zasoby aby wywołać komunikat WM_PAINT należy unieważnić obszar roboczy okna lub jego część BOOL InvalidateRect( HWND hwnd, // handle of window with changed update region CONST RECT *lprect, // address of rectangle coordinates BOOL berase // erase-background flag typedef struct _RECT { LONG left; LONG top; LONG right; LONG bottom; } RECT; synchroniczna obsługa urządzenia graficznego z wykorzystaniem niekolejkowanego komunikatu WM_PAINT 2
BOOL UpdateWindow( HWND hwnd // handle of window BOOL RedrawWindow( HWND hwnd, // handle of window CONST RECT *lprcupdate, // address of structure with update rectangle HRGN hrgnupdate, update region UINT flags // array of redraw flags // handle of z pominięciem komunikatu WM_PAINT. HDC GetDC( HWND hwnd // handle to a window int ReleaseDC( HWND hwnd, // handle to window HDC hdc // handle to device context 3
dostęp do urządzenia poprzez użycie nazwy sterownika HDC CreateDC( LPCTSTR lpszdriver, // pointer to string specifying driver name LPCTSTR lpszdevice, // pointer to string specifying device name LPCTSTR lpszoutput, // do not use; set to NULL CONST DEVMODE *lpinitdata // pointer to optional printer data tworzenie logicznego urządzenia graficznego HDC CreateCompatibleDC( HDC hdc // handle to the device context funkcja tworzy urządzenie graficzne kompatybilne z wybranym urządzeniem; urządzenie graficzne jest odwzorowane w pamięci dynamicznej; kontekst urządzenia zawiera NIE zainicjalizowaną mapę bitową; należy skojarzyć mapę bitową o odpowiednim rozmiarze z tym kontekstem urządzenia poprzez funkcję SelectObject. uzyskiwanie informacji o urządzeniu graficznym int GetDeviceCaps( HDC hdc, // handle to the device context int nindex // index of capability to query kontekst urządzenia opisuje między innymi następujące elementy: pióro rysowanie linii, pędzel malowanie i wypełnianie obszarów, mapa bitowa opis ekranu, paleta kolorów definicja dostępnych kolorów, region obcinanie, ścieżka opis kolejnych operacji graficznych. 4
Elementy GDI 1. Tekst 2. Linie i krzywe 3. Obszary 4. Mapy bitowe 5. Odwzorowanie i transformacja 6. Metapliki 7. Regiony 8. Ścieżki 9. Obcinanie 10. Palety 5
1. Tekst czcionki rastrowe (Raster fonts) skalowalne (Vector, TrueType, OpenType fonts) informacja o bieżącej czcionce BOOL GetTextMetrics( LPTEXTMETRIC lptm // pointer to text metrics structure tworzenie i wybór czcionki: GetStockObject CreateFont CreateFontIndirect ChooseFont HFONT hfnt, holdfont; hfnt = GetStockObject(ANSI_VAR_FONT if (holdfont = SelectObject(hdc, hfnt)) { TextOut(hdc, 10, 50, "Sample ANSI_VAR_FONT text.", 26 SelectObject(hdc, holdfont } formatowanie tekstu SetBkColor, SetBkMode, SetTextAlign, SetTextCharacterExtra, SetTextColor, SetTextJustification wypisywanie tekstu DrawText, OutText 6
2. Linie i krzywe Linia jest zdefiniowane poprzez punkt startowy i punkt końcowy. Punkt końcowy nie należy do linii. Krzywe dzieli się na regularne i nieregularne. Krzywa regularna to fragment obwodu przekroju stożka. Punkt końcowy nie należy do krzywej. BOOL MoveToEx( int X, // x-coordinate of new current position int Y, // y-coordinate of new current position LPPOINT lppoint // pointer to old current position BOOL LineTo( HDC hdc, // device context handle int nxend, // x-coordinate of line's ending point int nyend // y-coordinate of line's ending point BOOL Polyline( CONST POINT *lppt, // pointer to array containing endpoints int cpoints // number of points in the array BOOL PolylineTo( CONST POINT *lppt, // pointer to array of points DWORD ccount // number of points in array BOOL PolyBezier( CONST POINT *lppt, // pointer to endpoints and control points DWORD cpoints // count of endpoints and control points 7
Pióro obiekt GDI umożliwiający rysowanie linii i krzywych. Atrybuty pióra: Width - szerokość Style - ciągła, przerywana Color - kolor Pattern - typ wzoru wypełnienia (jednolity, zakreskowanie, wzór) Hatch - rodzaj zakreskowania End Cap - zakończenie Join - łączenie lini pobranie standardowego pióra HPEN hpen; hpen = GetStockObject (WHITE_PEN SelectObject (hdc, hpen tworzenie pióra hpen = CreatePen (ipenstyle, iwidth, rgbcolor SelectObject (hdc, hpen tworzenie pióra poprzez strukturę LOGPEN logpen; hpen = CreatePenIndirect(WHITE_&logpen SelectObject (hdc, hpen dwie ostatnie opcje użycia pióra wymagają jego zniszczenia po zakończeniu używania DeleteObject (hpen Operacje rastrowe dla pióra int SetROP2( HDC hdc, // handle of device context int fndrawmode // drawing mode 8
Mix mode R2_COPYPEN R2_MASKNOTPEN R2_MASKPEN R2_MASKPENNOT R2_MERGENOTPEN R2_MERGEPEN R2_MERGEPENNOT R2_NOP R2_NOT R2_NOTCOPYPEN R2_NOTMASKPEN Description Pixel is the pen color. Pixel is a combination of the colors common to both the screen and the inverse of the pen. Pixel is a combination of the colors common to both the pen and the screen. Pixel is a combination of the colors common to both the pen and the inverse of the screen. Pixel is a combination of the screen color and the inverse of the pen color. Pixel is a combination of the pen color and the screen color. Pixel is a combination of the pen color and the inverse of the screen color. Pixel remains unchanged. Pixel is the inverse of the screen color. Pixel is the inverse of the pen color. Pixel is the inverse of the R2_MASKPEN 9
3. Obszary Figury geometryczne zawierające brzeg (pióro) i wypełnione wnętrze (pędzel). Figury: elipsa Ellipse cięciwa Chord fragment koła Pie wielobok prostokąt Polygon PolyPolygon FillRect FrameRect InvertRect Rectangle RoundRect uwaga: Rectangle rysuje prostokąt bez dolnej i prawej krawędzi. 10
BOOL Ellipse( int nleftrect, // x of bounding rectangle's upper-left corner int ntoprect, // y of bounding rectangle's upper-left corner int nrightrect, // x of bounding rectangle's lower-right corner int nbottomrect // y of bounding rectangle's lower-right corner BOOL Polygon( CONST POINT *lppoints, // pointer to polygon's vertices int ncount // count of polygon's vertices typedef struct tagpoint { LONG x; LONG y; } POINT; int SetPolyFillMode( int ipolyfillmode // polygon fill mode ALTERNATE WINDING Selects alternate mode (fills the area between odd-numbered and even-numbered polygon sides on each scan line). Selects winding mode (fills any region with a nonzero winding value). 11
Pędzel - obiekt GDI umożliwiający wypełnianie obszarów. Atrybuty pędzla: Brush Origin - punkt odniesienia wzoru Logical Brush Types - rodzaj wypełnienia: solid, stock, hatch, pattern Pattern Block Transfer - typ operacji rastrowej pobranie standardowego pędzla HBRUSH hbrush; hbrush = GetStockObject (DKGRAY_BRUSH SelectObject (hdc, hbrush tworzenie pędzla hbrush = CreateSolidBrush (rgbcolor lub hbrush = CreateHatchBrush (ihatchstyle, rgbcolor HS_CROSS Horizontal and vertical crosshatch HS_DIAGCROSS 45-degree crosshatch HS_FDIAGONAL 45-degree upward left-to-right hatch lub hbrush = CreatePatternBrush (hbmp SelectObject (hdc, hbrush tworzenie pędzla poprzez strukturę LOGBRUSH logbrush; hbrush = CreateBrushIndirect(&logbrush SelectObject (hdc, hbrush dwie ostatnie opcje użycia pędzla wymagają jego zniszczenia po zakończeniu używania DeleteObject (hbrush 12
Operacje rastrowe dla pędzla ROP PATCOPY PATINVERT DSTINVERT BLACKNESS WHITENESS Description Copies the pattern to the destination bitmap. Combines the destination bitmap with the pattern by using the Boolean OR operator. Inverts the destination bitmap. Turns all output to binary zeroes. Turns all output to binary ones. operacje rastrowe dotyczą funkcji PatBlt, która wypełnia prostokąt bieżącym pędzlem BOOL PatBlt( int nxleft, // x-coord. of upper-left corner of rect. to be filled int nyleft, // y-coord. of upper-left corner of rect. to be filled int nwidth, // width of rectangle to be filled int nheight, // height of rectangle to be filled DWORD dwrop // raster operation code 13
4. Mapy bitowe Mapa bitowa opisuje obraz lub rastrowe urządzenie graficzne. Mapa bitowa: nagłówek paleta kolorów tablica bitów opisujących kolor piksela Plik mapy bitowej 14
Nagłówek pliku mapy bitowej BITMAPFILEHEADER typedef struct tagbitmapfileheader { // bmfh WORD bftype; // Specifies the file type. It must be BM. DWORD bfsize; // Specifies the size, in bytes, // of the bitmap file. WORD bfreserved1; WORD bfreserved2; DWORD bfoffbits; } BITMAPFILEHEADER; // Specifies the offset, in bytes, // from the BITMAPFILEHEADER structure // to the bitmap bits. Nagłówek mapy bitowej BITMAPINFO The BITMAPINFO structure defines the dimensions and color information for a Win32 device-independent bitmap (DIB). typedef struct tagbitmapinfo { // bmi BITMAPINFOHEADER bmiheader; RGBQUAD bmicolors[1]; } BITMAPINFO; 15
BITMAPINFOHEADER The BITMAPINFOHEADER structure contains information about the dimensions and color format of a device-independent bitmap (DIB). (BITMAPV4HEADER, BITMAPV5HEADER ) typedef struct tagbitmapinfoheader{ // bmih DWORD bisize; // Specifies the number of bytes required // by the structure. LONG biwidth; LONG biheight; WORD biplanes; WORD bibitcount; // Specifies the number of bits per pixel. DWORD bicompression; DWORD bisizeimage; LONG bixpelspermeter; LONG biypelspermeter; DWORD biclrused; DWORD biclrimportant; } BITMAPINFOHEADER; 16
BOOL BitBlt( HDC hdcdest, // handle to destination device context int nxdest, // x-coordinate of destination rectangle's upper-left // corner int nydest, // y-coordinate of destination rectangle's upper-left // corner int nwidth, // width of destination rectangle int nheight, // height of destination rectangle HDC hdcsrc, // handle to source device context int nxsrc, // x-coordinate of source rectangle's upper-left // corner int nysrc, // y-coordinate of source rectangle's upper-left // corner DWORD dwrop // raster operation code int StretchDIBits( int XDest, // x-coordinate of upper-left corner of dest. rectangle int YDest, // y-coordinate of upper-left corner of dest. rectangle int ndestwidth, // width of destination rectangle int ndestheight, // height of destination rectangle int XSrc, // x-coordinate of upper-left corner of source rectangle int YSrc, // y-coordinate of upper-left corner of source rectangle int nsrcwidth, // width of source rectangle int nsrcheight, // height of source rectangle CONST VOID *lpbits, // address of bitmap bits CONST BITMAPINFO *lpbitsinfo, // address of bitmap data UINT iusage, // usage flags DWORD dwrop // raster operation code 17
Funkcje wyświetlające mapy bitowe BitBlt MaskBlt PatBlt StretchBlt PlgBlt SetDIBits SetDIBitsToDevice StretchDIBits kopiowanie danych (prostokąta pikseli) z urządzenia źródłowego do urządzenia docelowego składa kolor źródłowej i docelowej mapy bitowej korzystając z operacji maskowania i operacji bitowej (rastrowej) maluje prostokąt przy użyciu wybranego pędzla w otwartym kontekście urządzenia kopiuje mapę bitową z prostokąta źródłowego do prostokąta docelowego, rozciągając bądź kompresując mapę bitową do rozmiarów prostokąta docelowego jak BitBlt, pozwala obracać mapy bitowe (tylko WinNT) kopiuje dane z mapy bitowej w dowolnym formacie (DIB) do mapy bitowej kompatybilnej z urządzeniem fizycznym kopiuje dane z mapy bitowej w dowolnym formacie (DIB) do urządzenia kopiuje dane (piksele prostokąta) z mapy bitowej niezależnie od jej typu (DIB) do urządzenia (rozciąga bądź kompresuje mapę bitową do rozmiarów prostokąta docelowego) COLORREF SetPixel( int X, // x-coordinate of pixel int Y, // y-coordinate of pixel COLORREF crcolor // pixel color 18
Tworzenie mapy bitowej HBITMAP CreateBitmap( int nwidth, // bitmap width, in pixels int nheight, // bitmap height, in pixels UINT cplanes, // number of color planes used by device UINT cbitsperpel, // number of bits required to identify a color CONST VOID *lpvbits // pointer to array containing color data Tworzenie mapy bitowej kompatybilnej z urządzeniem graficznym (struktura mapy bitowej odpowiada bieżącemu trybowi pracy urządzenia graficznego) HBITMAP CreateCompatibleBitmap( int nwidth, // width of bitmap, in pixels int nheight // height of bitmap, in pixels 19
Operacje rastrowe dwójkowe operacje rastrowe (pióro i docelowa mapa bitowa) trójkowe operacje rastrowe (źródłowa mapa bitowa, pędzel, docelowa mapa bitowa) dwójkowe operacje rastrowe operand znaczenie operator logiczna operacja bitowa P pióro a AND D docelowa mapa bitowa n NOT o OR x XOR Raster operation Boolean operation (reverse Polish) Result R2_BLACK 0 Visible black line R2_COPYPEN P Visible white line R2_MASKNOTPEN DPna Visible black line R2_MASKPEN DPa Invisible blue line R2_MASKPENNOT PDna Visible red/green line R2_MERGENOTPEN DPno Invisible blue line R2_MERGEPEN DPo Visible white line R2_MERGEPENNOT PDno Visible white line R2_NOP Dn Invisible blue line R2_NOT D Visible red/green line R2_NOTCOPYPEN Pn Visible black line R2_NOTMASKPEN DPan Visible red/green line R2_NOTMERGEPEN DPon Visible black line R2_NOTXORPEN DPxn Invisible blue line R2_WHITE 1 Visible white line R2_XORPEN DPx Visible red/green line 20
trójkowe operacje rastrowe (funkcja SetROP) operand znaczenie operator logiczna operacja bitowa D docelowa mapa bitowa a AND P pędzel n NOT S źródłowa mapa bitowa o OR x XOR Boolean Raster Boolean function in Common name function operation reverse Polish CC 00CC0020 S SRCCOPY CD 00CD0888 SDPono CE 00CE0B08 SDPnao CF 00CF0224 SPno D0 00D00E0A PSDnoa D1 00D1066A PSDPxoxn D2 00D20705 PDSnax D3 00D307A4 SPDSoaxn D4 00D41D78 SSPxPDxax D5 00D50CE9 DPSanan 21