[win32/C++] Opdelen van GUI code in componenten

Pagina: 1
Acties:

  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Dit is niet zo zeer een probleem maar gewoon iets waar ik even een discussie over wilde starten. Het laatste half jaar ben ik veel bezig geweest met ontwikkelen in Java en ben ik vrij goed bekend geraakt met AWT/Swing. Het gemak waarmee je in Java een eigen ge-encapsuleerde control maakt is erg handig vind ik (extend een class van JPanel, gooi wat controls erop en je hebt je eigen component wat je zonder enige moeite in een ander JPanel kwijt kan). Je draait hiermee zonder al te veel moeite toch een best netjes opgedeelde (kwa code) GUI in elkaar.

Nu ben ik ook al enkele jaren bezig geweest met C++ onder windows, en dan voornamelijk win32 API en WTL (niet zo'n fan van MFC). En ik moet zeggen dat ik dit hier gewoon heel erg mis. Veel van mijn (meestal relatief kleine applicaties) groeien toch al gauw uit tot Dialogs met grote messagemaps waar dan tientallen "OnSomething" methodes zijn die allerlei windows messages en notifications afhandelen voor de controls op het window. Om nog maar niet te spreken over de moeite die het kost om een resizable dialog te maken waarbij de controls dynamisch verplaatst en geresized worden. Waar het op neer komt is dat de hele dialog class verantwoordelijk is voor allerlei details van individuele controls ipv dat deze controls of subpanels dat zelf afhandelen. De code wordt er dan ook niet echt overzichtelijker op.

Nu ben ik benieuwd hoe jullie hier mee omgaan. Ik weet dat je in principe het hele JPanel verhaal kan nabootsen (een WS_CHILD window creeeren en daarbinnen dan weer je controls aanmaken en op deze manier een soort "panel" creeren) maar dit is toch veel meer werk dan het Java equivalent en ik heb ook niet echt kunnen vinden of deze methode te combineren is met dialog templates (zodat je niet alle controls in de code hoeft aan te maken maar ze gewoon kan subclassen).

Kort samengevat, ik ben dus benieuwd hoe anderen de GUI code op een beetje modulaire manier opdelen. Heeft iemand tips of interessante ideeen hierover?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Ik heb niet echt een antwoord op je vraag, aangezien ik zelf nooit echt iets grafisch heb gemaakt in C++ behalve in Borland C++ Builder. Als je even snel en duidelijk een GUI in mekaar wil zetten, dan is BCB behoorlijk handig met zijn VCL. Je creëert gewoon een object, zet een paar waarden zodat het ding weet wat het moet doen, en je bent klaar.

Om toch een beetje antwoord op je eigenlijke vraag te geven: wanneer ik een applicatie zou moeten maken die direct op de Windows API hangt, dan zou ik voor de controls die ik nodig heb proberen zelf een paar classes te maken die me werk uit handen nemen door wat standaard waardes te setten en dergelijke.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 16-05 07:22
Ook ik ben gewoon met BCB te werken, en zoals NME zegt is het zeer eenvoudig om
in VCL een nette GUI op te bouwen. Het is echter ook een fluitje van een cent om
eigen controls aan te maken, of een Frame te maken met verschillende controls
(zoals je extened JPanel) op, die je dan kan hergebruiken.

Er bestaan echter nog andere c++ libraries (we negeren eventjes het feit dat VCL eigenlijk
geen C++ is), om Gui's op te bouwen. bvb www.fox-toolkit.org en www.wxwidgets.com.
Beide libraries zijn opensource en platform onafhankelijk! Het zou redelijk eenvoudig zijn
om nieuwe controls aan te maken maar daar heb ik geen ervaring mee. Zeker eens de
moeite om te bekijken dus.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
Met die toolkits kun je inderdaad gemakkelijk zelf een control maken. Kwestie van een nieuwe class maken die extend van een of andere "view" of "window" class en dan de OnPaint-methode extenden is meestal het enige wat je moet doen (Bij FOX heb je nog te maken met ingewikkelde message-maps enzo). Een andere goede lib die ik wel eens gebruik is Lgi (www.memecode.com). Die is echt retesnel en werkt erg fijn :)

Verwijderd

Je kan ook de cross platform Qt Toolkit gebruiken, http://www.trolltech.com

Ze hanteren daar het signals en slots principe. (i.p.v. de OnSomething methods)

Is voor commerciele producten die ermee ontwikkeld worden niet gratis. Er is echter een versie beschikbaar voor linux en windows die je zo kan downloaden. Voor de niet commerciele producten dan wel te verstaan.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op vrijdag 21 januari 2005 @ 09:06:
Je kan ook de cross platform Qt Toolkit gebruiken, http://www.trolltech.com
Qt schijnt erg goed te zijn; ik heb er alleen maar goeie verhalen over gehoord. Toch wil ik ook even een alternatief noemen: The GIMP Toolkit. Een klasgenoot heeft me er toevallig afgelopen week op gewezen hoe handig GTK+ werkt, en platformonafhankelijkheid is natuurlijk altijd mooi meegenomen. :P De Windows-versie staat hier.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Infern0
  • Registratie: September 2000
  • Laatst online: 16-03 23:51

Infern0

Hou die ontzettende rust!!

Ik vind wxwidgets erg goed werken. De keuze is gevallen op wxwidgets omdat deze wel voor commerciele doeleinden te gebruiken is en ook platform onafhankelijk. Ik heb ook met GTK gewerkt, maar deze vind ik toch beduidend minder dan Wxwidgets of QT. Plus daarbij dat GTK onder windows nog niet super werkt.

Mooi vergelijking op freshmeat (is dan niet helemaal op W32 gericht, maar wel goed artikel):
http://freshmeat.net/articles/view/928/

http://www.bsdfreaks.nl Home site: http://rob.lensen.nu /me was RobL


  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Wat ik me altijd afvraag bij dat soort GUI toolkits is, presteren die nou ook een beetje goed kwa performance?

Een van de (vele) redenen waarom ik een hekel heb aan bijvoorbeeld een taal als Visual Basic is dat ondanks dat het opzich best geschikt is om snel kleine GUI-based tooltjes in elkaar te zetten, de programmas die je ermee produceert vaak gewoon nogal stroperig aandoen kwa snelheid. Het is moeilijk concreet uit te leggen maar je merkt toch altijd wel een beetje dat er veel bloat aanwezig is. Dat vind ik zelf het elegante van het programmeren in C++ met win32+WTL (of een vergelijkbaar framework/API). Je hebt toch het geval dat er zo min mogelijk ruis zit tussen jouw code en het OS. En ik heb ook het geval dat je dat als gebruiker wel merkt (maar misschien is dit voor een deel een beetje een soort placebo effect en denk ik gewoon dat C++ applicaties sneller zijn omdat ik weet dat ze in C++ geschreven zijn ipv in VB).

Nogmaals ik heb nog nooit met een van bovenstaande toolkits gewerkt dus ik heb echt geen idee in hoeverre dat wel of niet het geval is. Ik heb wel wat applicaties gebruikt die met GTK gebouwd zijn (Ethereal en GTKRadiant bijvoorbeeld) en ik moet zeggen dat ik niet zo heel erg onder de indruk was van de look & feel van de GUI die het produceert. Maar dit zijn allebei al oudere programmas dus misschien is dat inmiddels minder een probleem.

Ik ga in ieder geval alvast eens wat van deze links bestuderen.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 16-05 23:29
IrishMaiden schreef op vrijdag 21 januari 2005 @ 17:43:
Wat ik me altijd afvraag bij dat soort GUI toolkits is, presteren die nou ook een beetje goed kwa performance?
Met name de Lgi- en FOX-toolkit die ik hierboven noemde zijn *erg* snel. Bij Lgi wordt alle grafische meuk zelf getekend (het ziet er dus onder Linux hetzelfde uit als onder Windows) en dat is blijkbaar heel snel geimplementeerd. Het voelde op een Amd K6 400Mhz iig een *stuk* sneller aan dan menig ander Windows-programma. Maargoed, download eens wat Demo-applicaties en kijk zelf wat je ervan vindt (mailprogramma Scribe op www.memecode.com is gemaakt met Lgi, probeer dat maar eens) :)
Pagina: 1