07.06.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

P R O G R A M U J E M E<br />

{<br />

}<br />

LPTSTR docas=NULL;<br />

docas=(LPTSTR)GlobalAllocPtr(GHND, 50 * sizeof(TCHAR));<br />

GetPrivateProfileString(section, <strong>na</strong>me, „“, docas, 4096, file);<br />

return docas;<br />

Vola ju môžeme takto:<br />

char cesta[_MAX_PATH];<br />

strcpy(cesta, PrecitajStringINI(„NASTAVENIA“, „CestaEXE“,<br />

„mojini.ini“));<br />

V premennej cesta budeme ma uložený string z INI súboru. Na úspešné <strong>sk</strong>ompilovanie<br />

tohto kódu musíte okrem štandardných hlavièkových súborov includova aj string.h<br />

(pre strcpy), stdlib.h (pre _MAX_PATH ) a windowsx.h (<strong>na</strong> správne alokovanie pamäte pre<br />

re azec vo funkcii PrecitajStringINI).<br />

Tým sme vybavili èítanie, ostáva ešte zápis. Na zápis re azcových aj èíselných hodnôt<br />

bez rozdielu slúži funkcia:<br />

BOOL WritePrivateProfileString(LPCTSTR menoSekcie, LPCTSTR menoKluca,<br />

LPCTSTR zapisRet, LPCTSTR menoINISuboru);<br />

Pokia¾ ide o bližší opis parametrov, opä vás odkážem <strong>na</strong> help. Funkcia zapisujúca hodnotu<br />

0 do parametra SpustP vyzerala takto:<br />

BOOL ZapisStringINI(LPCTSTR section, LPCTSTR <strong>na</strong>me, LPCTSTR str_zapisat,<br />

LPCTSTR file)<br />

{<br />

return WritePrivateProfileString(section, <strong>na</strong>me, str_zapisat, file);<br />

}<br />

Volali by sme ju takto:<br />

BOOL bNavrat;<br />

bNavrat=ZapisStringINI(“NASTAVENIA”, “SpustP”, “0”, “mojini.ini”);<br />

Ak zadaný súbor INI v zadanej ceste neexistuje, vytvorí sa v systémovom adresári Windows.<br />

Takisto ak neexistuje sekcia/k¾úè, kam chceme zapisova , vytvoria sa. Ak je meno súboru INI<br />

bez akejko¾vek cesty (ako v <strong>na</strong>šom príklade), defaultný adresár, kde ho program h¾adá, je aj<br />

adresár Windows. Existujú aj ïalšie funkcie <strong>na</strong> prácu so súbormi INI [<strong>na</strong>pr. WritePrivate-<br />

ProfileSection <strong>na</strong> zápis celej sekcie (Get... <strong>na</strong> èítanie), WritePrivateProfileStruct <strong>na</strong> zápis štruktúry<br />

dát (Get... <strong>na</strong> èítanie)], ktoré sme si tu nespomenuli, ich použitie je podobné ako v prípade<br />

zápisu/èítania jednoduchých dát. Pre záujemcov o detaily je k dispozícii help.<br />

Q: Ako zí<strong>sk</strong>am zoz<strong>na</strong>m všetkých procesov, ktoré práve bežia vo Windows?<br />

A: V prvom rade je potrebné zoh<strong>na</strong> si súbory psapi.h, psapi.lib a psapi.dll (dostupné<br />

<strong>na</strong>príklad <strong>na</strong> <strong>www</strong>.msdn.microsoft.com – dajte si ich tam vyh¾ada alebo mi <strong>na</strong>píšte,<br />

pošlem vám ich). Psapi.h a psapi.lib pridajte do svojho projektu (v menu Project->Add to<br />

Project->Files) a psapi.dll <strong>na</strong>hrajte do System32 adresára v adresári, kde máte <strong>na</strong>inštalované<br />

Windows. Sú to súbory obsahujúce deklarácie a definície funkcií, ktoré sú nevyhnutné<br />

pre náš ukážkový príklad a vo všeobecnosti zabezpeèujú prácu s procesmi.<br />

Ukážeme si tvorbu celej aplikácie po krokoch (príklad je urèený len pre operaèné systémy<br />

NT/2000, mal by fungova aj pod XP).<br />

1. Vytvorte nový projekt s názvom Procesy (Win32 Console Application->An empty<br />

project a Finish).<br />

2. Pridajte do projektu súbory psapi.h, psapi.lib a jeden nový zdrojový súbor –<br />

procesy.c (Nie cpp).<br />

3. Na webe PC REVUE v sekcii Programujeme máte kompletný kód, ktorý <strong>na</strong>píšte<br />

do súboru procesy.c.<br />

Q: Ako pridám aplikáciu do SystemTray (Ta<strong>sk</strong>Baru)?<br />

A: Pozrite si <strong>na</strong>sledujúcu funkciu:<br />

void PridajNaTa<strong>sk</strong>bar(HWND hWnd, UINT uID, HICON hIcon, LPSTR lpszTip)<br />

{<br />

NOTIFYICONDATA tnid;<br />

}<br />

tnid.cbSize = sizeof(NOTIFYICONDATA);<br />

tnid.hWnd = hWnd;<br />

tnid.uID = uID;<br />

tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;<br />

tnid.uCallbackMessage = WM_NOTIFYICON;<br />

tnid.hIcon = hIcon;<br />

if (lpszTip)<br />

lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip));<br />

else<br />

tnid.szTip[0] = ‘\0’;<br />

res = Shell_NotifyIcon(NIM_ADD, &tnid);<br />

if (hIcon)<br />

DestroyIcon(hIcon);<br />

Má tieto parametre:<br />

Parameter HWND hWnd zí<strong>sk</strong>ate pri tvorení ok<strong>na</strong> aplikácie (návratová hodnota funkcie<br />

CreateWindow – pozri druhú èas seriálu).<br />

Parameter UINT uID obsahuje ID zdroja ikony (zdroj ikony pridáte do zdrojov cez menu<br />

Visual C++ Insert -> Resource a vyberiete Icon alebo Import, ak chcete použi existujúcu<br />

ikonu). Pre náš príklad bude meno zdroja ikony IDI_PRIKLAD. Potom parameter uID<br />

bude obsahova práve toto meno.<br />

Parameter HICON hIcon je handle zdroja ikony. Najprv musíte zadeklarova tento handle ako:<br />

HICON hIcon;<br />

a jeho hodnotu zí<strong>sk</strong>ate ako návratovú hodnotu funkcie LoadIcon (parameter funkcie<br />

LoadIcon hInstance je tiež opísaný v druhej èasti seriálu):<br />

hIcon=LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PRIKLAD));<br />

Parameter LPSTR lpszTip je akýko¾vek textový re azec, ktorý sa zobrazí, ak myšou „zájdete“<br />

<strong>na</strong>d ikonu v Ta<strong>sk</strong>Bare.<br />

Volanie funkcie PridajNaTa<strong>sk</strong>bar by v <strong>na</strong>šom prípade vyzeralo takto:<br />

PridajNaTa<strong>sk</strong>bar(hWnd, IDI_PRIKLAD, hIcon, „Pokus s Ta<strong>sk</strong>Barom“);<br />

Ak sme však ikonu <strong>na</strong> Ta<strong>sk</strong>Bar pridali, bolo by dobré ju po <strong>sk</strong>onèení aplikácie vymaza .<br />

Pridajte preto <strong>na</strong>sledujúci kód <strong>na</strong> miesto, kde ukonèujete svoju aplikáciu (v druhej èasti<br />

seriálu by to bolo vo vetve WM_DESTROY funkcie WndProc pred volanie funkcie<br />

PostQuitMessage(0)), <strong>na</strong>príklad:<br />

case WM_DESTROY:<br />

// zmazeme ikonu z toolbaru<br />

tnid.cbSize = sizeof(NOTIFYICONDATA);<br />

tnid.hWnd = hWnd;<br />

tnid.uID = IDI_PRIKLAD;<br />

res=Shell_NotifyIcon(NIM_DELETE, &tnid);<br />

// potom ukoncime aplikaciu<br />

PostQuitMessage(0);<br />

return 0;<br />

Premenná res je deklarovaná ako BOOL. Otázkou zostáva, ako zachytáva správy pre<br />

aplikáciu umiestnenú v Ta<strong>sk</strong>Bare (<strong>na</strong>pr. kliknutie myšou <strong>na</strong> ikonu aplikácie). Vo funkcii<br />

PridajNaTa<strong>sk</strong>bar sa <strong>na</strong>chádza riadok:<br />

tnid.uCallbackMessage = WM_NOTIFYICON;<br />

WM_NOTIFYICON je používate¾om definovaná správa, ktorá bude vyslaná vždy, keï<br />

myšou „zájdete“ <strong>na</strong>d ikonu aplikácie v Ta<strong>sk</strong>Bare. Túto správu obslúžite ako každú inú vo<br />

funkcii ok<strong>na</strong> WndProc (stále uvažujeme príklad z druhej èasti seriálu), kde bude predstavova<br />

ïalšiu vetvu case. Napríklad stlaèenie pravého tlaèidla myši <strong>na</strong> ikone aplikácie v Ta<strong>sk</strong>-<br />

Bare môžete obslúži takto:<br />

switch (message) {<br />

// ak zajdeme mysou <strong>na</strong>d ikonu...<br />

case WM_NOTIFYICON:<br />

// ...a stlacime prave tlacidlo mysi...<br />

if (lParam == WM_RBUTTONDOWN) {<br />

MessageBox(hWnd, „Stlacili ste prave tlacidlo<br />

mysi?“, „Informacia“, MB_OK)<br />

}<br />

break;<br />

Správa WM_NOTIFYICON predstavuje používate¾om definovanú správu, preto ju musíte<br />

<strong>na</strong> zaèiatku programu aj zadefinova :<br />

// pouzivatelom definova<strong>na</strong> sprava<br />

#define WM_NOTIFYICON (WM_USER+100)<br />

Ak by sa náhodou vy<strong>sk</strong>ytli problémy pri zachytení tejto správy (záleží <strong>na</strong> verzii<br />

Windows), zmeòte hlavièku funkcie WndProc z druhej èasti seriálu takto:<br />

LRESULT WINAPI WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM<br />

lParam)<br />

èo predstavuje modernejší zápis (používaný vo WIN32API) oproti tomu, ktorý je uvedený<br />

v druhej èasti seriálu.<br />

ÈO NÁS EŠTE ÈAKÁ? V ïalších èastiach si ešte preberieme kolekcie, serializáciu,<br />

rozdiely aplikácií SDI a MDI, povieme si nieèo o registroch, písaní knižníc DLL, tlaèi<br />

a seriál ukonèíme „èerešnièkami“ v podobe využívania komponentov ActiveX, bitmáp a<br />

viacvláknového programovania. Tým ukonèíme základ, spomí<strong>na</strong>ný v prvej èasti, po ktorého<br />

zvládnutí budete pripravení <strong>na</strong> zí<strong>sk</strong>avanie ïalších vedomostí. Po dlhšom zvažovaní<br />

som sa rozhodol neopisova prácu s databázami [pomocou DAO, o „jednoduchšom“<br />

ADO (ActiveX Data Objects) si povieme aspoò základy], èo je ve¾mi rozsiahla téma, takmer<br />

<strong>na</strong> ïalší seriál. Takisto si nepovieme niè o komponentoch COM, COM+, DCOM, OLE a<br />

podobných, èo sú rov<strong>na</strong>ko ve¾mi rozsiahle a zložité „technológie“, ktorých vývoj ešte<br />

stále nie je ukonèený a v novom Visual Studiu bude práca s nimi z<strong>na</strong>ène zjednodušená,<br />

takže možno až potom... Vidím to tak, že seriál by mohol konèi 24. èas ou, v ktorej uvedieme<br />

podobné FAQ ako v tejto èasti, èím celú tému uzavrieme.<br />

NABUDÚCE. V ïalšej èasti sa vrátime opä ku klasickému výkladu a budeme pokraèova<br />

v zdoko<strong>na</strong>¾ovaní aplikácie StudentList. Stretneme sa až v roku 2002, takže vám<br />

prajem krásne prežitie Vianoc, veselého Silvestra a ve¾a, ve¾a úspechov v roku 2002!<br />

Marek Šamaj<br />

146 PC REVUE 12/2001

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!