Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Események generálása

Maghiara


Események generálása

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.



8.1. Egér esem 23123s1824x ények

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.

8.2. Billentyűzet események

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.

8.3. Timer (Időzítő) eseményei

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)

8.4. Menü események

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.

9. Gyermek ablakok

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)




Document Info


Accesari: 879
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2025 )