Eseményt több egység válthat ki. A leggyakrabban előforduló események az egér, a billentyűzet, az időzítő, görgető sáv, stb. eseményei. A Windows drivereken keresztül kommunikál a fizikai eszközökkel. A driverekkel a Windows rendszer DLL-jei kommunikálnak és a programunk ezekkel a DLL-ekkel áll kapcsolatban.
Az egér esetén az esemény lehet az egér mozgatása, bal-, jobb-, illetve középső- gomb lenyomása, felengedése, dupla klikkelés stb.
WM_MOUSE MOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK. Ugyanaz érvényes a jobb illetve a középső gombra csak R illetve M-t kell írni az aláhúzás utáni L helyett. Ebben az esetben a wParam értéke tartalmazza, hogy ugyanakkor lenyomtak-e valamilyen shift vagy control gombot vagy sem. Az lParam értéke tartalmazza a kurzor pozícióját (az alsó szó tartalmazza az x koordinátát a felső pedig az y-t). A dupla klikkelés csak akkor értelmezi a Windows annak, ha a beállított időn belül (default 500 ms) nyomtuk meg a gombot kétszer. A dupla klikkelési idő beállítására szolgál a
SetDoubleClickTime(UINT)
függvény. Szeretném felhívni a figyelmet arra, hogy általában (természetesen van kivétel) a minden Set-tel kezdődő (beállító) függvény mellett létezik egy Get-tel kezdődő (lekérdező) ugyanilyen függvény létezik. Ha a gomb lenyomás az ablak nem aktív területére történt, akkor ilyenkor az üzenet neve kiegészül egy NC-vel (WM_NCLBUTTONDOWN). Egy adott ablak akkor kapja meg az egér üzenetet, ha fölötte volt a kurzor klikkeléskor. Ha azt akarjuk, hogy mindig egy adott ablak kapja meg az egér eseményt a kurzor helyzetétől függetlenül, akkor ki kell adni a
HWND SetCapture(hWnd)
függvényt, amelynek a visszatérési értéke az ablak amely előtte birtokolta az egér üzeneteket. Amikor vissza akarjuk állítani az eredeti helyzetet, akkor a
ReleaseCapture void
függvényt kell meghívni.
A billentyűzet eseményt az az ablak fogadja, amely birtokolja az input fókusz. Az input fókusz mindig az aktív ablak valamelyik gyermek ablakánál van. Pl. a 4. ábrán a Run ablak az aktív ablak és a fókusz ennek az ablaknak a Command Line nevű Edit gyermek ablakánál van.
4. ábra
A billentyűzet üzenetei a WM_KEYUP, WM_KEYDOWN, WM_CHAR, WM_DEADCHAR, WM_SYSKEYUP, WM_SYSKEYDOWN, WM_SYSCHAR, WM_SYSDEADCHAR. Ilyen üzeneteknél a wParam paraméter a virtuális billentyű kódot tartalmazza. Az lParam pedig információkat tartalmaz a lenyomott billentyűről.
A Windows a PC-ben található Timer IC (Intel 8254) használja az időzítések megvalósítására. Ez az IC 54.925 msec-onként aktivizálja 08H megszakítást. Tehát a Windows időzítőjének az érzékenysége 54.925 msec. A Timer beállítására a következő függvény használatos
Timer =SetTimer (hWnd, idTimer,msec, (TIMERPROC) lpfnMyTimerProc)
A visszatérési érték jelzi, hogy sikerült a beállítás vagy sem. Egyszerre 32 Timer beállítást enged meg a Windows.
Az első paraméter az ablak leírója, a 2. az időzítő azonosítója, a 3. az idő intervallum és a 4. az időzítésre reagáló függvény címe. Ha a 4. paraméter értéke NULL, akkor egy WM_TIMER eseményt generál a Windows és az adott applikáció várakozási sorába teszi. A létrehozott időzítőt meg lehet semmisíteni a következő függvénnyel
BOOL KillTimer(HWND hWnd, UINT idTimer)
Amikor egy menüelemet kiválasztunk, akkor egy WM_COMMAND üzenet kerül a várakozási sorba. Az üzenet wParam paramétere tartalmazza a kiválasztott menüelem azonosítóját. Ha a felhasználó a rendszermenüből választ ki, akkor WM_SYSCOMMAND üzenetet generál a Windows. A menükezeléssel részletesebben fogunk foglalkozni az erőforrásoknál.
Ahogy említettem az I.6. fejezetben az ablak létrehozása előtt regisztrálni kell az osztályt, amihez tartozni fog az említett ablak. A Windows rendszerben 6 előre definiált osztály van. Ezekből az osztályokból származtatott elemeket (objektumokat) vezérlési és megjelenítési funkciókat látnak el. Az a közös tulajdonságuk, hogy mindegyikük létrehozható a CreateWindow(...) függvénnyel. A főablakhoz hasonlóan az ablak mozgatható áthelyezhető, kitiltható, rejthető, stb. Ilyen gyermekablak létrehozásakor az ablak stílusra (Window Style) a WS_CHILD jelzőt kell használni. Az említett osztályok a következők:
- edit : editor ablak. Arra használjuk ezt az objektumot, hogy szöveget bevigyünk illetve jelenítsünk meg. Az a jellegzetessége, hogy nem kell nekünk gondoskodnunk a karakterek megjelenítéséről. Amikor ennél az elemnél van az input fókusz és gépelünk valamit, akkor a karakterek automatikusan jelennek meg az ablakban (ha a Read Only nincsen beállítva). Be lehet állítani a görgetési opciókat, pl. automatikusan görgessen függőlegesen és vízszintesen. Be lehet állítani, ennek a hosszát, egy vagy több soros, stb. Példa: Írjuk ki a "Hello Windows" szöveget az edit ablakba.
strcpy(szText,"Hello Windows")
SendMessage(EdithWnd,WM_SETTEXT,0,(LPARAM)(LPSTR)szText)
- static : statikus ablak. Ez az ablak statikus szöveg megjelenítésére alkalmas. A szöveget tájékoztatási célra lehet használni. pl. az editor ablak mellett lehet jól használni. Általában tájékoztatja a felhasználót arról, hogy milyen adatokat kell beírni az adott edit ablakba. (az ábrán a kombináltdoboz baloldalán beírt szöveg a statikus ablak)
- button : nyomó- és kiválasztó gomb. Ezt az ablakot (elemet, objektumot) vezérlési funkciókra használhatjuk. Tetszőleges képet (bitmap, ikon) vagy szöveget tehetünk a nyomó gombra. A nyomógomb a beállításához az is hozzátartozik, hogy BS_PUSHBUTTON vagy BS_DEFPUSHBUTTON. Az utóbbi esetben az lenyomásának hatására a vezérlés automatikusan erre a gombra kerül és az ehhez a gombhoz tartozó funkció hajtódik végre. Létezik a nyomó gombon kívül kiválasztógomb (Check button) és Rádiógomb (Radio button) az utóbbi két fajta egy logikai értéknek felel meg. A gomb ki van választva vagy sem. Ezeknek a gomboknak le kérdezni és ugyanakkor beállítani is lehet az állapotát. Általában a rádiógombot kizárásos kiválasztási célokra szokták használni (egy csoporton belül egyszerre csak egy lehet beállított állapotban).
Nyomó Rádió Check
-listbox : listaablak. Ez az ablaknak a segítségével tudunk a meglévő elemekből kiválasztani egy elemet. A lista feltöltéséről nekünk kell gondoskodnunk. Példa: töltsük fel a listaablakot.
char *sString[5]=,
,
,
,
,
};
for (i=0;i<5;i++)
SendMessage(ListhWnd,LB_ADDSTRING,0,(LPARAM)(LPSTR)sString[i]);
-combobox: kombinált doboz: Ez az ablak hasonlít a lista ablakhoz, azzal a különbséggel, hogy ebbe az ablakba beírni is lehet. Az ablak feltöltéséhez ugyanazt az eljárást használjuk mint fent, de az LB_ADDSTRING helyett a CB_ADDSTRING-et használjuk.
- scrollbar:
görgetősáv. az adatok lapozására szolgál. Két típus létezik a
függőleges és a vízszintes. . Ennél az ablaknál beállítható a
görgetési tartomány hossza (minimuma és maximuma). Le lehet kérdezni a
tartományt, a pozíciót és ugyanezeket
beállítani is lehet.
A fent említett összes ablak esetén le tudjuk kérdezni az ablak szülőt a
HWND GetParent(HWND)
függvénnyel. Minden ablakot lehet tiltani (disable) vagy engedélyezni (enable) a következő függvénnyel.
BOOL EnableWindow(HWND, BOOL)
Továbbá
BOOL IsWindowVisible(HWND) az ablak látható-e
BOOL IsWIndowEnabled(HWND) az ablak engedélyezve van-e
int GetWindowText (HWND, LPSTR, int) Mi az ablak címe
void SetWindowText(HWND,LPSTR) Állítsa be az ablak címet a
int GetWindowTextLength(HWND) Mennyi az ablak címének a hossza
A Windows alatt van egy kitüntetett szerepű API függvény, ami különböző célokra használható ez a SendMessage függvény.
SendMessage(HWND, UINT, WPARAM, LPARAM)
Ennek segítségével (a megfelelő attribútumokkal) számos dolgot lehet lekérdezni és beállítani. Például a SendMessage(hWndgomb, BM_SETCHECK,1,0L) beállítja a hWndgomb leírójú Check box TRUE-ra (az 1 miatt). és a következő utasítással vissza tudjuk kérdezni a gomb állapotát.
allapot = SendMessage(hWndgomb, BM_GETCHECK,0,0L)
Megjegyzés : Bár a fent említett kezeléstechnika helyes és működőképes de számos kérdést vet fel. Vajon ha sok gombot kezel az én programom annyiszor kell meghívni a CreateWindow függvényt ahány gomb van? Annyi ablakkezelő függvényt kell létrehozni, ahány gomb illetve elem van? Természetesen a válasz nem! A fent említett elemeket létrehozásához egy úgynevezett erőforrás editort (Resource Editor)használunk. A BorlandC++ esetén az erőforrás editor egy Workshop nevű program (5. ábra) , a VC++ pedig az App Studio (6. ábra). Ezekkel a kiváló fejlesztési eszközökkel tetszés szerinti dialógus ablakokat szerkesztünk. A szerkesztett dialógus ablakokhoz tartozó események kezeléséről nekünk kell gondoskodnunk a programból. Természetesen egy dialógus ablakon belül számos elem lehet (a BorlandC++ 3.1-ben az egy ablakon levő elemek száma nem lehet nagyobb mint 255). Minden elem egy egyedi azonosítóval van ellátva. Ennek az azonosítónak a segítségével tudjuk megkülönböztetni az elemeket egymástól, hogy az éppen feldolgozás alatt levő üzenet kié. Ezzel részletesen fogunk foglalkozni az erőforrás fejezetben.
(5. ábra)
(6. ábra)
|