Programowanie w języku C/C++ » Artykuły

GDIplus w MinGW(Dev Cpp)

  • 2008-04-29 19:06
  • 0 komentarzy
  • 1802 odsłony
  • Oceń ten tekst jako pierwszy

Ogólnie o GDI+


GDI+ to nowsza ulepszona wersja GDI, przede wszystkim jest to wersja obiektowa. Oprócz obiektowości GDI+ w pełni wspiera kanał alpha, co standardowe GDI olewa, a  obsługa alphy przy standardowym GDI jest niezwykle pracochłonna(często musimy ręcznie bezpośrednio modyfikować bity). Kolejnym udoskonaleniem GDI+ jest wsparcie dla wielu popularnych formatów grafiki, GDI+ ma wbudowane dekodery, przez co praktycznie z plikiem jpg możemy pracować jak ze zwykłą bitmapą, nie zwracając uwagi na to, że to grafika skompresowana.
GDI+ było przede wszystkim przeznaczone dla programistów .NET, ale z czasem wyszła także wersja jako rozszerzenie zwykłego WinAPI w plikach nagłówkowych pod kompilatory Win32. Gdzieś czytałem, że GDI+ jest przeznaczone dla kompilatorów M$(Visuala itp.), a niektórzy twierdzą, że z MinGW jest niekompatybilne. W praktyce niekompatybilne jest jeżeli nie potrafimy sobie troszkę zmodyfikować plików nagłówkowych, a jeżeli potrafimy niekompatybilność przestaje istnieć :> Różnice pomiędzy kompilatorami "różnych pochodzeń" nie są aż tak duże, aby nie dało się skompilować kodu na którymś z nich, w końcu to język C++, a skoro skoro kod jest zgodny ze standardem C++ to musi się kompilować na każdym kompilatorze zgodnym ze standardem C++, w końcu to cały czas ten sam język :>

Instalacja GDI+


Najpierw musimy pobrać GDI+, najlepiej jak od razu wrzucę wersję już przekształconą pod MinGW(Dev C++), trzeba było dokonać kilku poprawek, gdzieś tam dopisać std::, gdzieś dodać #include <algorithm>, bo nie widział funkcji min i max, ogólnie parę takich drobiazgów, dodatkowo trzeba przekształcić bibliotekę lib na jej odpowiednik dla MinGW...

DOWNLOAD GDI+ pod MinGW:
http://lublin.webd.pl/crayze/cpp-winapi/download/gdiplus.rar

Po rozpakowaniu w folderze Includes mamy pliki nagłówkowe, które trzeba przekopiować do folderu z plikami nagłówkowymi, najlepiej utworzyć tam drugi folder z plikami Gdiplus, aby nie robić i tak już sporego bałaganu w folderze include, ja umieściłem w takiej ścieżce pliki nagłówkowe: F:\Programy\DevCpp\include\GDIPlus

W folderze Lib mamy bibliotekę libgdiplus.a, którą oczywiście umieszczamy u folderze lib z innymi bibliotekami w Dev C++.

Mamy jeszcze bibliotekę DLL gdiplus.dll. To biblioteka GDI+ dla systemu Windows. Ponieważ GDI+ jest automatycznie umieszczony dopiero od Windows XP, we wcześniejszych wersjach musimy mieć tą bibliotekę, aby GDI+ działo. Tą bibliotekę polecam umieszczać w jednym folderze z programem z GDI+, ewentualnie możemy umieścić ją w folderze systemowym, aby LoadLibrary mogła ją załadować, jednak opcja z biblioteką w folderze będzie chyba prostsza :>

Projekt GDI+


Tworzymy nowy projekt Win32. Pierwszą rzeczą jest dołączenie folderu z plikami nagłówkowymi GDI+ do przeszukiwanych folderów, dodajemy go w opcjach projektu, dodając odpowiednią ścieżkę. Kolejno wybieramy Opcje projektu-> Pliki/katalogi-> Katalogi plików nagłówkowych i dodajemy tam odpowiedni wpis(ścieżkę).

Następnie musimy dołączyć do projektu naszą bibliotekę statyczną, możemy to zrobić także w opcjach projektu: Opcje projektu-> Parametry i w polu Konsolidator(Linker) wpisujemy linijkę:
-lgdiplus

Teraz nam pozostaje już tylko kod, musimy dołączyć odpowiednie pliki nagłówkowe. Pierwszym wymogiem jest dołączenie #include iostream, musi być on dołączony przed Gdiplus.h. Następnie rzecz jasna dołączamy windows.h, a po nim Gdiplus.h. Tutaj mała uwaga, nie możemy definiować stałej WIN32_LEAN_AND_MEAN, bo rzecz jasna spowoduje to masę błędów. Następnie dobrze jest sobie zdefiniować przestrzeń nazw Gdiplus, gdyż całe GDI+ jest w tej przestrzeni.
#include <iostream>
#include <windows.h>
#include <Gdiplus.h>
 
using namespace Gdiplus;
...


Używanie GDI+


Ponieważ GDI+ jest dołączane dynamicznie, musimy wywołać funkcję, inicjujacą i zwalniajacą podczas działania programu:

#include <iostream>
#include <windows.h>
#include <Gdiplus.h>
 
using namespace Gdiplus;
 
ULONG_PTR GDIPlusToken;
 
void InitGdiplus()
{
  GdiplusStartupInput GDIStart;
  GdiplusStartup(&GDIPlusToken,&GDIStart,0);
}
 
void FreeGdiplus()
{
  GdiplusShutdown(GDIPlusToken);
}
 
...


Teraz nam już zostaje zapoznać się z nowo zainstalowanym interfejsem, zapraszam do lektury:
http://msdn2.microsoft.com/en-us/library/ms533798%28VS.85%29.aspx

Tym sposobem mamy GDI+ teoretycznie niekompatybilny w MinGW, działający pod MinGW :>
Życzę udanych i ciekawych efektów graficznych...