C# automatikus méretezés + layout managerek

 ( Csab | 2008. október 25., szombat - 0:28 )

Éppen ismerkedem a C#-pal (Linux, mono) és problémáim vannak az ablakok megjelenítésével. Az összes könyvben és az interneten is csak ilyen példákat látok:

private Label label = new Label();
...
label.Size = new System.Drawing.Size( 100, 20 );
label.Location = new System.Drawing.Point( 16, 40 );
label.Text = "Hello";

Ezektől a programoktól engem a hideg ráz ki, elvi okok miatt még begépelni sem merem.
Honnan tudja a program írója, hogy nem 3000x2000-es felbontású monitorom van, 25-ös betűmérettel? És mi van, ha átméretezem az ablakot?

Tudna valaki segíteni, hogyan lehet mindezt C# alatt kultúráltan megoldani (azaz egy darab számot nem akarok látni)? QT-ben számok nélkül megy minden a LayoutManager-ekkel, meg SizePolicy-kkal (hogyan reagáljon az átméretezésre: változatlan, növekszik/csökken). Az ablak méretét is automatikusan kiszámolja a rendszer.

Sajnos nekem az a tapasztalatom, hogy ahányszor eddig valamit fixre állítottam be, mindig volt, akinek a gépén nem jelent meg rendesen...

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Nagyon jó a kérdés. Sajnos a helyes választ nem tudom.

Ha nem direkt a windowsos könyvtárakat akarod tanulni, hanem .NET-et általában akkor használj GTK#-ot. Abban (majdnem) mindent használhatsz, amit GTK-ban.

ahogy az egyik gyakvezem mondta, elég gusztustalan dolog, de ilyen lehetőség nincs

Hat, Windows.Forms eseteben csak korlatozott lehetoseg van a problema megoldasara. Itt is van minimalis LayoutManager, Anchor, Dock, stb.; de nem az igazi.

Ha jol tudom az Mono Olive mar egesz sokat implemental a WPF-bol, amivel -tobbek kozt- ezt a problemat is kikuszoboltek.

Ez nem nyelvfüggő probléma. A System.Windows.Forms-ban (sőt, általában a Windows saját eszközkészletével) automatikusan méreteződő (de ronda szó) elemekkel dolgozni igazi kínszenvedés. Ha már Linux és Mono, akkor tényleg jobban jársz a Gtk#-pal, ráadásul menni fog Windows alatt is, Mono nélkül is, csak a Gtk# runtime-ot kell feltenni.

Köszi a válaszokat. A GTK#-pot átnézem.

Eddig nem volt tiszta, hogy a System.Windows.Forms mellé miért kellett a GTK# is implementálni, de azt hiszem kezdem megérteni.

Feltételeztem, hogy 2008-ban már minden rendszeren LayoutManager-eket használnak.

:-)

Nem mellé. A korai változatokban nem igazán volt SWF implementáció. Az eredeti cél egy az ECMA szerinti osztálykészlet implementálása volt a C#->CIL fordítóval és a CLR-rel (sem a System.Windows, sem a System.Enterprise nem "szabványos"). Persze, jó, ha van egy grafikus felület, erre pedig mind jogi (LGPL), mind programozástechnikai (csak egy wrappert kellett írni, gondolom a Gtkmm alapján készült) szempontból a Gtk volt a legalkalmasabb. (De pl. van Qt# is, csak az nem része a disztribúciónak.)
E mellé jött a SWF implementáció, ami nulláról készült el, az egész menedzselt kód, egyetlen sora sem hivatkozik a Windows könyvtáraira (bár asszem már Win alatt képes a natív widgetek kezelésére). Erre természetesen azért volt szükség, hogy lehetőleg fennakadások nélkül legyen képes futni egy Windowsra írt .NET kód Mono alatt, ami persze azért problémás, mert általában a kutya nem figyel oda amikor VS-ban kódol, hogy pl. a directory-neveket ne "\"-rel válassza el, hanem fűzze össze az erre szolgáló függvénnyel. Bár ez az egész elég sziszifuszi meló, mert ugyebár most már a WPF lesz az alap a windowsos felületek programozásánál (ami végre layout manageren alapul).