Po minulém teoretickém úvodním díle se konečně ponoříme trochu do kódu, ukážeme si, jak vytvořit úplně nejjednodušší aplikaci ve Win32 API a taky si ukážeme, jak vytvořit hlavní okno aplikace. Samozřejmě si to vše pořádně a podrobně popíšeme a vysvětlíme.
Tak hurá do toho :-)
Hned ze začátku bych chtěl zavést malé zjednodušení: psát neustále Win32 API je trochu unavující, tudíž budu používat zkrácený zápis "API". Napíšu-li tedy "API", mám na mysli "Win32 API", pokud bych někdy mluvil o jiném API, včas na to upozorním.
Tak a teď už honem do toho :-)
Ještě než úplně začneme, řekneme si, jak vytvářet projekt. Vytváří se stejně jako pro textový režim. Chtěl bych znovu připomenout, že používám Dev-C++.
Tedy: Soubor ->Nový ->Projekt... Zde si označíme Empty project, zadáme jméno projektu a klepneme na OK. Poté už jen přidáme nový cpp source file a můžeme psát.
Jak to bylo
Jistě si pamatujete na základní konstrukci programu ve znakovém režimu. Připomeňme si:Pro C:
#include <stdio.h>
int main()
{
printf("Ahoj svete
");
return 0;
}
Nebo pro C++:#include <iostream>
int main()
{
std::cout << "Ahoj svete
";
return 0;
}
A nyní
Ve Windows je to hodně podobné:#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("Ahoj světe"), TEXT("Programujeme"),0);
return 0;
}
A toto je vlastně ta naše slibovaná nejjednodušší aplikace v API. Zkuste si tento kód vepsat do projektu a zkompilovat. Měla by se vám zobrazit zpráva s textem a tlačítkem OK.
No není to úžasný? :-)
Tato windows verze programu „Ahoj světe“ se skládá z úplně stejných částí jako verze textová. Má příkaz include, vstupní bod programu, volání funkce, ale i příkaz return.
Teď si tento kód popíšeme a porovnáme s verzí pro textový režim.
Hlavičkový soubor "stdio.h/iostream" byl nahrazen souborem "windows.h". Výchozí místo programu "main" bylo změněno na "WinMain" a místo "printf/cout" jsme nahradily funkcí "MessageBox" z Windows API. Ve skutečnosti jsou v tomto kódu ještě další dvě nové funkce a několik identifikátorů psaných velkými písmeny.
Podívejme se na to zblízka.
Hlavičkový soubor "windows.h" je hlavní vkládaný soubor, který obsahuje ostatní windows hlavičkové soubory. Některé z nich obsahují další hlavičkové soubory. Nejdůležitější z nich jsou tyto:
windef.f /definice základních typů
winnt.h /definice typů pro podporu kódování UNICODE
winbase.h /funkce jádra (kernel)
winuser.h /funkce uživatelského rozhranní
wingdi.h /funkce pro zařízení grafického rozhranní
Tyto hlavičkové soubory definují všechny datové typy pro Windows, volání funkcí, datové struktury a identifikátory konstant. Zkuste se do nich třeba někdy podívat, hodně z nich člověk pochytí :-)
Tak jako je pro textový režim výchozí bod programu main, je jím pro Windows WinMain, který má obvykle takovýto tvar:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,
int iCmdShow)
Je definován v souboru „winbase.h“.
Funkce WinMain je deklarována tak, aby vracela hodnotu typu int. Identifikátor WINAPI je definován v hlavičkovém souboru „windef.h“ příkazem:
#define WINAPI __stdcall
Tento zápis určuje volací konvenci, která určuje, jak bude generován strojový kód pro uložení argumentů funkce na zásobník v okamžiku volání funkce. Většina volání funkcí Windows je právě deklarována jako WINAPI.
První parametr funkce WinMain se nazývá "handle instance". Z pohledu programátora je handle číslo, které aplikace používá pro identifikaci všeho. V tomto případě označuje program. Je třeba ho zadávat jako parametr při volání některých funkcí Windows.
Ve starších verzích Windows se mohlo stát, že při opakovaném spuštění stejného programu se vytvořila vícenásobná instance programu. Všechny instance pak sdílely kód a paměť určenou jen pro čtení (obvykle zdroje, nabídky a šablony dialogů). Program mohl rozhodnout, zda běží další instance programu otestováním druhého parametru "hPrevInstance". Potom může přeskočit některé kroky a některá data přesunout z předchozí instance do své datové oblasti.
Ve 32bitových Windows se od tohoto upustilo.
Druhý parametr funkce WinMain je vždy "NULL" (definován jako 0). Je zde zachován jen kvůli zpětné kompatibilitě. My ho budeme mít vždy NULL.
Třetím parametrem je příkazový řádek používaný pro spuštění programu. Některé aplikace Windows používají tento parametr např. pro nahrání souboru do paměti během startu programu.
Čtvrtý parametr určuje, jak bude program poprvé zobrazen – buď normálně nebo maximalizovaný, aby vyplnil celé okno, nebo minimalizovaný pro zobrazení na hlavním panelu. Někdy později si povíme, jak s tímto parametrem pracovat.
Funkce MessageBox
Funkce MessageBox je určena k zobrazování krátké textové zprávy. První parametr je obvykle handle okna, pro které se zpráva zobrazuje. My jsme použili NULL, poněvadž jsme ještě žádné okno nevytvořili. Druhý parametr je textový řetězec, který se objeví uvnitř okna. Třetí parametr je text, který se má zobrazit v záhlaví dialogu zprávy.
Řetězce jsme uzavřeli do makra "TEXT".
Normálně se nemusí všechny řetězce uzavírat do makra "TEXT", ale pro budoucí převod programu do znakové sady UNICODE je to dobrý zvyk a předpokládám, že dnes již asi každý používá NT verze Windows, tak bude dobré tuto podobu používat vždy. Někdy si o znakových sadách řekneme více.
Čtvrtý parametr může být kombinace konstant začínající předponou MB_, které jsou definovány v hlavičkovém souboru "winuser.h". Když bude čtvrtý parametr nastaven na 0, bude se zobrazovat standartně jen tlačítko OK. Koukněte se do souboru „winuser.h“ a prohlédněte si konstanty. Dají se spojovat, takže pokud chcete zobrazit tlačítko/a a k tomu nějakou ikonu, stačí konstanty spojit znakem "+". Takže chcete-li použít zprávu s tlačítky "Ano" a "Ne" a ikonou "I" informace, napíšete čtvrtý parametr takto:
MB_YESNO+MB_ICONINFORMATION
Zkuste.
Funkce MessageBox v našem programu vrací 1, ale správně spíš vrací „ID_OK“. I to je uvedeno v souboru „winuser.h“, kde je konstantě „ID_OK“ přiděleno číslo 1.
Pro dnešek by to na ukázku stačilo a v příštím díle si již vytvoříme hlavní okno aplikace.