C++: Můj první program pro Windows



Podobné dokumenty
Gabriela Janská. Středočeský vzdělávací institut akademie J. A. Komenského

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

Formátování pomocí stylů

aneb velice zjednodušené vysvětlení základních funkcí a možností systému Vypracoval: Tomáš Dluhoš tomas.d@centrum.cz

GUI ve Win32API a MFC I KIV / WIN

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 2. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

Gymnázium Ostrava Hrabůvka, příspěvková organizace Františka Hajdy 34, Ostrava Hrabůvka

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý

II. Elektronická pošta

Spuštění a ukončení databázové aplikace Access

Popis rozšířujících funkcí JScriptu

Návod na tvorbu časové přímky v programu Microsoft PowerPoint 2013

8. OKNA 73. obr. 1 Roletové menu "Okna"

Popis ovládání aplikace - Mapový klient KÚPK

Práce v programu Word 2003

Ignijet_2007 Externí monitor

Základní nastavení systému Windows 7

2 PŘÍKLAD IMPORTU ZATÍŽENÍ Z XML

Konvertor diakritiky 3. Instalace

DUM 06 téma: Tvorba makra pomocí VBA

MS SQL Server 2008 Management Studio Tutoriál

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako.

THEOPHILOS. (návod k použití)

Prostředí Microstationu a jeho nastavení. Nastavení výkresu

01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

GOODWILL vyššší odborná škola, s. r. o. P. Holého 400, Frýdek-Místek

Tabulkový procesor. Orientace textu. O úroveň níž O úroveň výš

Reliance 3 design OBSAH

Vytvoření tabulky: V následujícím okně si editujete okno tabulky. Vyzkoušejte si viz podklad Cv_09_Podklad_tabulka.xls a Cv_09_Tabulka.dwg.

OPERAČNÍ SYSTÉM. základní ovládání. Mgr. Jan Veverka Střední odborná škola sociální obor ošetřovatel

Microsoft Word - Styly, obsah a další

Microsoft Office PowerPoint 2003

MS Word 2007 Šablony programu MS Word

Administrace webu Postup při práci

František Hudek. březen ročník

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

PRÁCE S TEXTOVÝM EDITOREM 6.4 TEXTOVÉ POLE

STATISTICA Téma 1. Práce s datovým souborem

Kapitola 11: Formuláře 151

1. Základní pojmy, používané v tomto manuálu. 2. Stránky

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Návod k aplikaci DPH Kontrol

FORMÁTOVÁNÍ 2. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen Ročník: sedmý. Vzdělávací oblast: Informatika a výpočetní technika

9. Práce s naskenovanými mapami

Word 2007 pro začátečníky

Začínáme pracovat s tabulkovým procesorem MS Excel

Programování v jazyku LOGO - úvod

Tiskové sestavy. Zdroj záznamu pro tiskovou sestavu. Průvodce sestavou. Použití databází

3 Makra Příklad 4 Access Ve vytvořené databázi potřebuje sekretářka společnosti Naše zahrada zautomatizovat některé úkony pomocí maker.

Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky. PORTÁL KUDY KAM. Manuál pro administrátory. Verze 1.

Úvodní příručka. Správa souborů Kliknutím na kartu Soubor můžete otevřít, uložit, vytisknout a spravovat své soubory Wordu.

Programy pro OS Windows

ANS orientace v aplikaci a pokladně

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec

Obsah Úvodem... 5 Co je to vlastně formulář... 6 Co je to šablona... 6 Jak se šablona uloží... 6 Jak souvisí formulář se šablonou...

NÁVOD NA OBSLUHU INTERNETOVÉ PREZENTACE. Ataxo Czech s.r.o.

Informační a komunikační technologie pro učební obory ME4 a SE4. Makra

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Vzorce. Suma. Tvorba vzorce napsáním. Tvorba vzorců průvodcem

StatSoft Jak vyzrát na datum

EDITOR ADMINISTRACE WEBU PF UJEP

Obr. P1.1 Zadání úlohy v MS Excel

Základní vzorce a funkce v tabulkovém procesoru

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 6. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Návod k ovládání aplikace

Hromadná korespondence

Microsoft Office Excel 2003

Nástroje v InDesignu. Panel nástrojů 1. část. Nástroje otevřeme Okna Nástroje

Programujeme v softwaru Statistica

8 Makra Příklad 4 Excel 2007

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 7

Vkládání dalších objektů

METODICKÝ POKYN PRÁCE S MS PowerPoint - ZAČÁTEČNÍCI. Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky.

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Manuál k programu KaraokeEditor

Pro definici pracovní doby nejdříve zvolíme, zda chceme použít pouze informační

Cvičení 7: Delphi objekty CheckedBox, Radio- Button, EditBox

Microsoft. Word. Hromadná korespondence. Mgr. Jan Veverka Střední odborná škola sociální Evangelická akademie

y v TimeMakeru

Visual Basic for Application

Proces editace JOSM. Tato příručka může být stažena jako josm_more-about-josm_en.odt or josm_more-aboutjosm_en.pdf

Registrační číslo projektu: Škola adresa: Šablona: Ověření ve výuce Pořadové číslo hodiny: Třída: Předmět: Název: MS Excel I Anotace:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

INFORMATIKA PRO ZŠ. Ing. Veronika Šolcová

METODICKÝ POKYN PRÁCE S MS PowerPoint - POKROČILÍ. Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky.

Základní škola Hluk výukové texty MS Word 2007

Manuál: Editace textů v textovém editoru SINPRO Úprava tabulek a internetových odkazů, řádkování

MS PowerPoint ZÁKLADY

Rámcový manuál pro práci s programem TopoL pro Windows

Přílohy. Příloha 1. Obr. P1.1 Zadání úlohy v MS Excel

Vytvoření tiskové sestavy kalibrace

Projektová dokumentace GED 2006

WEBOVÉ STRÁNKY ŠKOLY A REDAKČNÍ SYSTÉM

ČÁST 1. Základy 32bitového programování ve Windows

Multimediální prezentace MS PowerPoint I

Transkript:

C++: Můj první program pro Windows Seznámení s programovacím jazykem C++ pro Windows a naše první aplikace Hello World Jazyk C++ je díky objektům, ukazatelům a podobným srandičkám velice silný jazyk, a proto je požíván i pro programování ve Windows. V tomto seriálu (doufám) základů programování ve Windows se budeme věnovat neobjektovému programování, protože je to, dle mého názoru, nejjednodušší způsob, jak začít výuku základů programování pro Windows. A protože začínáme bez objektů, nebudeme používat Microsoftí VC (zajímalo by mě, kolik procent čtenářů jej má legálně) a využijeme nástroj, který je zdarma (GNU), a to Bloodshed Dev-C++. K dispozici je aktuálně verze 4 včetně patche na 4.01. Programovat budeme v konvenci ANSI, tudíž by programy, které zde naleznete, by měly být přenositelné i na jiné kompilátory pro Windows. Tento tutoriálnek předpokládá, že znáte alespoň trochu počítačovou angličtinu. Jeden podstatný rozdíl mezi programováním pro DOS a Windows je, že pro Windows použijeme namísto hlavní funkce main funkci WinMain a to nejlépe v tomto tvaru: int STDCALL WinMain( HINSTANCE hthisinstance, HINSTANCE hprevinstance, LPSTR lpszargument, int nfunsterstil ) Několik odlišností zde je. Např. STDCALL za deklarací vrácené hodnoty (kterou Windows nepoužívají). Tímto nadeklarujete, že funkce je volána standardním způsobem. Narozdíl od funkce main jsou zde parametry 4. hthisinstance - struktura daná typem HINSTANCE, handle (rukojeť) na tuto instance aplikace hprevinstance - handle na instanci předchozí aplikace lpszargument - ukazatel na řetězce argumentů příkazové řádky (ve Windows se moc nepoužívá) nfunsterstil - styl, kterým by Windows chtěly zobrazit naše okno Poznámky: Instance aplikace: Máte např. Hello World a spustíte jej víckrát, tzn. že máte několik instancí té samé aplikace. Parametry (argumenty) příkazové řádky vytvoří Windows např. když na ikonu programu přetáhnete jiný soubor. Dále programy pro Windows využívají hlavní proceduru okna o které se zmíním v příštím díle, protože nechci úvodní program příliš komplikovat. Takže se pustíme do samotné tvorby programu Hello World. Pokud už máme Dev-C++ nainstalované, vybereme z menu File položku New project a klikneme na ikonu projektu WinMain() Project. Ještě se ujistíme, že je vybrán C++ projekt a klikneme na OK. Zadáme Hello World a vybereme, kde se projekt vytvoří, nejlépe v nějaké prázdné složce. Teď již máme vytvořen projekt a editor nám automaticky otevřel okno Untitled1, které raději uložíme jako např. main.cpp do složky s projektem, a to v menu File - Save unit as... V souboru main.cpp můžete vidět standardní připojení hlavičkového souboru windows.h a hlavní funkci WinMain, která vrací nulu. Ve skutečnosti se k programu linkuje ještě jeden soubor, a to rsrc.o, který vznikne zkompilováním zdrojů, které můžeme editovat přes menu: Project - Edit resource file. Jak můžete vidět, je zde jen jedna položka, a to ikona, kterou můžete nahradit zde nebo v nastavení projektu: Project - Project options. Přistoupíme k samotnému Hello World. Úplně nejjednodušší cesta je zavolat funkci MessageBox, která je součástí Windows API a její kód je umístěn ve standardních knihovnách Windows, což nás v tuto chvíli nemusí zajímat. Klikneme do volného řádku nad příkazem return nebo tam, kam chceme kód vložit, a k zavolání můžeme použít průvodce obsaženého v Dev-C++: Vybereme z menu Edit - Insert - MessageBox a ve vybraném okně vhodně zvolíme, co potřebujeme. Do políčka dialog title napíšeme titulek dialogu např. Můj program, do editboxu napíšeme text např. Hello World a vybereme, která tlačítka budeme v dialogu chtít a které chceme mít aktivní, popř. Ikonu a modálnost okna (vysvětlím někdy v příštím díle, stačí ponechat Application modal). Pokud zaškrtnete tlačítko advanced options, můžete si zvolit některé další parametry, které však nabízí jen Win 95 a vyšší. Dialog vložíte do programu kliknutím na OK. Program by tedy měl vypadat nějak takto: #include <windows.h> int STDCALL WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR lpcmd, int nshow) {

MessageBox (NULL, "Hello World", "Můj program", 0 + MB_OKCANCEL + MB_ICONASTERISK); return 0; Program zkompilujete stiskem kláves Ctrl+F9 nebo výběrem Compile z menu Execute. Tímto získáte velmi malý exe soubor narozdíl několika desítek kilový soubor v delphi nebo i megový soubor ve VC++. Tento soubor již můžete spustit a pochlubit se s ním komukoliv. Myslím však, že s tímto programem na dlouho spokojeni nebudete. Základ programování v C++ (2.) Druhý díl o základech programování v jazyce C++, tentokrát o nejdůležitější části programů pro Windows - smyčka zpráv Protože všechny procesy Windows komunikují zprávami, je u všech programů, které píšeme, nutné tyto zprávy zpracovávat. Každý program, který k něčemu využívá svůj hlavní proces, by měl obsahovat smyčku, která "vytáhne" zprávu z fronty zpráv daného procesu a předá ji ke zpracování a která se ukončí po obdržení ukončovací zprávy. Je zde však jeden problém: Pokud program pracuje na nějakém složitém výpočtu, měli byste jej nechat zobrazit dialog se zprávou nebo, a to je nejvýhodnější řešení, v hlavním okně vytvořit indikátor zpracování výpočtu, protože pokud program déle neodpovídá na žádnou zprávu, nebo pokud se jeho fronta rapidně prodlouží, můžete při stisku Ctrl-Alt-Delete vidět, že program neodpovídá. Nervózní uživatel by se jej mohl takovýmto způsobem pokusit zavřít a ztratit tak důležitá data. Použitím standardního Windowsovského indikátoru (modré čtverečky), tento problém odpadne, protože tento proces obsahuje vlastní smyčku zpráv a pokud výpočet není nijak extrémě náročný, stihne odpovídat i na zprávy. Teď jak taková standardní smyčka zpráv vypadá: while(getmessage(&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); Tato smyčka se opakuje, dokud funkce GetMessage nevrátí nulu. GetMessage vrátí nulu v případě, že tento proces obdrží zprávu WM_QUIT, která mu oznamuje, že si Windows přejí tento program ukončit. Funkce TranslateMessage provádí to, že překládá hodnoty virtuálních kláves na zprávy, kterým už vaše procedura okna rozumí. A DispatchMessage provádí jen to, že zprávu pošle proceduře okna, kterou máte zaregistrovanou ve třídě okna (neplést třídy okna Windows s třídami v C++!!!). Podívejme se teď na příklad z prvního dílu: #include <windows.h> int STDCALL WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR lpcmd, int nshow) { MessageBox (NULL, "Hello World", "Můj program", 0 + MB_OKCANCEL + MB_ICONASTERISK); return 0; Pokud tento prográmek spustíte, zjistíte, že ačkoliv zde žádnou smyčku zpráv nemáte, Windows proti delšímu zobrazení dialogu nijak neprotestují. Je to tím, že zde smyčka zpráv vlastně je. Nevěříte? Co udělá tento program při spuštění? Hlavní funkce zavolá MessageBox, a pokud je MessageBox ukončen, program okamžitě skončí. V podstatě Windows mají implmentovánu vlastní smyčku zpráv v každém svém procesu a ve většině funkcí. V tomto případě funkce MessageBox vytvoří dle vašeho přání okno, proceduru okna a smyčku zpráv, která je ukončena po kliknutí na kterékoliv tlačítko a toto tlačítko je vráceno touto funkcí. O tvorbě dialogových oken, procedurách a třídách oken někdy příště.

Základ programování ve C++ a Windows (3.) Třetí díl seriálu, tentokrát na téma Procedura a třída okna Každý uživatelsky obsluhovatelný program pro Windows, by měl mít své okno. Otevření nějakého okna je pro uživatele obvykle známkou toho, že s programem lze nějak pracovat. K naprogramování jednoduchého okna ve Windows není třeba žádných operací s grafikou, vždyť Windows to vše udělají za nás. Vše, co budeme potřebovat, je proměnná typu HWND pro uložení handle na naše okno, struktura MSG pro práci se zprávami našemu oknu a proceduru okna. K přesnějšímu určení vzhledu okna využijeme strukturu WNDCLASSEX, kterou po naplnění předáme Windows. Budeme postupovat přibližně takto: // připojíme vždy potřebný hlavičkový soubor windows.h #include <windows.h> // nadeklarujeme prototyp naší procedury okna LRESULT CALLBACK ProceduraOkna(HWND, UINT, WPARAM, LPARAM); // pro obecné použití při práci s třídami oken char JmenoTridy[ ] = "WindowsApp"; // Klasická WinMain (názvy proměnných jako v Dev-C++) int WINAPI WinMain(HINSTANCE hthisinstance, HINSTANCE hprevinstance, LPSTR lpszargument, int nfunsterstil) { HWND hwnd; /* Handle k našemu oknu */ MSG messages; /* Sem nám Windows ukládají zprávy */ WNDCLASSEX wincl; /* Datová struktura třídy okna */ // Vyplníme strukturu wincl wincl.hinstance = hthisinstance; wincl.lpszclassname = JmenoTridy; wincl.lpfnwndproc = ProceduraOkna; wincl.style = CS_DBLCLKS; wincl.cbsize = sizeof(wndclassex); // Tato procedura je volána Windows // Použijeme standartní ikonu a kurzor wincl.hicon = LoadIcon(NULL, IDI_APPLICATION); wincl.hiconsm = LoadIcon(NULL, IDI_APPLICATION); wincl.hcursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszmenuname = NULL; // Nemáme žádné menu wincl.cbclsextra = 0; wincl.cbwndextra = 0; // Pro pozadí okna použijeme světle šedou barvu (klasická Windows) wincl.hbrbackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); // A vyplněnou třídu okna zaregistrujeme // Pokud se to nepodaří, nemá smysl pokračovat if (!RegisterClassEx(&wincl)) return 0; // Teď vytvoříme vlastní okno hwnd = CreateWindowEx( 0, // Nebudeme využívat žádné rozšířené možnosti JmenoTridy, // Jméno třídy okna "Aplikace pro Windows", // Název okna WS_OVERLAPPEDWINDOW, // Typ okna CW_USEDEFAULT, // Pozici okna zvolí samo Windows CW_USEDEFAULT, 544, // Šířka okna 375, // Výška okna HWND_DESKTOP, // Naše okno má jako rodiče plochu NULL, // Žádné menu hthisinstance, // Handler na instanci programu NULL // Žádná další data ); // Konečně zobrazíme okno

ShowWindow(hwnd, nfunsterstil); // A spustíme standartní smyčku zpráv while(getmessage(&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); return messages.wparam; // Konec WinMain Další věcí, kterou budeme potřebovat, je procedura našeho okna: LRESULT CALLBACK ProceduraOkna(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); // Windows zavírají okno a my ukončíme aplikaci break; default: // Pro zprávy se kterými nebudeme pracovat return 0; return DefWindowProc(hwnd, message, wparam, lparam); Toto je jen velmi zjednodušená smyčka zpráv, Windows posílají každému oknu spoustu různých zpráv s různými parametry. A i naše aplikace může tyto zprávy rozesílat. Na několik základních a nejpoužívanějších zpráv a jak s nimi pracovat nebo je rozesílat se podíváme příště. Základ programování ve Windows a C++ (4.) Výběr několika základních zpráv pro správu oken V minulém díle tohoto tutoriálku jsme si ukázali jak jednoduše vytvořit proceduru okna, která donutí okno zavřít a ostatní parametry přepošle funkcí DefWindowProc standardní obsluze oken. Pokud však budete chtít naprogramovat nějakou složitější aplikaci, např: Word :-), pro komunikaci mezi okny, lištami nástrojů a spoustami dalších elementů vaší aplikace, rozhodně si se standardní obsluhou okna nevystačíte. Zprávy multitaskingu Windows jsou dvojího druhu, klasické a diagnostické. Diagnostické zprávy nemají u většiny kompilátorů definici a programátor by je měl zpracovávat až v případě nejvyšší nouze. Klasických zpráv používaných Windows je velmi mnoho. Pro základní programování vám bude stačit znát jich jen několik desítek a všechny je možné nalézt v referencích k Windows. Windows berou jako okna i jednotlivé prvky jak hlavního okna tak dialogů, z toho vyplývá, že je možné posílat zprávy i těmto objektům. K účelům interakce mezi procesy jsou často využity i parametry zpráv lparam a wparam. Zprávy můžete rozesílat použitím funkce SendMessage s parametry: handle okna, které zprávu má obdržet, zprávu, která se bude posílat, a wparam a lparam této zprávy. K odeslání zprávy prvku dialogového okna (jak s nimi pracovat, si ukážeme v některém z příštích dílů) použijte funkci SendDlgItemMessage s parametry: handle dialogového okna, které zprávu má obdržet, ID prvku dialogového okna, zprávu, která se bude posílat a wparam a lparam této zprávy, vše v uvedeném pořadí. Výběr některých základních zpráv: Zprávy pro správu oken WM_CLOSE WM_CREATE Je poslána vždy, když má být okno zavřeno. Pokud je předána proceduře DefWindowProc, ta zavolá DestroyWindows. Touto zprávou je okno informováno o otevření a o tom, že je možné provést inicializační

WM_DESTROY WM_KILLFOCUS WM_MENUSELECT WM_MOVE WM_QUIT WM_SETFOCUS WM_SETTEXT WM_SIZE operace. Jako parametr je v lparam ukazatel na strukturu CREATESTRUCT, která obsahuje kopie parametrů předaných funkcí CreateWindow při tvorbě okna. Je poslána proceduře okna poté, co bylo okno odstraněno z obrazovky. Je posláno oknu, jakmile ztratí fokus, tzn. přestane být aktivní. wparam obsahuje handle okna, které fokus získalo (může být NULL) Oznamuje oknu, že uživatel zvolil některou položku z jeho menu. wparam obsahuje ID zvolené položky, lparam obsahuje kombinaci vlajek s informacemi o položce. Pokud lparam obsahuje -1 a wparam nulu, znamená to, že uživatel ukončil menu bez vybrání nějaké položky. Posláno, jakmile je okno přesunuto. lparam obsahuje novou pozici okna - LOWORD = x-ová souřadnice, HIWORD = y-ová souřadnice. Indikuje požadavek k ukončení běhu aplikace. wparam obsahuje kód vrácený Windowsům. Je posláno oknu, jakmile dostane fokus, tzn. že je nyní aktivní. wparam obsahuje handle okna, které fokus ztratilo (může být NULL) Nastaví název objektu. U oken je to titulek, u např. tlačítka je to jeho název. lparam obsahuje ukazatel na textový řetězec. Tato zpráva je poslána oknu, jakmile uživatel změní jeho velikost. lparam obsahuje v LOWORDu šířku a v HIWORDu výšku okna po změně velikosti. wparam může obsahovat SIZEFULLSCREEN pokud bylo okno maximalizováno, SIZEICONIC pokud bylo okno minimalizováno (pozůstatek WfW3.11), SIZENORMAL pokud se velikost okna změnila, ale není ani maximalizované, ani minimalizované. Vstupní zprávy WM_CHAR Zpráva je vyhodnocena, pokud jsou zpracovány zprávy WM_KEYUP a WM_KEYDOWN. wparam obsahuje hodnotu klávesy, lparam obsahuje v LOWORDu počet opakování klávesy, v LOBYTE HIWORDu nalezneme scan kód klávesy, bity 25-28 jsou interně využívány Windows, bit 29 obsahuje stav klávesy ALT, bit 30 je předchozí stav a bit 31 obsahuje přechodný stav WM_COMMAND Asi nejdůležitější zpráva!!! Je odeslána, když uživatel zvolí položku z menu, klikne na tlačítko, stiskne akcelerátor apod. wparam specifikuje ID zvoleného objektu, WM_LBUTTONDBLCLK Zpráva se objeví, pokud uživatel dvojkliknul v rámci naší aplikace. wparam obsahuje kombinaci vlajek: MK_CONTROL, pokud je zároveň stisknuta klávesa Ctrl, MK_SHIFT pokud je stisknuta klávesa Shift, MK_LBUTTON, pokud je stisknuto levé tlačítko myši (podobné jako MK_RBUTTON a MK_MBUTTON ). lparam obsahuje v LOWORDu x-ovou souřadnici ukazatele myši a v HIWORDu y-ovou souřadnici. WM_RBUTTONDBLCLK Podobné jako viz výše. WM_MBUTTONDBLCLK Podobné jako viz výše. WM_LBUTTONDOWN WM_RBUTTONDOWN WM_MBUTTONDOWN WM_HSCROLL WM_VSCROLL Objeví se, pokud je stisknuto levé tlačítko myši. wparam obsahuje vlajky jako u WM_LBUTTONDBLCLK mimo MK_LBUTTON. lparam obsahuje v LOWORDu x-ovou souřadnici ukazatele myši a v HIWORDu y-ovou souřadnici. Podobné jako viz výše. Podobné jako viz výše. Je odeslána, pokud uživatel použil horizontální posuvník. wparam může být jedna z následujících hodnot: SB_BOTTOM - posun úplně vpravo nebo dolů SB_TOP - posun úplně vlevo nebo nahoru SB_LINEDOWN - jeden řádek dolů SB_LINEUP - jeden řádek nahoru SB_PAGEDOWN - stránka dolů SB_PAGEUP - stránka nahoru (předchozí čtyři platí i horizontálně) SB_THUMBPOSITION - posun na absolutní pozici, ta je v LOWORDu lparam SB_THUMBTRACK - posuvník je právě posouván, LOWORD lparamu obsahuje pozici. Podobné jako WM_HSCROLL.

Základní zprávy pro správu okna a pro analýzu vstupů bychom měli probrány. Nejsou to však zdaleka všechny zprávy, které je možné pro tyto akce využít. Bližší informace o jednotlivých zprávách je možné nalézt různě na internetu a v dokumentacích ke kompilátorům. V příštím díle tohoto tutoriálku se podíváme na zprávy pro interakci s prvky dialogových oken a jejich notifikační kódy a v další části na některé ze systémových zpráv, zpráv pro práci s MDI okny. Základ programování ve Windows a C++ (5.) Výběr několika základních zpráv (2.) - tentokrát pro práci s prvky ve formuláři (tlačítka, objekty) Každé tlačítko a každá objekt v okně aplikace by měl u většiny aplikací k něčemu sloužit. Zde navážu na minulý díl. Jako v minulé části tohoto tutoriálu, zde máte seznam nejdůležitějších zpráv pro interakci s těmito prvky. K dialogovým prkům jsou tyto zprávy pouze rozšířením k těm z minulé části. Ve většině případů lze použít zprávy pro okna pro dialogové prvky apod. Zprávy pro práci s dialogovými prvky WM_NEXTDLGCTL WM_SETFONT Posílá se dialogovému oknu, aby změnilo prvek, který vlastní fokus. Pokud je lparam nenulový, wparam určuje ID prvku, který má získat fokus. Je-li lparam roven nule, wparam obsahuje vlajku posunu, tzn. je-li wparam nula, získá fokus následující prvek, jeli nenulový, fokus získá předchozí prvek. Nastaví font pro kreslení textu. wparam obsahuje handle na font, pokud je NULL, pak je použit systémový font. Pokud je lparam nastaven na TRUE je prvek překreslen okamžitě. Zprávy pro tlačítka (button, checkbox, radio) BM_GETCHECK BM_GETSTATE BM_SETCHECK BM_SETSTATE BM_SETSTYLE DM_GETDEFID DM_SETDEFID Posílá se prvku, při zjišťování stavu. Funkce SendDlgItemMessage vrátí TRUE, pokud je checkbox zakřížkován. Vrátí TRUE, pokud je stisknuto Označí nebo odznačí checkbox nebo radiobutton. Pokud je wparam nenulový, je označen, jinak je odznačen. Pro třístavové checkboxy: pokud je wparam roven 1 je označeno, pokud je 2 pak je checkbox zašednut. Pokud je wparam nenulový je prvek vykreslen v inverzní grafice. Nastaví pro prvek nový styl. wparam obsahuje nové nastavení stylu. lparam obsahuje vlajku zda má být prvek překreslen. Styl je součet parametrů (viz některý příští díl o zdrojích) Vrátí ID implicitního tlačítka Dle wparam nastaví tlačítko jako implicitní. Zprávy pro editační pole EM_GETLINECOUNT EM_LIMITTEXT EM_REPLACESEL Vrátí počet řádek. Nastaví limit v počtu znaků, které může uživatel vepsat. wparam obsahuje max. počet znaků. Vymění aktuálně vybraný text za textový řetězec na který ukazuje lparam. EM_SETPASSWORDCHAR Nastaví, který znak se bude zobrazovat místo písmen. Implicitně je hvězdička. WM_CLEAR Smaže obsah editačního pole ListBox - seznam LB_ADDSTRING LB_DELETESTRING LB_DIR Přidá do seznamu nulou ukončený řetězec, na který ukazuje lparam Odstraní ze seznamu řetězec s indexem uvedeným v wparam Vyplní seznam seznamem souborů v aktuálním adresáři. wparam obsahuje atribut výběru (DOS 4+). lparam obsahuje hvězdičko-otazníkovou notaci výběru souborů, které mají být zobrazeny.

LB_GETCOUNT LB_GETSEL LB_GETTEXT LB_GETTEXTLEN LB_GETTOPINDEX LB_INSERTSTRING LB_SETCOLUMNWIDTH LB_SETCURSEL Vrátí počet položek v seznamu. Vrátí index vybrané položky Zkopíruje položku specifikovanou ve wparam do řetězce specifikovaného ukazatelem ve lparam Vrátí délku řetězce specifikovaného indexem ve wparam Vrátí index první viditelné položky v seznamu Vloží do položky specifikované wparam řetězec, na který ukazuje lparam Nastaví šířku sloupců ve vícesloupcovém seznamu na wparam Položka wparam je vybrána. Pokud je wparam -1, pak není vybrána žádná položka. ComboBox - roletka CB_ADDSTRING Přidá do seznamu nulou ukončený řetězec na který ukazuje lparam CB_DELETESTRING Odstraní ze seznamu řetězec s indexem uvedeným v wparam CB_SHOWDROPDOWN Pokud je wparam TRUE, pak je roletka vysunuta jinak se schová Pro combobox je možné využít většinu ze zpráv použitelných u listboxu, pouze se změní prefix z LB_ na CB_ Pokud uživatel něco dělá s kterýmkoliv dialogovým prvkem, vaše aplikace se to samozřejmě dozví pomocí notifikačního kódu. Vše co potřebujeme je klasická zpráva WM_COMMAND, kterou naše aplikace obdržela, wparam obsahuje ID prvku, LOWORD lparamu obsahuje handle na okno, a HIWORD lparamu obsahuje již některý z těchto notifikačních kódů: Kódy pro tlačítka BN_CLICKED BN_DOUBLECLICKED Kódy pro EditBoxy EN_CHANGE EN_ERRSPACE EN_KILLFOCUS EN_SETFOCUS Kódy pro seznamy LBN_DBLCLK LBN_SELCHANGE LBN_KILLFOCUS LBN_SETFOCUS Kódy pro comboboxy CBN_DROPDOWN CBN_EDITCHANGE CBN_SELCHANGE CBN_KILLFOCUS CBN_SETFOCUS Indikuje, že na tlačítko bylo kliknuto Indikuje, že uživatel dvojkliknul na radiobutton Indikuje, že uživatel změnil obsah políčka Indikuje, že místo v paměti pro EditBox došlo. Indikuje, že editbox ztratil fokus Indikuje, že editbox získal fokus Indikuje, že uživatel dvojkliknul na položku. Indikuje, že uživatel změnil výběr. Indikuje, že seznam ztratil fokus Indikuje, že seznam získal fokus Informuje, že combobox bude vysunut. Informuje, že uživatel změnil text v editačním poli. Indikuje, že uživatel změnil výběr. Indikuje, že combobox ztratil fokus Indikuje, že combobox získal fokus Zde jsou uvedeny jen některé nejdůležitější kódy a seznam není zdaleka úplný. Jak vidíte, většina kódů je pro různé prvky podobná. V příštím díle navážu na tento díl seznamem dalších zpráv. Potom se podíváme na zdroje a ve finále vytvoříme nějakou funkční aplikaci. Pokud sledujete můj tutoriálek, máte se na co těšit. Jestliže něčemu nerozumíte, nezoufejte, v dalších dílech to snad objasním a jinak je zde board nebo můj mail.

Základ programování ve Windows a C++ (6.) Výběr několika základních zpráv (3.) Jako v předchozích dvou dílech věnovaných zprávám si ukážeme některé inicializační zprávy, některé ze systémových zpráv a výcuc ze zpráv věnovaných MDI oknům. Bohužel popsat všechny zprávy systému Windows je mimo rozsah tohoto tutoriálku, ale je možné je nalézt na internetu nebo v odborných publikacích. Inicializační zprávy WM_INITDIALOG WM_INITMENU Je poslána aplikaci těsně předtím, než je zobrazeno dialogové okno. wparam identifikuje prvek dialogu, který při otevření okna získá fokus. lparam obsahuje hodnotu dwinitparam, pokud je předávána funkcí, která vytváří dialog. Tato zpráva je požadavek k inicializaci menu. Je posílána těsně předtím, než je menu zobrazeno. wparam obsahuje handle na menu, které má být zobrazeno. Systémové zprávy WM_SYSCOMMAND WM_SYSCHAR WM_COMPACTING Je poslána, pokud uživatel zvolí položku systémového menu. Pro získání některé z níže uvedených hodnot je třeba hodnotu wparam ANDnout s 0xFFF0. Tato může být: SC_CLOSE - Uživatel chce zavřít okno SC_HSCROLL - Horizontální posun SC_KEYMENU - Menu se otevřelo po stisku klávesy SC_MAXIMIZE(nebo SC_ZOOM) - Vybráno Maximalizovat SC_MINIMIZE(nebo SC_ICON) - Vybráno Minimalizovat SC_MOUSEMENU - Menu se otevřelo myší SC_MOVE - Vybráno Přesunout SC_NEXTWINDOW - Posun na další okno SC_PREVWINDOW - Posun na předchozí okno SC_RESTORE - Vybráno Obnovit SC_SIZE - Změna velikosti SC_VSCROLL - Vertikální posun Akce s tímto menu je lépe přenechat DefWindowProc. Podobné WM_CHAR, ale pracuje se systémovými klávesami. Je posláno všem aplikacím, pokud Windows detekují, že dochází paměť nebo systémové prostředky. wparam specifikuje vytížení procesoru: 0x8000 znamená 50%. WM_SYSCOLORCHANGE Informuje, že uživatel změnil jednu nebo více systémových barev. Aplikace by měla zavolat WM_PAINT pro překreslení a rekonstruovat všechny existující štětce. WM_TIMECHANGE Je posláno všem aplikacím, pokud se změnil systémový čas. MDI zprávy WM_MDICASCADE WM_MDICREATE WM_MDIDESTROY WM_MDIGETACTIVE WM_MDIMAXIMIZE WM_MDISETMENU WM_MDITILE Tato zpráva uspořádá všechna okna kaskádovým stylem. Vytvoří se nové MDI okno. wparam obsahuje ukazatel na MDICREATESTRUCT strukturu. Odstraní MDI okno. wparam obsahuje handle na toto okno. Vrátí aktivní MDI okno. LOWORD vrácené hodnoty obsahuje handle na toto okno, HIWORD obsahuje 1 pokud je okno maximalizováno. Maximalizuje MDI okno, jehož handle je zadáno ve wparam. Změní menu nebo popup menu MDI okna nebo obojí. lparam obsahuje v LOWORDU handle na nové menu a v HIWORDU handle na nové popup menu. Pokud je některé ze slov nulové, menu se nemění. Okna se uspořádají stylem TILE. Doufám, že vám tyto tři díly obsahující pouze zjednodušený popis některých zpráv posílaných Windowsy aplikaci a naopak pomohou při programování vašich aplikací. Rozhodně je ale budete potřebovat, pokud se mnou budete pokračovat v tomto tutoriálku.

Základ programování ve Windows a C++ (7.) Něco málo ke zdrojům a resource částem programům pro Windows Každý program pro Windows obsahuje tzv. zdrojovou část (resource). Ta je připojena většinou ke konci EXE souboru a může obsahovat dialogová okna, různá menu, bitmapy, ikony, fonty a různá jiná data, jež aplikace využívá ke komfortnější interakci s uživatelem. Zvláště pro programátora je tento způsob vytváření dialogů mnohem komfortnější. Pokud využijete nějaký WYSIWYG editor jako např. AppStudio (viva Microsoft), pak je tvorba dialogů úplně jednoduchá, ale ani syntaxe rc souborů není příliš složitá. Programátor určí vizáž okna, umístí tlačítka a přidělí jim identifikátory. Potom pomocí funkce Windows přidělí proceduru pro zpracovávání zpráv a jednoduše jej otevře. Práce přes zdroje je mnohem jednodušší než vytvářet HWND proměnné pro všechny tlačítka, statické objekty atd. a ty po jednom otevírat funkcí CreateWindow. Jak tedy na to? Pokud využijeme Dev-C++, ukládá se zdrojový kód ke zdrojové části implicitně v souboru rsrc.rc. Nejdůležitější je u tohoto kompilátoru připojit k souboru rsrc.rc soubor winresrc.h, který obsahuje seznam všech hlavičkových souborů nutných ke tvorbě zdrojů. Další soubor, který je třeba připojit, je váš vlastní soubor s definicemi identifikátorů, obvykle resource.h, ale je možné vkládat definice i na začátek rsrc.rc, ale znepřehlední to strukturu projektu. Syntaxe rc souborů je jednoduchá. Nejprve se napíše identifikátor, který je v podstatě číslo, ale pomocí direktiv #define je dobré si je vhodně pojmenovat. Konvence je ID, dále písmeno typu např. D jako dialog, podtržítko a popis zdroje. Výsledný identifikátor by mohl vypadat IDD_HLAVNIOKNO, ale není to podmínka. Dále je třeba specifikovat typ zdroje. Nejčastěji používané jsou dialogy (specifikace "DIALOG"), nabídky ("MENU"), ikony ("ICON"), kurzory ("CURSOR"), bitmapy ("BITMAP"), fonty ("FONT"), akcelerátory, které jsou vlastně klávesové zkratky ("ACCELERATORS"), a také tabulky řetězců ("STRINGTABLE"), které se deklarují trochu jinak, ale jsou užitečné při tvorbě vícejazyčných programů. Pak je možno vsadit některé speciální příkazy, ale ty nejsou pro začínajícího programátora zase tak důležité. Potom mohou následovat parametry a obsah položky uzavřené mezi příkazy BEGIN a END nebo { a. Protože se každý typ deklaruje různě, bude lepší uvést příklady. Jednoduché okno může vypadat takto: IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 187, 65 STYLE DS_MODALFRAME WS_MINIMIZEBOX WS_POPUP WS_VISIBLE WS_CAPTION WS_SYSMENU CAPTION "Dialogové okno" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,106,38,50,14 END PUSHBUTTON CONTROL "Storno",IDCANCEL,29,38,50,14 "Tak takto vypadá jednoduché okno.",idc_static, "Static",SS_SIMPLE WS_GROUP,34,15,119,8 Způsobů, jak vytvořit jednoduché okno, je spousta. Také text je možné vytvořit několika způsoby, styl okna je možné měnit. Pokud za tag CAPTION uvedeme např: MENU IDM_MENU1, bude k tomuto oknu použito menu IDM_MENU1. Parametry STYLE mohou být: WS_BORDER, WS_CAPTION, WS_CHILD, WS_CHILDWINDOW, WS_CLIPCHILDREN, WS_CLIPSIBLINGS, WS_DISABLED, WS_DLGFRAME, WS_GROUP, WS_HSCROLL, WS_ICONIC, WS_MAXIMIZE WS_MAXIMIZEBOX, WS_MINIMIZE, WS_MINIMIZEBOX, WS_OVERLAPPED, WS_OVERLAPPEDWINDOW,WS_POPUP, WS_POPUPWINDOW, WS_SIZEBOX, WS_SYSMENU, WS_TABSTOP, WS_THICKFRAME, WS_TILED, WS_TILEDWINDOW, WS_VISIBLE, WS_VSCROLL Popisovat je nebudu, snad jen že např: WS_MAXIMIZE přinutí okno být maximální, WS_MAXIMIZEBOX umožní aby se na oknu objevilo tlačítko pro maximalizaci, WS_VSCROLL nechá na okně vykreslit vertikální posuvník. Pro vytvoření standardního obvykle stačí použít WS_OVERLAPPEDWINDOW, které připojí některé parametry automaticky. Jednoduché menu IDR_MENU1 MENU DISCARDABLE BEGIN POPUP "&Soubor" BEGIN

END MENUITEM "&Nový", ID_SOUBOR_NOVY MENUITEM "&Otevřít...", ID_SOUBOR_OTEVRIT POPUP "&Seznam" BEGIN MENUITEM "1", ID_SOUBOR_SEZNAM_1 MENUITEM "2", ID_SOUBOR_SEZNAM_2 MENUITEM "3", ID_SOUBOR_SEZNAM_3 MENUITEM "4", ID_SOUBOR_SEZNAM_4, MENUBARBREAK MENUITEM "5", ID_SOUBOR_SEZNAM_5 MENUITEM "6", ID_SOUBOR_SEZNAM_6 END MENUITEM "Nefunkční", ID_SOUBOR_NEFUNKCNI, GRAYED MENUITEM SEPARATOR MENUITEM "&Konec", ID_SOUBOR_KONEC END Vhodně zvolené identifikátory, zpřehlední zdrojový kód nejen ve zdrojích. Vložením znaku & před některé písmeno způsobí, že stiskem tohoto písmena na klávesnici je daná položka zvolena. Připojování kurzorů, ikon a bitmap není tak složité a lze je napsat jedním řádkem: IDC_CURSOR1 CURSOR DISCARDABLE "CURSOR1.CUR" IDI_ICON1 ICON "ICON1.ICO" IDB_BITMAP1 BITMAP "BITMAP1.BMP" Uvedeme ID objektu, typ, rozšířené parametry a název souboru. Definice akcelerátorových kláves je podobná, uvedeme ID, klíčové slovo ACCELERATORS, paramtery a mezi tagy BEGIN a END zadáme jejich definice. Do uvozovek uvedeme písmeno klávesy nebo náhradní označení virtuální klávesy, dále identifikátor, a další parametry. Nejprve zvolíme typ klávesy (VIRTKEY nebo ASCII), SHIFT, ALT nebo CONTROL jsou vlajky stisku přesmykačů. Dále je možné uvést další parametry. IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE BEGIN "A", ID_ACCEL40011, VIRTKEY,SHIFT, ALT, NOINVERT "B", ID_ACCEL40012, VIRTKEY,NOINVERT VK_F1, ID_ACCEL40013, VIRTKEY,NOINVERT VK_F2, ID_ACCEL40014, VIRTKEY,CONTROL, ALT, NOINVERT "X", ID_ACCEL40015, ASCII, ALT, NOINVERT END Syntaxe tabulek řetězců je trochu odlišná: STRINGTABLE DISCARDABLE BEGIN IDS_STRING1 IDS_STRING2 END "Hello world" "Nazdar lidi" Je třeba uvést klíčové slovo STRINGTABLE parametry se definují až k jednotlivých řetězcům. Nejsložitější ze zdrojů je definice dialogových oken. Tato mohou obsahovat spousty různých ovládacích i statických prvků, jejichž popis je bohužel mimo rámec tohoto tutoriálku. V dalších dílech se pokusíme vytvořit funkční a trochu zajímavější Hello World. Věřím, že předchozí a díly nebyly příliš zajímavé, ale je třeba si uvést alespoň základní prvky Windows API pokud nevlastníte žádnou publikaci nebo referenční příručku.

Základ programování ve Windows a C++ (8.) Hello World 2001 - konečně trochu použitelná aplikace Předchozí čtyři díly tohoto tutoriálku nejspíš nebyly příliš zajímavé, avšak pro ty, kteří si ještě nesehnali nějakou referenční příručku jazyka Windows C++, naprosto nezbytné. Seznam a krátký popis alespoň několika nejdůležitějších zpráv systému Windows bude velmi užitečný pro práci s okny i jinými dialogovými prvky. Základní popis zdrojů také nebyl zdaleka vyčerpávající, ale alespoň čtenář mého tutoriálku ví, že něco takového existuje. Pokud vám smysl předchozích článků trochu unikl a, stejně jako já, potřebujete vidět to všechno v akci než celý problém pochopíte, nezoufejte, nabízím vám celý, funkční a trochu lepší Hello World. Tento program demonstruje základní práci se zprávami, oknem, myší a zdroji. A protože asi nejsem jediný, kdo rád stahuje z internetu zdrojové kódy, které nefungují, snažil jsem se napsat následující program tak, aby stačilo pouze zkopírovat jej z prohlížeče do nového prázdného projektu každého kompilátoru, který dodržuje normu ANSI C++ a zkompilovat. Pokud využíváte Dev-C++, pak by měl vytvářený projekt obsahovat následující soubory: hello.dev, main.cpp, resource.h a rsrc.rc První soubor, který uvedu, je resource.h a obsahuje pouze definice všech prvků použitých v hlavním okně. #define IDD_DIALOG1 101 #define IDR_MENU1 102 #define IDC_BUTTON1 1000 #define IDC_BUTTON2 1001 #define IDC_BUTTON3 1002 #define IDC_BUTTON4 1003 #define IDC_BUTTON5 1004 #define IDC_BUTTON6 1005 #define IDC_EDIT 1006 #define ID_UKONCIT 2000 #define ID_ABOUT 2001 #define IDC_STATIC -1 #define IDC_TEXTIK 3000 Čísla použitých prvků jsou dle standardu Microsoftu, ale můžete si je libovolně měnit. Další soubor, který je třeba uvést je soubor obsahující zdroje, tedy rsrc.rc: #include <winresrc.h> #include "resource.h" // Budeme potřebovat náš soubor s definicemi a soubor s definicemi // stylů atd. (winresrc.h) 500 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "E:/CODE/DEV-CPP/Icon/MAINICON.ICO" // Sem můžeme vložit nějakou vlastní ikonku, aby Windows nepoužila // v průzkumníkovi tu implicitní škaredou IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 384, 264 STYLE WS_MINIMIZEBOX WS_POPUP WS_VISIBLE WS_CAPTION WS_SYSMENU CAPTION "Hello World 2001" // Také použijeme menu, uvedené dále v tomto kódu MENU IDR_MENU1 FONT 8, "MS Sans Serif" BEGIN // Toto tlačítko je zde jen na parádu, vytváří podklad pro text PUSHBUTTON "",IDC_BUTTON1,11,17,360,107,WS_DISABLED NOT WS_TABSTOP // IDC_TEXTIK - centrovaný text, včetně impliciního řetězce CTEXT "\n\n\n\n\nh E L L O W O R L D\n\n\n2 0 0 1",IDC_TEXTIK,14, 20,354,101,NOT WS_GROUP // Nějaká tlačítka, která použijeme v programu DEFPUSHBUTTON "Použít",IDC_BUTTON6,233,151,132,31 GROUPBOX "Ovládací prvky",idc_static,10,199,361,47 PUSHBUTTON "Minimalizovat",IDC_BUTTON2,18,214,72,21 PUSHBUTTON "Přepnout",IDC_BUTTON3,98,214,72,21 PUSHBUTTON "O programu",idc_button4,207,214,72,21 PUSHBUTTON "Ukončit",IDC_BUTTON5,288,214,72,21

// Úplně nanic text, ale každý si rád dá do aplikace svůj copyright CONTROL "(C) 2001",IDC_STATIC,"Static",SS_SIMPLE WS_DISABLED WS_GROUP,351,252,29,8 // Rámeček GROUPBOX "Zpráva v okně",idc_static,10,141,361,47 CONTROL "Text zprávy:",idc_static,"static",ss_simple WS_GROUP,26,161,42,8 // A nakonec editační pole EDITTEXT IDC_EDIT,77,151,152,31,ES_MULTILINE WS_VSCROLL 0x1000 END // Také budeme v naší aplikaci používat jednoduché menu // pouze se dvěmi možnými volbami IDR_MENU1 MENU DISCARDABLE BEGIN POPUP "&Program" BEGIN MENUITEM "&Ukončit\tAlt-F4", ID_UKONCIT END POPUP "&Nápověda", HELP BEGIN MENUITEM "&O programu...", ID_ABOUT END END V tomto zdrojovém kódu jsme vytvořili okno s několika ovládacími prvky a jednoduché menu. Také bych měl uvést, že velikost a pozice jednotlivých prvků není v pixelech, ale v dialogových jednotkách, jejichž velikost se mění v závislosti na použitém fontu a nastavení Windows. A nakonec hlavní zdrojový kód programu: // Připojíme všechny potřebné knihovny #include <windows.h> #include <string.h> #include <stdio.h> #include "resource.h" // Vytvoříme prototyp funkce, která bude spravovat naše okno BOOL CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int STDCALL WinMain (HINSTANCE hinst, HINSTANCE hprev, LPSTR lpcmd, int nshow) { // Vše co nám stačí je otevřít okno a předat řízení na WndProc // Proč vytvářet okno přes CreateWindow a zpracovávat smyčku zpráv, // když to všechno za nás mohou udělat Windows DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,WndProc); return(0); // Toto byl pravděpodobně nejkratší main kód, který jste kdy napsali BOOL CALLBACK WndProc(HWND hwnd,uint Message,WPARAM wparam,lparam lparam) { // Zpravy, ktere nebudeme zpracovavat vraci FALSE aby Windows // samy rozpoznaly jestli je maji predat DefWindProc. switch(message){ case WM_INITDIALOG: // Byl otevren dialog... nechci aby si s tím hrál DefWndProc return TRUE; case WM_COMMAND: switch(loword(wparam)){ // Prikaz vzesel od ovl. prvku // Nebudeme testovat systemovy kod, protoze je nam jedno // jestli to bylo kliknuti nebo dvojklik. case IDC_BUTTON5: // Uživatel kliknul na tlačítko Ukončit case ID_UKONCIT: // Nebo vybral Ukončit z menu case IDCANCEL: // Nebo kliknul na X vpravo nahoře v okně {

int a; // - můj oblíbený název proměnných // MessageBox jsme probírali v prvním díle a = MessageBox (NULL, "Opravdu si přejete ukončit tento program?", "Potvrzení ukončení", MB_YESNO MB_DEFBUTTON2 MB_ICONQUESTION); if (a==idno) break; // Pokud ne tak vyskočíme ven // brnky brnky na nervy a = MessageBox (NULL, "A víte to jistě?", "Potvrzení ukončení", MB_YESNO MB_DEFBUTTON2 MB_ICONQUESTION); if (a==idno) break; EndDialog(hwnd,IDCANCEL); // Tato procedura zavírá dialogové okno break; case IDC_BUTTON2: // Tlačítko minimalizovat { CloseWindow(hwnd); // Nepříliš intuitivní pojmenování funkce (pozůstatek z Win16) break; case IDC_BUTTON3: // Standartizovane pipnuti je ve Windows taky celkem jednoduche MessageBeep(0); break; case IDC_BUTTON4: case ID_ABOUT: // Tlačítko O programu nebo z menu. MessageBox (NULL, "Hello World 2001 Ukázkový prográmek, pro demonstraci dialogů, menu, a zpráv.", "O programu", MB_ICONASTERISK); // Predchozi tri radky vypadaji otresne, ale Mingw kompilator je nejaky divny a neumi \n break; case IDC_BUTTON6: // Tlačítko Použít { // nacteme retezec z editacniho pole a zkopirujeme do statickeho textu char *text; // Sestavime si novy text text=(char*)globalalloc(gmem_fixed GMEM_ZEROINIT,65536); SendDlgItemMessage(hwnd,IDC_EDIT,WM_GETTEXT,65535,(long)text); SendDlgItemMessage(hwnd,IDC_TEXTIK,WM_SETTEXT,65535,(long)text); // Toto je v podstate to same jako pouzit funkce // GetDlgItemText a SetDlgItemText GlobalFree(text); // a je to break; return TRUE; case WM_MOVE: // Také můžeme zpracovávat zprávu, že uživatel pohybuje oknem { char *titulek; // Sestavime si novy titulek titulek=(char*)globalalloc(gmem_fixed GMEM_ZEROINIT,256); sprintf(titulek,"hello World 2001 >>> Probiha presun okna na: %4.4d; %4.4d",LOWORD((DWORD)lParam),HIWORD((DWORD)lParam)); // a posleme ho sami sobe - teda svemu oknu SendMessage(hwnd,WM_SETTEXT,0,(long)titulek); GlobalFree(titulek); return TRUE; case WM_MOUSEMOVE: // Také můžeme testovat pohyb myši v našem okně { char *titulek; // Sestavime si novy titulek titulek=(char*)globalalloc(gmem_fixed GMEM_ZEROINIT,256); sprintf(titulek,"hello World 2001 >>> Pozice mysi je: %4.4d,%4.4d", LOWORD((DWORD)lParam), HIWORD((DWORD)lParam) ); // A hotový text nastavíme na titulek SendMessage(hwnd,WM_SETTEXT,0,(long)titulek); GlobalFree(titulek); return TRUE; // Takto lze testovat zprávy všeho možného // Zprávy, které nebudeme zpracovávat předáme DefWndProc tak že vrátíme FALSE default: return FALSE;

return TRUE; Pokud odstraníte všechny komentáře, přijdete na to, že ve skutečnosti je to velmi jednoduchý prográmek a má spoustu možností rozšíření. Ovládání je také intuitivní. Stačí napsat nějaký text a kliknout na Použít. Tento prográmek je prozatím zakončením tohoto krátkého tutoriálku. V žádném případě jsem nevyčerpal všechna zákoutí Windows API, avšak úzký základ jsem popsal. Pokud vůbec netušíte o co v tomto tutoriálu šlo, bude třeba prostudovat nějaký tutoriálek DOS céčka a vytvořit několik funkčních programů. Je pravda, že programováním pro Windows se mnoho věcí zjednodušší, ale jen v případě, že to umíte udělat složitě. Základ programování ve Windows a C++ (9.) Okna, procesy oken a jak na ně. Ve Windows rozeznáváme dva typy procesů a to thready (vlákna) a okna (windows). Zásadní rozdíl je v tom, že okno lze vidět, thread nikoliv. V tomto díle si trochu přiblížíme okna, práci s nimi a s jim určenými zprávami. Tuto tématiku jsem již v některém z předchozích dílů nakousnul, ale teď se k ní vrátím podrobněji. Pokud čtete tento tutoriálek od začátku, jistě víte jak vytvořit klasické dialogové okno pomocí předdefinované šablony ve zdrojích a pracovat s ním pomocí zpráv. Avšak mnohdy je třeba pracovat s oknem na mnohem nižší úrovni než na té, kterou nám poskytuje klasické vyvolání dialogu. Cesta, kterou bych zde chtěl přiblížit je obvykle uváděna na začátcích tutoriálků k Windows Céčku (++), ale pro vývoj jednoduchých až mírně složitých aplikací není třeba a vše lze zajistit pomocí dialogů, ať modálních či nemodálních. Při programování pro Windows je za okno považován jakýkoli prvek viditelný na obrazovce a to ať už okno jako šedý podklad s titulkovým pruhem a obtáhnuté světlejšími či tmavšími čárami k vytvoření efektu 3D, nebo prosté tlačítko, rámeček atd. Vytváříme-li toto vše pomocí šablony ze zdrojů, obstarají Windows za nás všechny potřebné akce a to jak vytvoření a odstranění těchto objektů, tak skoky tabulátoru a další minoritní akce. Pokud chceme tyto prvky nějak speciálně ovládat, musíme je spravovat ručně. Zvláště je to třeba při programování aplikací, komunikujících s uživatelem na základě dynamicky měněných oken. Jak na to? V základě budeme potřebovat spoustu proměnných typu HWND, tedy rukojetí na jednotlivé okna. Podle těchto rozpoznávají Windows jednotlivá okna. Jedno HWND pro každé okno, které budeme používat (okno, tlačítka, posuvníky, atd...). Statické okna, které nebudeme upravovat (např. rámečky) nemusí mít svou rukojeť, pokud je nebudeme měnit. Ke tvorbě a likvidaci oken využijeme funkce CreateWindow, CreateWindowEx a DestroyWindow. Dalším rozdílem je, že pro celou instanci aplikace reprezentované hlavním oknem (které je mimochodem třeba vytvářet dle třídy okna, kterou si musíme vytvořit a zaregistrovat) musí náš program zpracovávat smyčku, tj. testovat přítomnost zprávy, její přeložení a odeslání proceduře hlavního okna. Procedura okna je podobná procedurám dialogových oken. Rozdíl je, že místo vrácení TRUE nebo FALSE vracíme co chceme (skoro), tudíž pokud potřebujeme aby se pro některou zprávu provedla implicitní akce voláme funkci DefWndProc s danými parametry. Ve skutečnosti není práce s těmito okny zase tak složitá, jak by se mohlo na první pohled zdát. Vše potřebné k vytvoření jednoduchého okna dostanete k dispozici, pokud v Dev-C++ vytvoříte nový projekt podle šablony Windows Application a sem již můžete vložit vlastní kód. Pokud ovládáte angličtinu, vyčtete toho spoustu v komentářích, zde uvedu pouze tu část kódu, která zprostředkuje zobrazení textu uprostřed okna i při změně jeho velikosti. Mimo funkce vytvoříme globální proměnnou textik, která bude obsahovat ukazatel na statický objekt textu a proměnnou do které si uložíme instanci aplikace. HWND textik = NULL; HINSTANCE hinst; Samozřejmě někam na začátek funkce WinMain vložíme řádek: ::hinst = hthisinstance;

A do procedury okna, přesněji do switche, vložíme následující bloky: case WM_CREATE: // místo WM_INITDIALOG (u procedur dialog ů) zpracováváme WM_CREATE textik = CreateWindow( "STATIC", "libovolný text", SS_CENTER WS_CHILD, // styl centrovaneho textu 0,0,0,0, // pro rozmery zatim pouzijeme 0 hwnd,null,hinst,null); ShowWindow(textik,SW_SHOW); // Okno (text) zobrazíme break; Styl SS_CENTER místo SS_LEFT jsem zvolil záměrně. Usnadní nám to programování centrování textu. case WM_PAINT: { // Zajistime provedeni standartni sluzby pro kresleni okna DefWindowProc(hwnd, message, wparam, lparam); // Potrebujeme rozmery okna RECT okno; GetWindowRect(hwnd, &okno); int sirka = okno.right - okno.left; int vyska = okno.bottom - okno.top; // Tipnem si kolik pixelu asi bude ten textik // Zbytek za nas udela SS_CENTER int tip = 200; int posy = (vyska/2) - 10; // 10= polovina vysky znaku int posx = (sirka/2) - (tip/2); MoveWindow(textik, posx, // pozice X posy, // Y break; tip, // sirka 20, // vyska TRUE);// vlajka prekresleni Správa takovýchto oken a jejich prvků není jednoduchá, avšak jakmile si ji dostanete do podvědomí, budete okna ovládat bez problémů. Základ programování ve Windows a C++ (10.) Základy kreslení ve Windows, trocha teorie a jednoduchý příklad Když jsem se učil programovat pro Windows, přišlo mi neskutečně složité kreslení na obrazovku. Vzhledem k jednoduchosti použití BGI knihoven pod BC, TC nebo TP je to opravdu pro začínajícího programátor trochu obtížné k pochopení. Nejprve si musíme uvědomit, že obrazovka už není jenom naše. Je zde spousta jiných oken, plocha a také hlavní panel s tlačítkem Start. Nejprve si vysvětlíme, jak jsou pod Windows API okna kreslená. Standardně máme pro kreslení k dispozici okno a k tomuto oknu náleží procedura, která reaguje na zprávy od systému nebo jiných oken a procesů. Když píšeme vlastní proceduru okna, voláme při obdržení zpráv, které nezpracováváme, funkci DefWndProc (popř. DefDlgProc nebo u dialogů vracíme 0) a takto zajistíme, že Windows za nás udělají zbytek práce, tj. i kreslení. Pro kreslení oken Windows posílají dvě zprávy, a to WM_PAINT a WM_NCPAINT. WM_PAINT je zpráva, kterou Windows oznamují proceduře okna, že vyžadují znovu vykreslit obsah klientské části okna. Standardně v této části okna nic k překreslení není, a tak DefWindProc neprovádí nic. WM_NCPAINT obdrží okno v případě, že je třeba překreslit neklientskou část okna. Do této části spadá rámeček, titulkový pruh a jeho obsah, popř. menu. Obvykle není třeba tuto zprávu zpracovávat. My budeme odpovídat na zprávu WM_PAINT. Začínáme jednodušším příkladem Chceme-li kreslit do okna, budeme v programu potřebovat několik dalších proměnných. Nejprve je to hdc typu HDC, tedy handle na kontext zařízení, podle něhož Windows poznají, do kterého okna kreslit, a dále struktura typu PAINTSTRUCT, ve které si naše aplikace uchová informace o kreslení.

HDC hdc; PAINTSTRUCT ps; Předtím než začneme vlastní kreslení, použijeme funkci BeginPaint, kterou zinicializujeme kreslící mechanizmy Windows vzhledem k našemu oknu. Za parametry uvedeme handle na naše okno a referenci na strukturu PAINTSTRUCT. hdc = BeginPaint( hwnd, &ps ); Pro kreslení si Windows uchovávají sadu objektů (neplést s objekty v C++), kterými se kreslí. Jsou to Bitmapa, Štětec (brush), Font, Pero (pen) a Oblast (region). Pero je používáno ke kreslení především čar. Štětci kreslíme výplně definovaných oblastí. Font užíváme k definici stylu písma. Ke kreslení můžeme vytvořit vlastní objekty nebo použít předdefinované. Aby Windows použily náš objekt, musíme jej vybrat funkcí SelectObject. V následujícím řádku nahradíme aktuální pero novým vlastním. Toto pero bude plná čára o tloušťce 1 pixel a modré barvě. SelectObject(hDC, CreatePen( PS_SOLID, 1, 0x00FF0000 ) ); A nyní již můžeme kreslit. Jako v BGI přesuneme aktuální pozici kurzoru na souřadnice [0,0], tj. do levého horního rohu našeho okna. MoveToEx( hdc, 0, 0, NULL ); A z tohoto bodu nakreslíme čáru do bodu [100,100]. LineTo( hdc, 100, 100 ); Nyní na pozici [30,10] nakreslíme červený bod. SetPixel( hdc, 30, 10, 0x000000FF ); A po dokončení kreslení zavoláme funkci EndPaint, která dokončí naše kreslící operace a zjednodušeně řečeno způsobí, že se to, co jsme kreslili, objeví v okně. EndPaint( hwnd, &ps ); Jak jednoduché. V příštím díle si povíme něco o tom, jak do okna umístit jakýkoliv text. Základ programování ve Windows a C++ (11.) Kreslení textu do okna, nastavení fontu a vlastností textu V minulém díle jsem vám předvedl, jak jednoduše kreslit do okna čáry a body. K tomuto bych ještě mohl uvést, že standardní barvy systému, které si můžete nastavit v ovládacích panelech (panel obrazovka), lze získat funkcí GetSysColor. Výčet parametrů (prefix COLOR_) pak naleznete v souboru WINUSER.H nebo v referenci Win32. Začněme s tím, jak do okna nakreslit text. Opět bychom měli odpovídat na zprávu WM_PAINT. Funkce BeginPaint a EndPaint již nebudu uvádět, viz minulý díl. Chceme-li nakreslit text, musíme si nejprve vytvořit font. K tomuto účelu si vytvoříme proměnnou typu HFONT, třeba hf, která bude obsahovat handle na námi vytvořený font, který budeme používat ke kreslení textu. Font si tedy vytvoříme funkcí CreateFont. HFONT hf; hf = CreateFont( 16, // Výška písma. Je-li zadáno 0 pak je použita implicitní hodnota, // je-li menší než 0, pak je použita hodnota v pixelech. 0, // Logická průměrná šířka znaku ( 0 - implicitní ) 0, // Úhel sklonu písma

); 0, // Úhel orientace vzhledem k řádku FW_BOLD, // Řez písma 0, // Určuje, zda je písmo kurzíva 0, // Určuje, zda je písmo podtržené 0, // Určuje, zda je písmo přeškrtnuté DEFAULT_CHARSET, // Určuje typ znakové sady OUT_DEFAULT_PRECIS, // Určuje preciznost výpočtu stylu písma CLIP_DEFAULT_PRECIS,// Přesnost umístění DEFAULT_QUALITY, // Kvalita vykreslování písma FF_ROMAN, // Typ písma, který se zvolí není-li v systému vypraný font "Arial CE" // Font, kterým se bude text kreslit Dále tento font vybereme funkcí SelectObject. SelectObject( hdc, (HGDIOBJ) hf ); Před začátkem kreslení si ještě musíme vytvořit strukturu RECT, kterou následně předáme Windows. Náš text bude kreslen do takto vymezené oblasti. RECT rect = { 0,0,200,50 ; Nyní už Windows ví, že při dalším kreslení textu budeme používat náš font a kam chceme kreslit, takže nám nic nebrání nakreslit do našeho okna libovolný text. K tomuto můžeme použít několik funkcí. První z nich je DrawText, dále její rozšířená verze DrawTextEx, TextOut a nebo její rozšířená verze ExtTextOut. Příklady jsou zde. DrawText( hdc, "PC Svět", -1, &rect, DT_LEFT DT_NOPREFIX DT_SINGLELINE ); TextOut( hdc, 0, 0, "PC Svět", 7); Ať už jste použili jakoukoli funkci, měl by být text nakreslen v okně. Vzhled textu může být dále upraven API funkcemi jako SetTextColor, SetBkColor a SetBkMode třeba takto: SetTextColor( hdc, 0x0000FF00 ); SetBkColor( hdc, 0x000000FF ); SetBkMode( hdc, TRANSPARENT /*nebo OPAQUE*/ ); Tímto způsobem můžete vytvořit velmi zajímavé nadpisy a popisky, avšak z uživatelova pohledu by mohla být spousta barevných textů spíš rušivá a může znepříjemňovat práci s programem. Jako vždy platí: všeho s mírou. Základ programování ve Windows a C++ (12.) Popis funkcí a postup pro kreslení bitmap a ikon do vašeho formuláře Nakreslení bitmapy do okna je další z důležitých znalostí autorů programů pro Windows. I v profesionálních programech se vždy najde v okně místo, kam vložit logo. Práce s bitmapami BMP je relativně složitá. Z důvodů paměťové náročnosti a především kvůli tzv. flicker free kreslení neboli kreslení bez problikávání obrazu je třeba bitmapy přenášet na obrazovku pomocí dalšího kontextu zařízení, který je umístěn v paměti. Jak tedy na to. Nejprve, nejlépe při zprávě WM_CREATE načteme náš obrázek funkcí LoadBitmap a k udržení handle na obrázek si mimo proceduru okna definujeme proměnnou HBITMAP. Předpokládejme tedy, že máme ve zdrojích umístěn obrázek, jehož identifikátor je 100: 100 BITMAP PRELOAD MOVEABLE "obr.bmp" Programujeme tedy:

HBITMAP hb;... hb = LoadBitmap(hInstance, MAKEINTRESOURCE(100)); První parametr funkce LoadBitmap (hinstance) je handle na instanci aplikace, které obdržíme při vstupu do funkce WinMain. Jako odpověď na WM_PAINT nejprve zavoláme funkci BeginPaint (viz díl 10.). A nyní už vytvoříme kontext zařízení, který bude v paměti a do něhož nahrajeme náš obrázek. HDC hmemory = CreateCompatibleDC(hDC); A funkcí SelectObjekt zvolíme do tohoto kontextu naši bitmapu. SelectObject(hMemory, hb); Windows nám dále poskytují velmi rychlou funkci BitBlt, kterou použijeme k přenesení bitmapy z paměťového kontextu do kontextu naší aplikace. Předpokládáme, že velikost bitmapy je 123x456 pixelů. BitBlt(hDC, 0,0, 123, 456, hmemory, 0, 0, SRCCOPY); A nyní už můžeme vytvořený paměťový kontext odstranit a uvolnit tak paměť. DeleteDC(hMemory); Takto můžeme nakreslit na obrazovku libovolnou bitmapu. Potřebujeme-li nakreslit do okna jednoduchou ikonku, rozhodně nebudeme ale používat takto složitý postup. Ke kreslení ikon můžeme použít funkci DrawIcon nebo DrawIconEx, nejprve ale musíme ikonku načíst. To můžeme provést funkcí LoadIcon nebo LoadImage. Tyto funkce jsou rozdílné v tom, že funkcí LoadImage můžeme načíst i kuzor a bitmapy, definovat rozměry ikony, nastavení průhledných částí a barev, zatímco funkce LoadIcon načte ikonu s uživatelem nastavenými rozměry (SM_CXICON a SM_CYICON). Funkcí LoadImage můžeme načítat také ikony ze souborů a to tak, že název souboru uvedeme místo názvu zdroje a specifikujeme vlajku LR_LOADFROMFILE. Příklady načtení ikony: hi = LoadIcon(hInstance, MAKEINTRESOURCE(200) ); hi = LoadImage(hInstance, MAKEINTRESOURCE(200), IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR ); Proměnná hi bude typu HICON a udržuje nám handle na načtenou ikonu. A do našeho okna můžeme nakreslit ikonku na pozici [10,10] třeba takto: DrawIcon( hdc, 10, 10, hi ); Myslím, že kreslení grafických prvků pod Windows je nyní dostatečně objasněno. Více informací o kreslení pod Windows hledejte především v referencích Windows API. Základ programování pro Windows v C++ (13.) Standardní ovládací prvky - tlačítka, rámečky, zaškrtávací políčka, přepínače Jak jsme si v předchozích dílech seriálu ukázali, není problém vytvořit okno aplikace pomocí resource (zdrojů). Pro tvorbu takovýchto dialogů můžeme na internetu najít i několik kvalitních programů, např. Weditres. Pokud chceme vytvořit složitější aplikaci, mohou nám takovéto dialogy v mnohém pomoci, ale základní hlavní okno aplikace takto vytvářet určitě nebudeme. Zapomeňme nyní na chvíli na dialogy a pojďme se to vše naučit dělat ručně. Jak jste se mohli dočíst v díle 9, pro vlastní tvorbu okna použijeme funkci CreateWindow, případně CreateWindowEx. Funkce CreateWindowEx je definována takto: HWND CreateWindowEx( DWORD dwexstyle, LPCTSTR lpclassname, LPCTSTR lpwindowname, DWORD dwstyle, int x, int y, // rozšířené styly okna // název třídy okna // jméno okna // styly okna // horizontální pozice okna // vertikální pozice okna

int nwidth, // šířka okna int nheight, // výška okna HWND hwndparent, // handle na rodičovské okno HMENU hmenu, // handle na menu okna HINSTANCE hinstance, // handle instance běžící aplikace LPVOID lpparam // další data pro tvorbu okna ); Třídu okna vytvoříme a registrujeme podobně jako v příkladu v díle č.3, jméno okna specifikuje vnitřní název okna, který různé třídy oken používají jinak. Standardní okna, jak je zná uživatel, jej interpretují jako název v titulkovém pruhu. LPVOID lpparam pro další data pro tvorbu okna využívají především MDI aplikace, v jednoduchých programech není potřeba. V tomto článku se ovšem nebudeme věnovat samotnému oknu, nýbrž jeho prvkům. Jak již bylo vysvětleno v minulých dílech, jsou všechny prvky okna v podstatě také okny, jediný rozdíl je v tom, že tato okna mají přiřazen styl WS_CHILD, kterým toto okno přiřazujeme jinému (mateřskému neboli top-level) oknu. Pro všechny běžně používané prvky definují Windows vždy jednu třídu okna, kterou můžeme používat bez nutnosti vytvářet si jinou. V každém programu nalezneme tlačítko. Pro všechna tlačítka je definována třída "BUTTON". Pokud tento specifikujeme ve funkci CreateWindow a jako styl specifikujeme minimálně WS_CHILD a WS_VISIBLE, vytvoří nám Windows klasické tlačítko. Vzhled tohoto tlačítka můžeme dále specifikovat styly: BS_PUSHBUTTON - vytvoří klasické tlačítko - není třeba jej specifikovat BS_DEFPUSHBUTTON - vytvoří tlačítko jež je zvýrazněno a mělo by být aktivní pro vstup z klávesnice BS_GROUPBOX - nevytvoří klasické tlačítko ale jakousi drážku pro ohraničení určité oblasti okna, daný název tlačítka je použit jako nadpis tohoto rámečku BS_CHECKBOX - vytvoří místo tlačítka zaškrtávací políčko, vhodné do formulářů, kde může být zvoleno více voleb. U tohoto stylu obrdží aplikace informaci o kliknutí, ale změnu stavu již musí provést program. Text je zarovnán vpravo od tohoto políčka, není-li specifikováno jinak. BS_AUTOCHECKBOX - vytvoří zaškrtávací políčko jako BS_CHECKBOX ale na rozdíl od BS_CHECKBOX nechá na Windows správu zaškrtávání. BS_3STATE - podobně jako BS_CHECKBOX avšak políčko může mít i neurčitý stav (zašedlé). BS_AUTO3STATE - podobně jako BS_AUTOCHECKBOX avšak políčko může mít i neurčitý stav (zašedlé). BS_RADIOBUTTON - místo tlačítka je vytvořen kruhové políčko, které je určeno především do seznamů, kdy jen jedna položka může být zaškrtnuta. Funkce je podobná jako u BS_CHECKBOX. BS_AUTORADIOBUTTON - podobně jako u BS_RADIOBUTTON ale správa reakce na kliknutí je ponechána na Windows. U radio nebo check boxů můžeme dále specifikovat tyto styly: BS_LEFTTEXT - zarovná text vlevo od daného prvku BS_LEFT - zarovná text zleva na pravé straně prvku (implicitní) BS_PUSHLIKE - checkbox, 3statebox nebo radiobutton získají tímto stylem vzhled jako klasické tlačítko. BS_RIGHT - zarovná text zprava na pravé straně prvku (implicitní) BS_RIGHTBUTTON - stejná funkce jako BS_LEFTTEXT Klasická tlačítka mohou mít dále tyto styly: BS_BITMAP - specifikuje, že tlačítko bude zobrazovat bitmapu BS_BOTTOM - umístí text na dolní okraj tlačítka BS_CENTER - horizontálně vycentruje text v tlačítku BS_ICON - specifikuje, že tlačítko zobrazuje ikonu BS_MULTILINE - v případě potřeby bude text na tlačítku zalomen do více řádků BS_TEXT - specifikuje, že tlačítko zobrazuje text BS_TOP - umístí text k hornímu okraji tlačítka BS_VCENTER - vertikálně vycentruje text na tlačítku dále lze použít styly BS_LEFT, BS_RIGHT, v tomto případě však umisťují text k danému okraji tlačítka Pro všechny typy tlačítek lze dále specifikovat styly: BS_NOTIFY - tlačítko posílá mateřskému oknu notifikační zprávy jako BN_DBLCLK, BN_KILLFOCUS, BN_SETFOCUS a další BS_OWNERDRAW - tlačítko je vykreslováno aplikací (na ukázku ručního kreslení tlačítek se můžete těšit do některého z příštích dílů).

Některé styly je možné kombinovat a tím dosáhnout zajímavých výsledků. Zkuste si třeba přiřadit tlačítku WS_DLGFRAME. Získáte tak velice zajímavý okraj pro dané tlačítko. A ještě poslední detail. Pokud se vám nelíbí klasický styl textu na tlačítku, není žádný problém získat pomocí funkce CreateFont handle na font a přiřadit jej danému tlačítku funkcí SendMessage( hwnd, WM_SETFONT, (WPARAM)hfFont, MAKELPARAM(1, 0) ); kde hwnd je handle na dané tlačítko a hffont je handle přiřazovaného fontu. Ono je sice hezké mít pěkné tlačítko, jenže pokud s ním neumíme komunikovat, je nám na nic. Windows definují pro komunikaci s tlačítky tyto zprávy: BM_CLICK - parametry žádné - posláním této zprávy tlačítku můžete nasimulovat stisk tlačítka, jako by bylo stisknuto uživatelem. BM_GETCHECK - parametry žádné - vrátí stav checkboxu nebo radiobuttonu. BST_CHECKED = tlačítko je zaškrtnuto, BST_UNCHECKED = tlačítko není zaškrtnuto, BST_INDETERMINATE = tlačítko je v mezistavu, je zašedlé BM_GETIMAGE - parametry žádné - vrátí handle na ikonu nebo bitmapu použitou pro dané tlačítko BM_GETSTATE - parametry žádné - vrátí aktuální stav tlačítka. Vrácená hodnota je bitovým součtem hodnot uvedených v BM_GETCHECK a BST_FOCUS má-li tlačítko fokus, případně BST_PUSHED je-li tlačítko stisknuto. BM_SETCHECK - wparam = stav tlačítka (jako BM_GETCHECK) - nastaví nový stav tlačítka BM_SETIMAGE - lparam = handle na novou ikonu nebo bitmapu - nastaví tlačítku ikonu nebo bitmapu BM_SETSTATE - wparam = stav tlačítka (jako BM_GETSTATE) - nastaví nový stav tlačítka BM_SETSTYLE - wparam = nový styl tlačítka; lparam = MAKELPARAM(fRedraw, 0) - fredraw je nenulový má-li být tlačítko nově překresleno - nastaví nový styl tlačítka Dále bychom od tlačítek měli odchytávat notifikační zprávy, abychom tak získali přehled o tom, co s oknem aplikace provádí uživatel. Notifikační zprávy od tlačítek mimo BN_CLICKED obdržíme v případě, že je definován styl BS_NOTIFY. BN_CLICKED obdrží aplikace vždy. Všechny notifikační zprávy jsou posílány v kontextu zprávy WM_COMMAND, a to jako horní slovo parametru wparam (HIWORD(wParam)). V parametru lparam dostaneme vždy handle na daný prvek, a ve spodním slovu parametru wparam můžeme nalézt identifikační číslo daného prvku v okně. Notifikační zprávy od tlačítek jsou: BN_CLICKED - již zmiňovaná, mateřské okno ji obdrží pokaždé, když uživatel na některé tlačítko klikl. BN_DBLCLK - oznamuje, že uživatel provedl dvojklik nad daným tlačítkem. Je posíláno pouze radiobuttonům a aplikací kresleným tlačítkům. BN_DISABLE - oznamuje, že tlačítko bylo znefunkčněno. BN_HILITE, BN_PUSHED - oznamuje, že nad tlačítkem je kurzor myši a uživatel stiskl tlačítko myši. BN_KILLFOCUS - oznamuje, že tlačítko již nemá fokus BN_SETFOCUS - oznamuje, že tlačítko získalo fokus a reaguje nyní na příkazy z klávesnice BN_UNHILITE, BN_UNPUSHED - oznamuje, že stisk tlačítka byl uvolněn Tlačítko je v GUI Windows asi nejpoužívanějším prvkem a žádná aplikace by se bez něj neobešla. V žádném případě však práce s ním není tak náročná, jak se může z tohoto článku zdát. Pomocí této stručné reference nyní můžete pracovat s klasickými tlačítky, zaškrtávacími políčky, přepínacími tlačítky (radiobuttony) a rámečky pro tyto objekty. V příštích dílech si ukážeme podobnou stručnou referenci pro další standardní prvky oken. Základ programování pro Windows v C++ (14.) Standartní ovládací prvky - editační pole Mezi standardními Common controls pro Windows nalezneme dvě třídy, řešící tento problém. Třídu "EDIT" a třídu "RICHEDIT". Protože je Richedit trochu složitější, začneme klasickými editačními políčky "EDIT". Vytvořením okna za použití třídy EDIT získáme běžné editační políčko, jaké známe ze spousty programů a pomocí kterého můžeme komunikovat s uživatelem našeho programu. Do takovéhoto běžného políčka můžeme nechat uživatele vepsat libovolný text a na jeho základě se dále rozhodnout, jak bude program pokračovat. Pokud při tvorbě nespecifikujeme žádný styl, vytvoří nám Windows jen bílé pole, do kterého je možné text vepsat. Pro úpravu vzhledu políčka můžeme použít tyto styly: