270 likes | 366 Views
A WEL library. Az eiffel programozási nyelv Windows API burkoló osztálykönyvtára. Mi is a WEL?. Eiffel supercluster, amely a Windows API programozásához szükséges eszközöket tartalmazza. Csak azt, de azt teljes körűen.
E N D
A WEL library Az eiffel programozási nyelv Windows API burkoló osztálykönyvtára
Mi is a WEL? • Eiffel supercluster, amely a Windows API programozásához szükséges eszközöket tartalmazza. • Csak azt, de azt teljes körűen. • Nem több mint egy burkoló osztálykönyvtár, de minden API szolgáltatás eléréséhez eszközöket ad.
WEL supercluster szerkezete • 10 darab cluster • windows • Az ablaktípusokat megvalósító osztályok. • gdi és gdistock • A rajzolást elősegítő osztályok. • controls • A windows szabványos controljaihoz tartozó osztályok. • stddlgs • A windows beépített dialógusablakaihoz tartozó osztályok. • consts, messagess, shared, structs és support • egyéb winAPI szolgáltatást burkoló osztályok, segédosztályok, adatszerkezetek és konstansok.
WEL_APPLICATION • Ebből az osztályból származtatva készíthetünk WEL alkalmazást. • Ez egy absztrakt osztály. • A származtatás során az új osztály törzsében meg kell valósítanunk a main_window: WEL_COMPOSITE_WINDOW –t, amely az alkalmazásunk főablaka lesz. • Ezt a két lépést (a származtatást és a megvalósítást) az eiffel fejlesztői környezete automatikusan elvégzi helyettünk, ha WEL grafikus projectet kérünk.
A legegyszerűbb WEL alkalmazás(minimal_demo.e) class MINIMAL_DEMO inherit WEL_APPLICATION rename make as base_make end create make feature make is do create main_window.make_top ("WEL minimal application") base_make end end
A legegyszerűbb WEL alkalmazás(minimal_demo.ace) system "minimal_demo" root MINIMAL_DEMO: make Default --… cluster root_cluster: "$ISE_EIFFEL\examples\wel\minimal" all base: "$ISE_EIFFEL\library\base" exclude "table_eiffel3"; "desc"; end all wel: "$ISE_EIFFEL\library\wel" exclude "spec"; "clib"; end external include_path: "$(ISE_EIFFEL)\library\wel\spec\windows\include" object: "$(ISE_EIFFEL)\library\wel\spec\$(ISE_C_COMPILER)\lib\wel.lib" end
Még egyszerűbben class MINIMAL_DEMO inherit WEL_APPLICATION create make feature main_window: WEL_FRAME_WINDOW is once create Result.make_top ("WEL Minimal application") end end -- class
windows cluster • Az ablaktípusokat tartalmazza. • Definiálja a WEL_WINDOW osztályt, ami minden megjeleníthető ablak ősosztálya.
Fontosabb ablaktípusok • WEL_FRAME_WINDOW • A legáltalánosabban használt ablaktípus, általában ez alkotja egy alkalmazás főablakát. • A megszokott controlokon kívül tartalmazhat menüt és státuszbárt is. • WEL_MAIN_DIALOG • Dialógus alapú alkalmazások főablakának típusa • WEL_MODAL_DIALOG • Modális dialógusablak; főablakból megnyíló ablakok létrehozására. • Létezik modeless változata amely nem modális dialógusablakot hoz létre. • WEL_CONTROL_WINDOW • Saját controlok létrehozására alkalmas.
Két út a designhoz • Resources file • Ablakok megtervezhetőek (Microsoft Developer Studio vagy Borland Resource Workshop) vizuális tervezőeszközökkel. • A tervezőeszközök által generált .rc file-okból a ResourceBench és a h2e programok segítségével generálható az eiffel kód. • Eiffel kód • Az ablak design-ját kialakító kódot teljes mértékben kézzel írva alakítjuk ki a megjelenést.
Rajzolás a képernyőre • A szükséges osztályokat a gdi és a gdistock cluster tartalmazza. • Rajzolni lehet, bármely WEL_WINDOW vagy WEL_CONTROL leszármazottjára. • A rajzolás egy WEL_DC (vagy leszármazott) típusú objektumon keresztül lehetséges.
Rajzolás példa feature drawline (x1: INTEGER, y1: INTEGER, x2: INTEGER, y2: INTEGER) is local dc: WEL_CLIENT_DC do create dc.make (Current) dc.get dc.line (x1,y1,x2,y2) dc.relase end
Problémák • Az előző példánál, átméretezéskor vagy ha a rajz elé kerül valami és eltakarja, majd pedig újra felűre kerül, akkor a kirajzolt vonal eltűnik. • Ennek oka, hogy az ablak automatikusan újrarajzolja magát ha szükséges. • Hogyan készíthetünk maradandó rajzot?
ON_PAINT • A hozzátartozó törzs az ablak, vagy control újrarajzolásakor automatikusan fut le. • „maradandó” rajzot hozhatunk létre a felüldefiniálásával. • Saját control létrehozásának egyik fontos momentuma. A megjelenést határozhatjuk itt meg.
Rajzolás példa 2. inherit WEL_FRAME_WINDOW redefine on_paint --… end -- … feature on_paint (paint_dc: WEL_PAINT_DC; invalid_rect: WEL_RECT) is local rect : WEL_RECT; brush : WEL_BRUSH; color : WEL_COLOR_REF; do create rect.make (10,10,50,50); create color.make_by_color (255); create brush.make_solid (color); paint_dc.fill_rect (rect,brush); end
Színek, tollak, ecsetek • WEL_COLOR_REF • Színeket reprezentál. Létrehozhatjuk RGB összetevőkből, vagy használhatunk egy a Windowsban definiált színt a létrehozására. • Az előre definiált színeket a WEL_COLOR_CONSTANTS, illetve a WEL_STANDARD_COLORS osztályok tartalmazzák. • WEL_PEN • Toll, a vonalak rajzolásához szükséges. Beállítható a színe, a vastagsága, és a stílusa (pontozott, stb.…) • A használható vonalstílusokat a WEL_PS_CONSTANTS, míg néhány előre definiált tollat a WEL_STANDARD_PENS osztály tartamaz. • WEL_BRUSH • Ecset, amelynek beállíthatjuk a színét, mintázatát. • Az ecsetet felhasználva rajzolhatunk kitöltött objektumokat. • Előre definiált mintákat a WEL_HS_CONSTANTS osztályban találunk. • A minta lehet akár tetszőleges WEL_BITMAP is.
Alakzatok • Rajzolhatunk üres alakzatokat, • line, rectangle, round_rect, ellipse, pie, polygon, poly_bezier, draw_text … • Szöveg kirajzolása előtt a „dc” objektumunknak megadhatunk egy WEL_FONT típusú objektumot, ami a betűtípust határozza meg. • és kitöltötteket. • fill_rect, fill_region • A fill_region egy WEL_REGION-t vár paraméterül, ami lehet négyszög, polygon, vagy ellipszis.
Bitmap-ek kezelése • WEL_BITMAP osztály szolgál a kezelésükre. • Létrehozhatunk egy ilyen típusú változót • Resources file beli név alapján • Resources file beli ID alapján • Egy üres bitmap-et WEL_DC segítségével • File-ból beolvasni egy kicsit komplikáltabb, kell hozzá: • RAW_FILE • WEL_DIB
Bitmap beolvasása file-ból (példa) Inherit --… WEL_DIB_COLORS_CONSTANTS export {NONE} all end --… feature on_paint (paint_dc: WEL_PAINT_DC; invalid_rect: WEL_RECT) is local file : RAW_FILE dib: WEL_DIB bitmap : WEL_BITMAP do create file.make_open_read ("eximage.bmp") create dib.make_by_file (file) create bitmap.make_by_dib (paint_dc, dib, Dib_rgb_colors) paint_dc.draw_bitmap (bitmap, 0, 0,bitmap.width, bitmap.height) end
Nyomtató kezelése • Egy WEL_PRINTER_DC –n keresztül nyomtathatunk. • Ilyet WEL_PRINT_DIALOG segítségével szerezhetünk. • A megszokott rajzoló műveletek értelmezettek erre a „dc” –re is.
Nyomtatás példa local print_dialog: WEL_PRINT_DIALOG printer_dc: WEL_PRINTER_DC do create print_dialog.make print_dialog.activate (Current) if print_dialog.selected then printer_dc := print_dialog.dc printer_dc.start_document ("WEL Print Test") printer_dc.start_page printer_dc.line (0,0,printer_dc.width,printer_dc.height) printer_dc.end_page printer_dc.end_document end end
Vágólap kezelése • A WEL_CLIPBOARD osztályból származtatva tudjuk kezelni a vágólapot. inherit WEL_CLIPBOARD export {NONE} all end --… GetClipboardText :STRING is do open_clipboard (current) retrieve_clipboard_text Result.make_from_string (last_string) end SetClipboardText(a_text:STRING) is do open_clipboard (current) set_clipboard_text (a_text) end
Egérkurzor megváltoztatása inherit WEL_IDC_CONSTANTS export {NONE} all end feature cursor : WEL_CURSOR feature on_left_button_down (keys: INTEGER; x_pos: INTEGER; y_pos: INTEGER) is do create cursor.make_by_predefined_id (Idc_wait) end on_set_cursor (hit_code: INTEGER) is do if cursor /= void then cursor.set disable_default_processing end end
WEL_MSG_BOX • A Windows API szabványos felugró ablakainak burkolóosztálya • A message_box_result attribútum tartalmazza, hogy melyik gombbal zártuk be az ablakot. • WEL_ID_CONSTANTS osztályban vannak definiálva a gombokhoz tartozó ID-k. • A set_language parancsal beállíthatjuk az ablakon megjelenített rögzített controlok szövegének a nyelvét. A nyelvkonstansokat a WEL_LANGUAGE_CONSTANTS tartalmazza. • A set_flag függvény a style paraméter és a WEL_MB_CONSTANTS osztály segítségével meghatározhatjuk, hogy mi kerüljön az ablakra. • Vannak előre definiált minták.
WEL_MSG_BOX • 6 különböző előredefiniált minta: • basic_message_box • normál megjelenés, OK gombbal. • beállítható a stílusa, a stílusokat a WEL_MB_CONSTANTS tartalmazza. • error_message_box • hibaüzenetet jeleníthetünk meg vele, piros ikonnal, és egy OK gombbal • information_message_box • információs üzenetet jelenít meg „buborékos i betű” ikonnal és OK gombbal • question_message_box • Eldöntendő kérdés megjelenítésére szolgál. • Egy Yes és egy No gombbal. (angol nyelv esetén) • user_icon_message_box • saját ikont helyezhetünk az ablakra • warning_message_box • sárga felkiáltójeles ikont és egy OK gombot tartalmaz.
WEL_MSG_BOX (példa) feature on_left_button_down (keys: INTEGER; x_pos: INTEGER; y_pos: INTEGER) is local msg_box : WEL_MSG_BOX do create msg_box.make msg_box.question_message_box(current,"text", "title") if msg_box.message_box_result = IdYes then minimize end end
Registry kezelése inherit WEL_REGISTRY export {NONE} all end --… local key: WEL_REGISTRY_KEY p: POINTER value: WEL_REGISTRY_KEY_VALUE do key := enumerate_key(hkey_current_config,0) set_text(key.name) p:=create_key (hkey_current_config, "my key",0) p:=open_key (hkey_current_config,"my key",2) create value.make (1, "alma") set_key_value (p,"my value",value) end