Wydawać by się mogło, że każde okno to mogła by być oddzielna klasa w systemie, tak jak w programowaniu obiektowym z użyciem klas w C++. Odrazu mówię WinAPI nie ma klas. Dlaczego, przecież to byłby najprostrzy sposób przentacji tego typu danych? Dlatego, że WinAPI było pisane w języku C, a nie C++. W C nie ma żadnych klas, bo to język tylko strukturalny, a nie obiektowy. Jest to rozwiązane w inny sposób. My pracując z jakimś obiektem, dla przykładu weźmy, że pracujemy z oknem. Najpierw musimy stworzyć okno(obiekt) w pamięci komputera, robimy to poprzez wywołanie systemowej funkcji, która do tego służy. Ta funkcja tworzy nam okno, które jest jakimś zbiorem danych w pamięci, a my dostajemy do tego okna(obiektu) specjalny numer, po którym możemy się odwołać do niego. Programując w WinAPI, musimy mieć świadomość, że nie operujemy bezpośrednio na danych okna, ale funckje, których używamy odwołują się do tych danych poprzez numer tej danej i to właśnie taki numer może przechowywać nasz program, a do samych danych obiektu nasz program nie ma dostępu.

Uchwyty

Tutaj dochodzimy do nowego pojęcia. Uchwyt to właśnie numer obiektu, o którym była mowa wyżej. Nasz program tworząc okno, dostaje numer tego okna(inaczej uchwyt okna) i nic więcej, nasz program nie ma dostępu do okna, ale ma numer okna, które utworzył i to właśnie poprzez taki numer(uchwyt), funkje systemowe operują na tych obiektach. Ponieważ nasz program nie ma dostępu do obiektu, przed zakończeniem swojej pracy powinien zwolnić obiekt, wywołując funckję systemową, przeznaczoną do tego. Wszystkie obiekty utworzone, poprzez fucnkje, powinny zostać potem zwolnione, przez odpowiendie funckje. Sytuacja ma się tutaj podobnie jak z dynamicznym przydziałem pamięci.

Typy zmiennych WinAPI

WinAPI posiada zdefiniowaną swoją gamę nazw typów zmiennych. Wszystkie typy zmiennych WinAPI, składają się z wielkich liter i w większości przypadków tylko tym różnią się od tych typów z C++.

1. Liczby:

WinAPI - C++
INT - int
FLOAT - float
DOUBLE - double
CHAR - char
BOOL - bool
VOID - void
LONG - long
SHORT - short
CONST - const

Czym różnią się zmienne z WinAPI i C++? Tutaj odpowiedź jest prosta, różnią się tylko nazwą. W rzeczywistości nie ma różnicy pomiędzy INT, a int. Inne jest tylko pochodzenie nazwy typu, bo pierwsza pochodzi z WinAPI, natomiast druga z C++. Po co Microsoft wprowadzał swoje nazwy typów? Dlatego, że z definicji wszystkie typy w WinAPI mają być z dużych liter, dlatego Microsoft musiał zmienić nazwy typów z C++ i przerobić je na wielkie litery. Podczas pisania programów, nie ma różnicy czy napiszemy nazwę typu z dużej litery(WinAPI), czy z małej(C++), w rzeczywistości są to takie same typy zmiennych.

2. Liczby bez znaku:

WinAPI - C++
UINT - unsigned int
DWORD - unsigned int
WORD - unsigned short int
BYTE - unsigned char

Dodatkowo programiści Microsoftu zadbali, abyśmy nie musieli męczyć się z wpisywaniem unisgned, gdy chcemy skorzystać z liczb bez znaku, więc zadeklarowili oni nowe typy, liczb naturalnych. W praktyce te typy są najczęściej wykorzystywane, bo w większości przypadków nie zależy nam na znakach liczb, wystarczą nam tylko liczby dodatnie.

Tutaj warto zwrócić uwagę na nazewnictwo danej zmiennej. Zacznijmy od UINT. Jest to poprstu Unsigned INT(int bez znaku). Jego wielkość jest zależna od rodzaju systemu, w systmach 16 bitowych, int składał sie z 16 bitów, analogicznie w systemach 32 bitowych składa się z 32 bitów(4 bajtów).

Teraz zajmijmy się zmienną BYTE. Jej nazwa to poprostu "bajt", czyli odrazu wiadomo po nazwie ile zajmuje, 1 bajt czyli 8 bitów.

Zmienna WORD("słowo" ang.), oznacza liczbę składającą się z dwóch bajtów(16 bitów). Nazwa ta pochodzi jeszcze z czasów systemów 16 bitowych. Na słowo("WORD") składają się 2 bajty.

I ostatnia ciekawa zmienna, DWORD. Jej pełna nazwa to "Double Word", czyli "podwójne słowo", ale lepiej brzmi tłumaczenie "dwusłowo" i takiego terminu używa się potocznie. Na dwusłowo składają się 2 słowa(WORD), czyli w sumie DWORD składa się z 4 bajtów(32 bity). Dodam, że jest to chyba podstawowa zmienna w systemie 32 bitowym.

Ten obrazek może zobrazować wielkości poszczególnyc zmiennych:

3. Inne typy zmiennych w WinAPI

Tutaj poznamy parę innych typów używanych w WinAPI:

COLORREF - jest to zmienna na składową kolorów, składa się z 32 bitów, na temat składowych kolorów będzie więcej w dziale GDI.
CALLBACK - Jest to specjalny przedrostek dla zmiennej, używa się go w przypadku funkcji, a oznacza on to, że funkcja może być wywoływana z zewnątrz, co zwykle oznacza, że funkcję tą będzie wywoływał system, jej odpowiednikiem w C++ jest słowo "__stdcall".
LPARAM - jest to typ na dane, które są przekazywane razem z komunikatrem, więcej na temat tej zmiennej w kolejnych lekcjach.
WPARAM - jest to typ na dane, które są przekazywane razem z komunikatrem, więcej na temat tej zmiennej w kolejnych lekcjach.
LRESULT - jest to rezultat działania niektórych funkcji systemowych.

3. Wskaźniki

W WinAPI zdefiniowano wskaźniki jako odzielne typy. Większość zmiennych ma zdefinniowane wskaźniki, gdy chcemy zadeklarować wskaźnik na zmienną, na początku nazwy dodajemy "P" lub "LP",

np. wskaźnik na INT, będzie wyglądal tak: LPINT,
wskaźnik na VOID, to LPVOID, itd...
LPSTR - wskaźnik na tablicę znaków, odpowiednikiem tego typu w C++ jest: *char
LPCSTR - wskaźnik na stałą tablicę znaków, odpowiednik z C++: const *char

4. Uchwyty

Na temat uchwytów była mowa na początku tej lekcji. Jest to identyfikator stworzonego obiektu. Ten idnetyfikator to liczba 32 bitowa, każdy obiekt w systemie ma swój numer, dzięki niemu program może się do danego obiektu odwołać. Wszystkie uchwyty zaczynają się na literę "H".

HANDLE - jest to nieokreślony identyfikator, nie wiemy na jaki rodzaj obiektu wskazuje.
Oto kilka przykładowych uchwytów, których w WinAPI nie brakuje:
HWND - uchwyt do okna.
HINSTANCE - uchwyt do procesu.
HDC - uchwyt do kontekstu urządzenia.
HMENU - uchwyt do menu.
HICON - uchwyt do ikony.
HCURSOR - uchwyt do kursora.
Jest ich jescze więcej, ale resztę poznamy przy konkretnym zatosowaniu.

No to chyba tyle na temat zmiennych w WinAPI.