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
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