Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249620 (11056)
  Suchen
 Zurück zur Übersicht
 AutorThema: MDI mit Profan²
Sebastian König
Datum:19.06.01 18:40 Antwortenals Email verschicken (webmaster@sekoenig.de) 


Hallo,

ich habe ein wenig herumexperimentiert und es geschafft, einen Beispiel-Quellcode für eine MDI- (Multiple Document Interface) Anwendung mit Profan² zu erstellen.
Den Quellcode (ZIP-Archiv, ca. 7 kb) findet ihr unter http://users.yoobay.de/sekoenig/download/mdi.zip.

Ein paar erklärende Worte zum Quellcode:
Ohne Callback-Funktionen lässt sich MDI nicht realisieren. Da Callback funktionen nicht direkt in Profan² geschrieben werden können, bin ich folgendermaßen vorgegangen: Ich schreibe die Funktionen als Maschinencode in Bereichsvariablen und übergebe dort, wo als Parameter die Adresse einer Callback-Funktion erwartet wird, einfach die entsprechende Bereichsvariable.
Die den Maschinencodes entsprechenden Assembler-Befehle stehen in den Kommentaren.

Für eventuelle Fragen zum Quellcode stehe ich natürlich gerne zur Verfügung.

Viel Spaß damit!

MfG

Sebastian


Roland G. Hülsmann
Datum:19.06.01 21:00 Antwortenals Email verschicken (rgh-soft@t-online.de) 


WOW!! - Genial!
Die Idee mit den Callbackfunktionen als Maschinencode in Bereichsvariablen ist einfach toll!



Rainer Hoefs
Datum:19.06.01 22:56 Antwortenals Email verschicken (rhoefs@rhcarpetdesign.de) 


Sebastian,

das ist einfach Super!!

Darauf habe ich schon lange gewartet.
Kannst Du der Profangemainde noch einen Tip geben, wie man in die Fenster eine Bitmap bekommt und diese dann auch Scrollen kann?

Ist es möglich das Clientfenster im Stil so zu initialisieren, daß man es mit den Minimize und Maximize Funktionen in der Größe verändern kann?

Vielen Dank im Voruas!

Rainer

P.S.

Was machen die HooverBitmaps?


Sebastian König
Datum:20.06.01 14:57 Antwortenals Email verschicken (webmaster@sekoenig.de) 


Hallo,

> das ist einfach Super!!
>
> Darauf habe ich schon lange gewartet.

Danke! :)

> Kannst Du der Profangemainde noch einen Tip geben, wie man
> in die Fenster eine Bitmap bekommt und diese dann auch
> Scrollen kann?

Du kannst auf die MDI Child-Fenster genau wie bei "normalen" Dialogfenstern mit startpaint / endpaint malen.
Für das Scrollen musst Du einfach nur Scrollbars erzeugen (am besten mit @Control() oder CreateWindowEx(), damit Du eine ID vergeben und immer die aktive Scrollbar ermitteln kannst).

> Ist es möglich das Clientfenster im Stil so zu initialisieren, daß
> man es mit den Minimize und Maximize Funktionen in der Größe
> verändern kann?

Welches Fenster genau meinst Du? Man muss zwischen dem MDI Frame-Fenster (Profan²-Hauptfenster) und dem MDI Client-Fenster (das direkte Elternfenster der Child-Fenster) unterscheiden. Da das Client-Fenster gar keine Buttons zum Minimieren / Maximieren besitzt, denke ich, dass Du das Frame-Fenster meinst.
Ich habe den Stil so gewählt, dass man das Fenster nicht in der Größe verändern kann, damit ich im Quellcode keine Änderung der Größe des Frame-Fensters berücksichten musste. Ich hielt das für überflüssig und dachte, es würde ausreichen %key abzufragen und die Größe des MDI-Clients mit SetWindowPos zu ändern. Beim Testen habe ich jedoch gerade festgestellt, dass es nicht so einfach ist - die Größe der Child-Fenster wird nicht automatisch aktualisiert... Deshalb ist eine Änderung an der Fenster-Prozedur des Hauptfensters (FrameProc#) nötig: Die Nachricht WM_SIZE muss an DefFrameProc() weitergeleitet werden. Die Änderung ist leider ziemlich aufwendig, da der Maschinencode nicht sehr bequem zu warten ist... ;) Ich denke aber, ich müsste es bis heute Abend geschafft haben (verspechen kann ich's nicht) - sobald ich den aktualisierten Quellcode hochgeladen habe, poste ich hier eine Mitteilung.

> Was machen die HooverBitmaps?

Ich bin leider noch nicht dazu gekommen - sorry! In den nächsten Tagen werde ich aber definitv anfangen, an der DLL weiterzuarbeiten. Ab nächste Woche Mittwoch habe ich endlich Ferien und somit viel Zeit...

MfG

Sebastian

P.S.: Vielen Dank für das Lob auch an die anderen!


Rainer Hoefs
Datum:20.06.01 15:42 Antwortenals Email verschicken (rhoefs@rhcarpetdesign.de) 


Hallo Sebastian,

bitte fühle Dich nicht durch die Nachfrage zu den BitmapHoover-Buttons unter Druck gesetzt.

Das mit der Größe wäre schon eine tolle Sache, damit man das Programm auch Bildschirmfüllend oder eben in jedem anderen Maß (je nach Wunsch des Users) ausführen kann.

Wenn ich es richtig verstehe ist ein MDI-Fenster also mit einem Dialog gleichzusetzen!?

So müßten die Sourcen meiner alten Dialoge wohl einfach auf so ein Fenster zu mappen sein, wenn man das Handle des entsprechenden MDI-Fensters kennt!?

Wie finde ich denn das Handle der einzelnen MDI-Fenster?

Vielen Dank

Rainer




Sebastian König
Datum:20.06.01 17:44 Antwortenals Email verschicken (webmaster@sekoenig.de) 


Hallo,

> bitte fühle Dich nicht durch die Nachfrage zu den
> BitmapHoover-Buttons unter Druck gesetzt.

Keine Sorge - tue ich nicht. Ich wollte nur eigentlich schon früher an der DLL weiterarbeiten, habe mich aber dann erst mit Beispiel-Quellcodes (DirectX, MDI) beschäftigt...

> Wenn ich es richtig verstehe ist ein MDI-Fenster also mit einem
> Dialog gleichzusetzen!?
>
> So müßten die Sourcen meiner alten Dialoge wohl einfach auf so
> ein Fenster zu mappen sein, wenn man das Handle des
> entsprechenden MDI-Fensters kennt!?

Im Prinzip schon - es handelt sich ja um ganz "normale" Profan²-Dialogfenster mit einer leicht veränderten Fenster-Prozedur.

> Wie finde ich denn das Handle der einzelnen MDI-Fenster?

Das Handle des aktiven Fensters steht bei jedem Schleifendurchlauf in der Variablen activeChild&. Um die Handles aller MDI Child-Fenster zu ermitteln, musst Du die Funktion EnumChildWindows() zusammen mit der Callback-Funktion EnumChildProc# verwenden. Beispiele findest Du in den Prozeduren ReleaseAllChildWindows und UpdateAllEdits. Weiter Infos zu EnumChildProc# siehe EnumChildProc.inc oder API-Hilfe.

MfG

Sebastian


Sebastian König
Datum:20.06.01 18:11 Antwortenals Email verschicken (webmaster@sekoenig.de) 


Hallo,

so, fertig! Ich habe die Fenster-Prozedur erweitert. Das Frame-Fenster kann nun beliebig in der Größe verändert werden - MDI-Client und Child-Fenster passen sich automatisch an.

Den geänderten Quellcode habe ich gerade hochgeladen.

MfG

Sebastian


Sven Schmidts
Datum:20.06.01 12:33 Antwortenals Email verschicken (schmidts@flat2serv.de) 


Wow .... fantastisch ! Mir fehlen die Worte.


Rolf Koch
Datum:20.06.01 18:44 Antwortenals Email verschicken (webmaster@rokosoft.de) 


Ich bin nicht nur Sprachlos, es ist ja Gespenstisch genial - sag ma Sebastian, woher nimmst Du die ganzen Ideen und die Kraft her?
Ich ziehe den Hut vor Dir!!!
Rolf


Sebastian König
Datum: 21.06.01 17:38 Antwortenals Email verschicken (webmaster@sekoenig.de) 


Hallo,

vielen Dank für das Lob auch an Dich!

Zu Deiner Frage: Ich habe einfach Spaß am Experimentieren...
Die Idee mit dem Maschinencode in Bereichsvariablen kam mir während ich im Internet etwas zum Thema Assembler suchte. Bei der Suche nach einer geeigneten Anwendung kam ich dann auf MDI mit Profan², weil ich mich erinnern konnte, dass danach schon öfters gefragt wurde und das es an den Callback-Funktionen scheiterte...

MfG

Sebastian


 Zurück zur Übersicht