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




félév folyamán a következő témákkal fogunk foglalkozni:

Maghiara


félév folyamán a következő témákkal fogunk foglalkozni:

I. A Windows Programozás alapjai



Bevezetés, eseményvezérelt programozás alapjai

Windows program felépítése, készítése, fordítása. Erőforrások (Menük, dialógus ablakok, ikonok, bitmappek, sztringek, stb...). Common dialógus ablakok(FileOpen, FileSave, Color, Font, Print setup, Find, Replace, stb..)

GDI(Graphic Device Interface), memória és fájlkezelés, DL 11111u2010l L-ek készítése.

DDE (Dynamic Data Exchange), OLE (Object Linking and Embedding), Help készítése

II. Windows Programozás Visual C++ környzetben

VC++ : előnyei, lehetőségei.

Az MFC (MICROSOFT FOUNDATION CLASSES) szerkezete, előnyei. Néhány osztály (CWinApp, CFrameWnd, CDocument, CView, CDialog, CFile, stb..) részletes tárgyalása.

Wizardok használata egy program készítéséhez.

Erőforrások kezelése.

Az első részben tárgyalt elemek felhasználása a VC++-ban.

Irodalom:

Charles Petzold Programming Windows 3.1 (Angolul)

Könnyű a Windows-t programozni (Magyarul)

Windows 95 programozása C és C++ nyelven(Magyarul)

Windows Programming with Borland C++ (Angolul)

Microsoft VISUAL C++ 1.52 leírása: MFC Library volume 3 of 3 (Angolul)

VISUAL C++ Hargittai Péter-Kaszanyiczki László(Magyarul)

VISUAL C++ 2 Developer's Guide Naba Barkakati (SAMS kiadó) (Angolul)

VISUAL C++ Tutorials ( Developement system for Windows 95 and Windows NT)

Microsoft TechNet CD-k (Developer's Tools)

Microsoft Developement Studio online Books (Help)

I.

Windows programozás alapjai

1. Bevezetés

A grafikus ferlhasználói felületek GUI (Graphical User Interface) a 70-es években láttak napvilágot. Az első GUI rendszert a Xerox's Palo Alto Research Center (PARC) dolgozta ki. Ez a GUI volt a felülete az objektum orientált Smalltalk fejlesztési rendszernek.

A GUI fejlesztői az objektum orientált programozás ideális eszközeinek tekintik a GUI rendszereket. A PARC rendszer után számos grafikus felület jelent meg, például: "Apple Lisa", "OS/2 presentation", "X-Windows ", stb...

A MICROSOFT Windows is egy ilyen GUI felületet biztosító program. Amikor kezdték a Windows fejlesztését az objektum orientált programozás még nem volt eléggé átgondolt és még nem volt annyira ismert, ezért a Windows-t procedurális nyelven írták meg (C nyelven ). Az első windows verzió 1985-ben jelent meg, azóta számos változáson ment át.

Év

Verzió

Megjegyzés

320 KB RAM

Hasonlított az OS/2 Presentation managerre

286 és 386

Real, Standard, Enhanced mod támogatása

Standard, Enhanced mod támogatása

Windows for WorkGroups 3.1

(Peer to Peer) hálózat támogatás

(3.1 továbbfejlesztett változata)

Ezek a verziók nem rendelkeztek saját fájl rendszerrel és mind 16 bitesek voltak. 1993-ban adta ki a Microsoft a Windows NT 3.5-t és utána az NT 3.51-t, ami igazi 32 bites multitaszkos operációs rendszer. Az NT-nek létezik ALPHA, MIPS és INTEL változata, azonban a PC világban nem tudta helyettesíteni a "Sima" Windows-t a Hardver igénye miatt. 1995-ben megjelent a Windows 95, ami igazi 32 bites operációs rendszer. A Microsoft 1996 nyárra tervezi az igéretes Windows NT 4.0-t, ami a jelenlegi hírek szerint a Windows 95 és az NT 3.51 ötvözete lesz.

2. Definició

A Windows egy olyan grafikus felületet biztosító program, amely lehetővé teszi, hogy az alatta megírt programok párhuzamosan fussanak, üzeneteken keresztül kommunikáljanak egymással. A Windows a fájlkezelésen kívül az összes program menedzselési funkciót saját maga végzi. A fájlkezelés a Windows alatt működő DOS operációs rendszer feladata.

A Windows mint bármilyen más DOS program, programként indítható. Amikor betöltődik számos feladatot vesz át a DOS-tól.

A Windows-hoz van egy olyan program(kiegészítés), amely 32 bites réteget biztosít a Windows felett, ez a Win32s program. Ennek segítségével 32 bites applikációk is futtathatók a Windows alatt.

3. A Windows előnyei és hátrányai

Előnyei:

- Egyszerű, egységes kezelés

- hardver eszközök jobb kihasználása

- multitaszkos (nempreemptív)

- nagyon hasonlít más számítógépek operációs rendszeréhez

- hardver független programot írhatunk alatta

- esemény vezérelt

- stb...

Hátrányai:

- Nagy méret

- csak PC-n fut

- alacsony szintű I/O kezelés hiányossága.

Mivel a Windows alatt egyszerre több program fut, ezért rendet kell tennie a memóriában. Szükség esetén a Windows adat és kód blokkokat mozgat a memórián belül ( természetesen ez mind akkor igaz, ha mi engedélyeztük neki ezt a program megírása során). Ha nagy igény van a memóriára, akkor a Windows a nem használt blokkokat kiteszi a memóriából, és amikor újból szükség van rá, akkor tölti be az Exe fájlból. Egy program több példányban is futhat a Windows alatt úgy, hogy a kód egy példányban lesz jelen a memóriában és az adat annyiszor, ahány példány fut éppen.

A Windows programok általában egy futtatható exe fájlból és számos DLL (Dynamic Link Library)-ből állnak. A DLL-ek olyan adat-, erőforrás- és függvény-gyűjtemények, amelyek dinamikusan töltődnek be a memóriában, ha valamelyik applikáció hivatkozik rájuk, így nem linkelődnek statikusan a programhoz. A futtatható fájl információt tartalmaz arról, hogy melyik DLL melyik függvényét fogja meghívni. Természetesen ezeknek a függvényeknek "exportáltan"(lásd később) kell szerepelniük.

A Windows rendszer 3 részből áll:

KERNEL : ez a könyvtár főleg a memória menedzselési funkciókat tartalmazza

USER : A felhasználói felületet biztosítja. Menük, dialógus ablakok, stb,...

GDI : A rajzolási rutinokat és az ezekkel kapcsolatos funkciókat tartalmazza.

4. API (Application Programming Interface)

API alatt a Windows alatt használt és a fent említett DLL-ekben definiált főleg függvények, (változótípusok és konstansok) összességét értjük. Ezek az elemek nem nyelvfüggőek. Bármilyen Windows alatt használt programozási nyelvben alkalmazhatók (C, C++, MS-ACCESS, VISUAL BASIC, FOXPRO, stb).

4.1. Változótípusok

Természetesen minden nyelvnek vannak saját változótípusai. Ezeken a "hagyományos" típusokon kívül vannak olyan típusok, amelyek windows specifikusok. A C nyelv esetén ezek a <windows.h> fájlban vannak definiálva. Ezek közül néhány: LONG, WORD, DWORD, LPSTR, HWND, HANDLE, LRESULT, stb... Számos struktúra típus is van, ezek közül néhányat említünk:

typedef struct tagPOINTPOINT

typedef struct tagMSG MSG;

typedef struct tagRECT RECT, stb...

Magyar jelőlési rendszer:

A Windows programozás során a változó neveket -Simonyi Károly nyomán- úgy szokás felvenni, hogy a név kezdőbetűi utaljanak a változó típusára. pl

b : char n :int

p : 16 bites pointer l :long

lp : 32 bites pointer,stb (Lásd 1. sz. melléklet mellek1.doc)

4.2. Konstansok, attribútumok

Kb. 6000 előre definiált konstans van az API-ban. Ezeknek az a jellegzetessége, hogy az elnevezésük prefixumokkal (2, 3 nagybetű) kezdődik. A prefixum utal az attributum jellegére. A prefixum után egy aláhuzás jel következik és utána jön maga a konstans nagybetűvel. Néhány példa illusztrációként (Lásd még az 1. sz. melléklet mellek1.doc):

CS : (Class Style) ablakosztály stílus CS_HREDRAW

IDI : (IDentifier Icon) ikon azonosító IDI_APPLICATION

IDC : (IDentifier Cursor) Kurzor azonosító IDC_WAIT

WS : (Window Style) ablak típus WS_ICONIC

CW : (Create Window) ablak létrehozás CW_DEFAULT

WM : (Windows Message) Windows üzenet WM_PAINT

DT : (Display Text) szöveg megjelenítés DT_CENTER

BM : (Box Message) Check- vagy RadioBox üzenete BM_GETCHECK

CB : (Combo Box) kombó doboz CB_GETCURSEL

LB : (List Box) lista doboz LB_SETCURSEL

EM : (Editor Message) editor üzenet EM_LIMITTEXT

CF : (Clipboard Format) vágólap formátuma CF_BITMAP

ERR : (ERRor) hibakódok, stb... ERR_CREATEDLG

4.3. Függvények

Több mint 1000 API függvény van (lásd 1. sz. melléklet mellek1.doc). A függvények nevei általában több angol szóból állnak. A szavak első betűje mindig nagybetű pl. SetWindowText(....). Természetesen a saját függvényeinket úgy nevezzük, ahogy akarjuk. Figyelembe kell venni, hogy a C nyelv különbséget tesz a nagy és a kis betű között (Case Sensitive). Ha ugyanazt az API függvényt akarjuk meghívni egy másik programozási nyelven pl. a BORLAND PASCAL-ban vagy VISUAL BASIC-ben vagy MS-ACCESS-ben, akkor nem kell különbséget tenni a kis és a nagy betű között, de érdemes (esztétikailag) úgy írni a függvény nevét, ahogy a C-ben írjuk és ahogy szerepelt a gyűjteményben.

Az API függvények FAR PASCAL típusúak. A FAR jelző azt jelenti, hogy távoli hívás (más kódszegmensben levő program is elérheti őket) és a PASCAL jelző azt jelenti, hogy a függvényhívás a Pascal konvenció szerint történik. Mint ismeretes a Pascal konvenció azt jelenti, hogy a függvény paraméterei a deklarálási sorrendjükben kerülnek a stack-be és a stack kiűrítése (takarítása) a hívott függvény feladata. A Win32s és a Windows'95 alatt (Win32c) a FAR PASCAL elnevezés helyett a WINAPI jelző használatos. A Windows'95 támogatja a sík modellű (flat model) memóriakezelést, ezért a FAR jelző nem szükséges. Vannak olyan kitüntetett szerepű függvények, amelyeket az operációs rendszer hív meg (jelen esetben a Windows !) ezeket a függvényeket CALLBACK függvényeknek nevezzük. A CALLBACK függvényeknek FAR PASCAL típusuaknak kell lenniük és "exportálni" kell őket, hogy a Windows meg tudja hívni. Az exportálás kétféleképpen történhet: vagy felsoroljuk őket a definiciós fájl (lásd később) EXPORTS szekciójában, vagy a függvény elé tesszük az _export jelzőt.

long FAR PASCAL _export EditDlgProc (HWND, UINT, UINT, LONG) ;

5. Eseményvezérelt programozás

A Windows alatt futó programok futási menetét a felhasználói események határozzák meg. A program ezekre az eseményekre reagál. Egy programhoz több ablak tartozhat. Minden ablaknak van saját ablakkezelő függvénye (CALLBACK függvény), amely gondoskodik az ablakhoz érkező események kezeléséről. Ebből adódik, hogy egy Windows programban legalább egy ablakkezelő függvény van. A felhasználói eseményeket (egér, billentyűzet, időzítés, menü stb..) a Windows saját üzenet formátummá konvertálja. Az üzenet a következőket tartalmazza: a cimzett (ablak leíró HWND), az üzenet tárgya (UINT típusú szám), az üzenet tartalma(WORD wParam, LONG lParam), az üzenet keltének időpontja és az üzenet keltésekor érvényes kurzor pozíció.

typedef struct tagMSG

MSG;

Mint említettem az előbb, egyszerre több programot lehet indítani a Windows alatt. Aktív applikáció alatt azt az applikációt értjük, amely éppen elfogadja a felhasználói eseményeket. Egy applikáción belül aktív ablakról is beszélhetünk. A felhasználói eseményeket az üzenetté való konvertálása után a rendszer egy hosszú rendszer várakozási sorba (System queue) helyezi el. Minden futó applikációhoz tartozik egy üzenet sor (Message queue). A system queue -ba érkező üzenetek továbbításra kerülnek az applikációk üzenet soraiba (1. ábra). Az applikáció maga gondoskodik az üzenet kiszedéséről és feldolgozásáról.

6. A program szerkezete

Egy tipikus Windows program a következő részekből áll:

- Inicializálás: ebben a részben történik az ablak osztály regisztrálása a rendszerben és a változók inicializálása.

- A főablak létrehozása.

- Az üzenetkezelő ciklus (kiolvassa a várakozási sorból az üzeneteket és továbbítja a Windowsnak, hogy ezekkel a paraméterekkel hívja meg az ablakkezelő függvényt.

A főablak kezelő függvénye (Window procedure): az üzenetekre való reagálás

A kilépés előtti takarítás, kilépés.

Tehát majdnem minden windows programunk a következőképpen fog kinézni:

#include <windows.h>

#include <másfájlok.h>

#include "myfiles.h"

#define ....

// globális változók deklarálás

WinMain(.............................)

return msg.wParam;

// Ablak kezelő függvény

LONG CALLBACK _export MyWP(HWND hwnd,UINT msg,WPARAM wParam, LPARAM lParam)

return 0;

case WM_DESTROY:

memóriafelszabaditas() // pl. memória felszabadítás

PostQuitMessage(0);

return 0;

}

return DefWindowProc(hwnd, msg, wParam, lParam);

Mint tudjuk a C nyelvben a main() függvény a belépési pontja a programnak. A Windows alatt a main függvény helyet a WinMain-t kell használni. Az API elemek a windows.h-ban vannak deklarálva ezért a program elején be kell "inkludolni" a "windows.h" fájlt.

6.1. Az üzenetkezelő ciklus és az üzenetvezérlés

Mint látható a fenti példában a üzenetkezelő ciklus 3 részből áll (természetesen más is lehet benne). Az első az üzenet kiolvasása a sorból, ezután az üzenet konvertálása és az üzenet továbbítása a Windowsnak, hogy ezekkel a paraméterekkel hívja meg az ablakkezelő függvényt. A sor hossza alapértelmezésben 8. De ezt az értéket növelhetjük a

SetMessageQueue(int n)

fügvénnyel, ahol n maximális értéke 120. Ez a függvény új sort hoz létre és megsemmisíti az elözőt. Csak az ablak létrehozása elött szabad meghívni!

6.1.1. Olvasás a sorból

Az üzenet kiolvasására két API függvény létezik az egyik a GetMessage, a másik a PeekMessage.

BOOL GetMessage(MSG FAR *lpMsg,HWND hWnd,WORD wMinFilter,WORD wMaxFilter)

Ha a függvény talál a sorban üzenetet, akkor azt kiveszi, ha nem, akkor vár és visszaadja a vezérlést a Windowsnak. A Windows ilyenkor átkapcsol egy másik applikációra, amelynek a várakozási sorában vannak üzenetek. Ez képezi a Windows nonpreemptív multitaszkos (nem előre megszerzett jogokon alapuló többfeladatos) jellegét. Egyszerre csak egy program futhat, ez az aktív applikáció. A nem aktív applikációk működése addig van felfüggesztve, amíg az aktív applikáció vissza nem adja a vezérlést a Windowsnak.

A függvény első paramétere egy MSG struktúrára mutató long pointer, ide kerül az üzenet a várakozó sorból. A másik három paraméter szűrési célokra használható. A hWnd jelzi, hogy melyik ablak üzeneteire vagyunk kíváncsiak. A wMinFilter azt az értéket adja meg, amelynél csak nagyobb értékű üzenetekre vagyunk kíváncsiak. Hasonló célt szolgál a wMaxFilter paraméter, de maximumra. Az utóbbi paraméter hasznos lehet az egér és billentyűzet események esetén, hiszen ha valaki folyamatosan nyom egy billentyűt, előfordulhat, hogy ennyi idő alatt nem kerülnek feldolgozásra ezek az üzenetek, ilyenkor ha ennek a paraméternek (WM_KEYFIRST, WM_MOUSEFIRST, WM_KEYLAST, WM_MOUSELAST) értéket adunk, akkor csak az első vagy az utolsó eseményt veszi figyelembe.

Ha a függvény WM_QUIT (kilépési) üzenetet talál a sorban, akkor FALSE-szal tér vissza különben TRUE értékkel.

A PeekMessage hasonló funkciót lát el mint a GetMessage azzal a különbséggel, hogy nem vár az üzenetre a visszatérés előtt. Ennek a függvénynek újabb UINT típusú paramétere is van. Ez a paraméter az üzenetek kezelésére szogálhat (maradjon az üzenet a sorban a feldolgozás után vagy sem , ne adja vissza a vezérlést a Windowsnak). A függvény visszatérési értéke attól függ, hogy talált-e üzenetet vagy sem.

6.1.2. Az üzenet konvertálása

Az applikációhoz érkező üzenetek átalakíthatók. Erre általában billentyűzet események esetében van szükség. Erre a célra a TranslateMessage függvényt lehet használni. A függvény a WM_KEYDOWN és WM_KEYUP közé beszúr egy WM_CHAR üzenetet. A WM_CHAR üzenetre akkor van szükségünk, ha a lenyomott billentyűhöz tartozó karakterre vagyunk kívancsiak.

BOOL TranslateMessage(const MSG FAR *lpMsg)

6.1.3. Az üzenet továbbítása az ablak kezelő függvénynek

Miután kiolvastuk az üzenetet a sorból, ezt az üzenetet el kell juttatni az ablakkezelő függvénynek. Mivel az ablakkezelő fügvény CALLBACK függvény, ezért a Windowsnak kell továbbítani az üzenetet és a Windows hívja meg ezt a függvényt a megfelelő paraméterekkel. Az üzenet továbbítására a DispatchMessage szolgál.

LONG DispatchMessage(const MSG FAR* lpMsg)

Amennyiben az üzenet WM_TIMER és a timer létrehozásakor egy timerkezelő függvényt adtunk, akkor az üzenet hatására, ez a függvény hívódik meg és ez az üzenet nem továbbítódik az ablakkezelő függvénynek.

6.1.4. Üzenet küldés

Üzeneteket két féleképpen küldhetünk egy ablaknak. Vagy a várakozási soron keresztül vagy ennek elkerülésével. Az üzenetek két csoportba sorolhatók: az első a "queued" , amelyek a várakozási sorba kerülnek, a másik a "nonqueued", amelyek elkerülik a várakozási sort.

Queued üzenetet a PostMessage függvénnyel küldhetünk, nonqueued-ot a SendMessage függvény segítségével.

PostMessage(HWND, UINT, WPARAM, LPARAM)

SendMessage(HWND, UINT, WPARAM, LPARAM)

Az üzenetek nem hasonlítanak a megszakításokhoz. Az egyik üzenet feldolgozását egy másik üzenet nem szakíthatja meg. Ennek elkerülésére használhatjuk a SendMessage-et úgy, hogy az üzenet feldolgozása közben egy másik üzenetet küldünk.

7. Windows program készítése

Általában egy Windows program a következő fájlokat tartalmazza: egy definiciós(.def) fájl, egy erőforrás fájl (.rc) és legalább egy forrás fájl (C vagy CPP).

A programozási nyelvek új változatai szinte kivétel nélkül rendelkeznek saját fejlesztési környezettel. Pl. a Borland C++ esetén az IDE környezet, ami rendelkezik, editorral, Debugerrel, stb.. és resource editorként a WorkShop használható. A Visual C++ esetén szintén hasonló a helyzet más elnevezésekkel.

7.1. Erőforrás fájl

Az erőforrás fájl (.rc) az erőforrás editorral beállított adatokat tartalmazza. Tulajdonképpen ez egy text fájl, amely bármilyen text editorral is szerkeszthető csak vigyázni kell a szintaktikajára. Általában ikonokat, kurzorokat, bittérképeket, sztring táblákat, menüket, dialógus ablakokat tartalmaz. Ezeknek az erőforrásoknak a kezeléséről a program maga gondoskodik. Minden erőforrás elemhez tartozik egy azonosító, amire hivatkozunk a programban.

7.2. Definiciós fájl

A definiciós fájl beállításokat tartalmaz a létrehozandó programról. Ebben a fájlban olyan adatok szerepelnek, amelyek alapján dönt a Windows, hogy pl. ennek a programnak a kód, illetve adat szegmense mozgatható-e a memórian belül vagy sem, illetve szükség esetén kitehető-e ideiglenesen a memóriából vagy sem. További beállításokat tartalmaz a stack és heap méretéről. A program CALLBACK függvényeinek export típusra való beállítására is szolgál, amennyiben az említett függvények nevei elött nem szerepelt az _export jelző.

Példa 1

Írjunk egy Windows programot, amely kiírja a képernyőn a "Hello Windows" szöveget. A szöveg az ablak közepén jelenjen meg.

/*----- ----- --------------- Példa1.c ----- ----- ----------------*/

#include <windows.h>

long FAR PASCAL _export WndProc (HWND, UINT, UINT, LONG) ;

int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,LPSTR lpszCmdParam, int nCmdShow)

hwnd = CreateWindow (szAppName, // Ablak osztály neve

"The Hello Program", // Ablak címe

WS_OVERLAPPEDWINDOW | WS_SYSMENU |WS_MINIMIZEBOX,// stílusa

CW_USEDEFAULT, // x pozició

CW_USEDEFAULT, // y pozició

CW_USEDEFAULT, // x méret

CW_USEDEFAULT, // y méret

NULL, // Szülő ablak leirója

NULL, // Menü leírója

hInstance, // Példány leírója

NULL) ; // Létrehozási paraméterek

ShowWindow (hwnd, nCmdShow) ; // Megjelenítés

UpdateWindow (hwnd) ; // Ablak újra rajzolása

while (GetMessage (&msg, NULL, 0, 0))

return msg.wParam ;

long FAR PASCAL _export WndProc (HWND hwnd, UINT message, UINT wParam,LONG lParam)

return DefWindowProc (hwnd, message, wParam, lParam) ;

;----- ----- -------Példa.DEF definició file----- ----- --------------

NAME HELLOWIN ;// Az elkészítendő EXE file neve

DESCRIPTION 'Hello ' ;// Ez az EXE file -ba kerül, általában a program neve

EXETYPE WINDOWS ;// Windows program

STUB 'WINSTUB.EXE' ; // Ha nem windows alól hívjuk, akkor hiba üzenet

CODE PRELOAD MOVEABLE DISCARDABLE

;// PRELOAD: a program aktivizálásakor a kód azonnal bekerül a memóriába

MOVEABLE: feljogosítja a windows-t arra, hogy ha szükséges, akkor ;megváltoztathatja a programkód

;// memóriabeli helyét

;// DISCARDABLE: feljogosítja a windows-t arra, hogy kitörölje a programot a memóriából, ;ha helyre van szüksége.Ilyenkor, ha újra szükség van a program kódjára, akkor az exe. file-;ból újra betöltődik

DATA PRELOAD MOVEABLE MULTIPLE

;// MULTIPLE: a program példányai saját adatterülettel dolgoznak.

HEAPSIZE 1024

STACKSIZE 8192

EXPORTS WndProc


Document Info


Accesari: 1096
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. 2024 )