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
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 1. 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. 2. 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
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
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
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