Program ve windows se od dosu liší jen málo :


Váš první program pro windows
    Spusťte si C++ (předpokládám, že máte verzi 6.0 nebo 5.0) Z menu File vyberte New,
    Zobrazí se okno, z něj vyberte záložku Projects, Win 32 Application a do pole Name
    napište název projektu (bez mezer) a dejte OK. V okně nalevo zhruba uprostřed vyberte
    záložku Files, klepněte pravým myšítkem na název projektu, vyberte Add Files To
    Project, napište jméno nového souboru (main.cpp) a dejte OK. Program se zeptá, zda
    jej chcete vytvořit a soubor je v projektu. Stačí poklepat a můžete psát.
    Zkompilujete to zase tlačítkem
    
A spustíte tlačítkem
Každý takto vytvořený program musí mít funkci WinMain() jak tato funkce skončí, skončí i program (jako v dosu). Narozdíl od dosu však program nemá jen main, ale má i tzv. smyčku událostí. Do té windows posílají události - když uživatel na něco klikne, zmáčkne klávesu nebo zavře program. Náš první program bude vypadat nějak takhle :

#include <windows.h>

LRESULT CALLBACK Moje_Smycka_Zprav(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdline, int nCmdShow)
{
    char *szAppName = "Ahoj !";
    WNDCLASSEX wndclass;
    HWND hwnd;
    MSG msg;

    wndclass.cbSize        = sizeof(wndclass);
    wndclass.style         = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc   = Moje_Smycka_Zprav;
    wndclass.cbClsExtra    = 0;
    wndclass.cbWndExtra    = 0;
    wndclass.hInstance     = hInstance;
    wndclass.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wndclass.hCursor       = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
    wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName  = 0;
    wndclass.lpszClassName = szAppName;
    wndclass.hIconSm       = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
    RegisterClassEx(&wndclass);

    hwnd = CreateWindow(szAppName,
        "Ahoj",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, // pozice
        320, 200, // rozmery
        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    // zobrazi okno

    while(GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    // smyčka zpráv

    return msg.wParam;
}

LRESULT CALLBACK Moje_Smycka_Zprav(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    RECT rect;
    HDC hdc;
    
    switch(iMsg) {
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        // Začátek kreslení

        GetClientRect(hwnd, &rect);
        // Načte rozměry okna

        DrawText(hdc, "Willy je silnější než ty !", -1, &rect, 
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        // vypíše text

        EndPaint (hwnd, &ps);
        // konec kreslení
    case WM_KEYDOWN:
        if(wParam == 27)
            PostMessage(hwnd, WM_CLOSE, 0, 0); // Escape
        return 0;
        
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
Pokud toto zkompilujete, dostanete jednoduché okno, které po stisknutí escape skončí. Teď si to trochu osvětlíme : LRESULT CALLBACK Moje_Smycka_Zprav(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); Je funkční prototyp funkce volané z WinMain. Nyní ta WinMain : HWND hwnd; je handle okna (identifikátor) MSG msg; je zpráva windows (kliknutí, klávesa ...) WNDCLASSEX wndclass; je třída okna Ty další věci jsou nastavení okna - barva pozadí, myš, ikona ... RegisterClass(&wndclass); říká windows, že se chystá okno CreateWindow(...) je funkce, která vytváří vlastní okno Klidně si ji najděte v Helpu ... (lze použít i CreateWindowEx) ShowWindow, UpdateWindow dokončí práci a okno je na světě. Toto je smyčka zpráv : while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } Tato věc předává zprávy od Windows do okna. Pokud přijde zpráva s kódem WM_CLOSE, smyčka skončí, pak se ještě na závěr ještě zavolá WM_DESTROY (okno už neexistuje) a return, kterým WinMain (i program) končí Teď funkce vlastní smyčky zpráv : HDC hdc; Kontext obrazovky zařízení RECT rect; Pravoúhelník - kvůli kreslení PAINTSTRUCT ps; Proměnná pro kreslení switch(iMsg) Identifikuje zprávu (událost) WM_PAINT Kreslení do okna lze explicitně vyvolat funkcí InvalidateRect(TRUE); To true je, že se okno vymaže, pokud to tak nechcete, dejte FALSE WM_KEYDOWN Stisk klávesy, ve wParam je ascii kód WM_DESTROY Ničení okna Těchto zpráv je opravdu hodně (kolem 100), nebudu je vypisovat najděte si je sami v nápovědě. Parametry funkce WinMain U winmain je to dost podobný, ale rozdíly tu jsou. Parametry jsou totiž uloženy v szCmdLine (PSTR je jako char*) za sebou (tak jak byly v příkazové řádce). Jinak to je stejný. Můžete zkusit udělat jednoduchý spořič - parametry spořiče jsou : /s - normální spoření /a - náhled do malého okna /c - nastavení /p - heslo Přidávání Resource Napřed to zkusíme s ikonou ;-) ... Dáte z menu Insert -> Resource, objeví se dialog, vyberete Icon a dáte New. Otevře se okno s názvem Resource script dáte dvě disketky za sebou (save all) a uložíte soubory pod názvem Resource.rc a Resource.h. Pak klepneme na kartě FileWiew pravým myšítkem a dáme Add files to project, přidáme Resource.rc a Resource.h. Vedle fileview by se teď mělo objevit resourceview. Pokud tam kliknete, uvidíte strom a někde v něm ikonu IDI_ICON1. To můžete dvojklikem upravit, nebo pravým myšítkem a preferences upravit. Na začátek main.cpp přidáme :

#include "resource.h"
A upravíme řádky :

wndclass.hIcon    = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wndclass.hIconSm  = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
Na :

wndclass.hIcon    = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wndclass.hIconSm  = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON1));
Pokuď teď projekt zkompilujete, okno bude mít vaši ikonku. Stejně se to dělá s kurzorem : Na kartě resources pravé myšítko, Insert .., V dialogu vyberete Cursor, můžete si vybrat ze základních, nebo ho importovat ze souboru (je dobré si ho zkopírovat do adresáře projektu, příp. si udělat podadresář na resource ...) Jak se vám kurzor objeví v kartě resource, můžete ho vložit změnou řádku :

wndclass.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
To IDC_ARROW je implicitní Windowsovská šipka (ta kterou normálně máte) Na :

wndclass.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_CURSOR1));
Zkuste si třeba importovat kurzor z wingdows (v podadresáři cursors ve složce windows). Nevím, jak to dopadne s animovaným, ale normální kurzor to vezme - však si to sami vyzkoušejte ;-) Nyní bude mít po kompilaci okno váš kurzor. Kurzor můžeme taky skrýt. To se provádí funkcí : ShowCursor(BOOL); To BOOL je boolean - je buď TRUE, nebo FALSE. Objevení kurzoru je vhodné dát do zprávy WM_DESTROY, skrytí do WimMain. Tak je to třeba u spořičů ... Přidávání menu Menu přidáte stejným způsobem, jako kurzor nebo ikonu, v resource si vytvoříte nabídky (jde to hezky), a pojmenujete si je. Dělá se to tak, že na začátku dvojklikem v resource na ikonku menu spustíte editor, pak kliknete na označený první obdélníček, pravé myšítko, properties, do name dáte třeba IDM_KONEC, do caption "&Konec" (ten ampresand znamená, že a bude podtržené a menu půjde vyvolat pomocí Alt + K. Teď to uložíme, s klidem zavřeme okno a doplníme trochu kódu. Místo :

wndclass.lpszMenuName = 0;
Bude :

wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
// nebo, jak se to menu jmenuje ...
A do funkce Wokno přidáme :

case WM_COMMAND: // menu spadá pod zprávu WM_COMMAND
    if(wParam == IDM_KONEC) { // IDM_KONEC bylo jméno položky v menu
        if(MessageBox(hwnd, "Opravdu chcete skončit ?", "Koniec", MB_YESNO) == IDYES)
            PostMessage(hwnd, WM_CLOSE, 0, 0);
    }
    return 0;
Ta funkce MessageBox je normální okno s otázkou (hlášením) - najděte si ji v nápovědě. Zde také vidíte využití binárního Or :-) Odteď bude program na příkaz z menu reagovat dotazem, jestli to myslíte vážně, a pokud ano - skončí. To byl váš první program ve win, tak doufám že se vám líbil a zase příště. -tHE SWINe-
Zpátky