Zum Inhalt springen

Form in den Hintergrund setzen


Technician

Empfohlene Beiträge

Hallo,

mein Projekt verwendet eine Form, die sich konstant im Hintergrund befinden soll (nicht nur als unterstes Fenster im Programm, sondern als allerunterstes Fenster, also permanent auf dem Desktop).

ZOrder hilft hier also nicht, es muss die user32 bemüht werden.



‘CODE DER FORM1


Private Declare Function SetWindowPos Lib "user32" _

(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _

ByVal X As Long, ByVal y As Long, ByVal cx As Long, _

ByVal cy As Long, ByVal wFlags As Long) As Long


 Sub AlwaysOnTop(F As Form, OnTop As Boolean)


'OnTop = True:  Fenster immer im Vordergrund

'OnTop = False: Fenster immer im Hintergrund

 Dim Switch As Integer


 If OnTop Then

 Switch = -1 'im Vordergrund

 Else

 Switch = 1 'im hintergrund '-2 'nicht im Vordergrund

End If


Call SetWindowPos(F.hwnd, Switch, 0, 0, 0, 0, &H53)


End Sub


Private Sub Command1_Click()

Form2.Show

End Sub


Private Sub Form_Load()

Call AlwaysOnTop(Form1, False)

End Sub


Private Sub Timer1_Timer()

Call AlwaysOnTop(Form1, False)

End Sub


Soweit, so gut.

Meine Form liegt also direkt auf dem Desktop.

Wird jetzt allerdings über Command1 die Form2 aufgerufen, die sich „ganz normal“ verhalten soll – so passiert, was ich nicht will: Form2 liegt plötzlich auch direkt auf dem Desktophintergrund...

Wie kann ich das vermeiden?????

Wenn ich die Sub AlwaysOnTop allerdings mit dem Parameter TRUE aufrufe (also, so dass die betreffende Form nicht auf den Desktop gelegt wird, sondern genau das Gegenteil passieren soll – die Form in den Vordergrund setzen wie z.B. eine Messa-gebox) so bleiben andere Forms – wie gewünscht – unbeeinflusst.

Wenn ich nicht irgendeine Möglichkeit finde, nur die Form1 in den Hintergund zu set-zen, dann kann ich mein Programm so gut wie vergessen... :(

Ich hab gestern schon den ganzen Abend auf meinen Compi eingeschimpft ;)

Ich erbitte gnädigst ein bisschen Hilfe ;)

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hihö...

ähm.. hast du mal probiert in das OnShowEreignis von Form2 dessen Position auszulesen und diese gegebnefalls korrigiert?? Wenn du in das genannte Ereignis die Eigenschaften für Form2 neu setzt, werden die von form1 vererbten überschrieben...

is so das erst, was ich probieren würde...

Gruß Taz...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von TAZttDevil

Hihö...

ähm.. hast du mal probiert in das OnShowEreignis von Form2 dessen Position auszulesen und diese gegebnefalls korrigiert?? Wenn du in das genannte Ereignis die Eigenschaften für Form2 neu setzt, werden die von form1 vererbten überschrieben...

is so das erst, was ich probieren würde...

Gruß Taz...

Hi Taz,

probier ich bei Gelegenheit dann natürlich aus...

hab nur jetzt gerade mächtig viel zu tun - Fragenkatalog mit 96 Fragen :eek: is nich lustig :(:)

Gruß,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von TAZttDevil

Hihö...

ähm.. hast du mal probiert in das OnShowEreignis von Form2 dessen Position auszulesen und diese gegebnefalls korrigiert?? Wenn du in das genannte Ereignis die Eigenschaften für Form2 neu setzt, werden die von form1 vererbten überschrieben...

is so das erst, was ich probieren würde...

Gruß Taz...

Hi Taz!

Sooo, hab jetzt gerad mal Zeit gehabt, mir das anzuschauen...

"vererbt" - wie meinst du das ??? :confused:

Meinst du vielleicht Delphi oder eine andere Programmiersprache???

Ich schreib das Proggie unter VB6.0 - sorry, hab ich wohl oben vergessen hinzuschreiben...

Auch wenn ich der Form2 beim Laden zuweise, sie soll sich ganz im Vordergrund befinden - mittels "Call AlwaysOnTop(Form1, False)" - wird sie mit in den Hintergrund "mitgezogen".

Hoffe, du kannst mir da irgendwie weiterhelfen.

Gruß,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

hilft dir eine mdi-anwendung weiter?

ein mdi-fenster wäre eines, welches seine abhaengigen fenster 'kontrolliert' und selber immer im hintergrund liegt.

hab vor einiger zeit mal was damit programmiert (ebenfalls vb) und könnte, wenn es das ist was du suchst, mich da noch mal etwas schlauer machen...

viel spass noch :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Peregrin

hilft dir eine mdi-anwendung weiter?

ein mdi-fenster wäre eines, welches seine abhaengigen fenster 'kontrolliert' und selber immer im hintergrund liegt.

ich hab schon öfter mit mdi-Anwendungen programmiert.

hilft mir leider nicht weiter...

denn: es geht hier nicht um "in den Hintergrund" in Bezug auf "innerhalb der Anwendung" (zOrder), sondern: um absolut in den Hintergrund. Wie beim Desktop. Die Form soll nicht in den Vordergrund geholt werden können, aber dennoch auf Eingaben reagieren können.

Und es soll eben nur EINE Form in den Hintergrund gestellt werden; die anderen sollen sich "normal" verhalten.

hoffe, ihr könnt mir da weiterhelfen!

Gruß,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi...

das mit dem veerben meinte ich so, wie das mit dem vererben nun mal ist *gggg*... das hat ja in erster Linie nichts mit der Programmiersprache sondern mit OOP (Objekt-Orientierter-Programmierung)...

In diesem Falle meinte ich, dass das erste Hauptfenster seine Eigenschaften (Einstellungen) an seine anderen Fenster weitergibt (vererbt).

Den Effekt seihst du ja bei deinem Proggi... Wenn das allerdings immer noch nicht funktioniert obwohl du die Anordnung in der OnShow, OnCreate, oder OnActivate Routine geschrieben hast, weiss ich auch nicht mehr....

Doch eigentlich schon, aber eine ziemlich unschöne (genauer gesagt ******-Lösung (entschuldigt meine Ausdrucksweise))...

In dem du auf deinem Hauptfenster noch einen Timer packst, den du aktivierst, nachdem dein 2. Formular erzeugt (oder angezeigt) wird. In die Timer Routine schriebst du die Position von Form2 und richtest sie neu aus... Dann deaktivierst du den Timer wieder... mit den Zeiten des Timers mußt du expermimentieren.. Das Verhalten ist dann von System zu System unterschiedlich...

Auch verbrennst du damit eine Menge Resourcen und Tralala...

Aber wenn dir das so reicht, kannst du das ja so machen.. ich versteh nur nicht, warum das andere nicht funzt... In welchen Routine hast du den kram denn genau reingeschrieben??

Viel Glück, Gruß, Taz....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Taz!

Original geschrieben von TAZttDevil

Hi...

das mit dem veerben meinte ich so, wie das mit dem vererben nun mal ist *gggg*... das hat ja in erster Linie nichts mit der Programmiersprache sondern mit OOP (Objekt-Orientierter-Programmierung)...

In diesem Falle meinte ich, dass das erste Hauptfenster seine Eigenschaften (Einstellungen) an seine anderen Fenster weitergibt (vererbt).

In meinem Programm arbeite ich aber nicht mit OOP... soll heißen, die Form die in den Vordergrund soll erbt in keinster Weise von der Hintergrundform (umgekehrt auch nicht).

Original geschrieben von TAZttDevil

In dem du auf deinem Hauptfenster noch einen Timer packst, den du aktivierst, nachdem dein 2. Formular erzeugt (oder angezeigt) wird. In die Timer Routine schriebst du die Position von Form2 und richtest sie neu aus... Dann deaktivierst du den Timer wieder... mit den Zeiten des Timers mußt du expermimentieren.. Das Verhalten ist dann von System zu System unterschiedlich...

Auch verbrennst du damit eine Menge Resourcen und Tralala...

hab ich natürlich schon ausprobiert. Aber sobald eine Form mal in den Hintergrund gesetzt wurde (das wird die zweite Form ja leider zwangsweise, wenn ich die erste in den Hintergrund setze), so lässt sie sich (auch mittels der OnTop-Methode die ich geschrieben habe) um nichts in der Welt mehr in den Vordergrund bringen.

Mit Timern müsste ich nämlich sowieso arbeiten, da die in den Hintergrund gesetzte Form beim Anklicken wieder in den Vordergrund wandert.

Ich hab zuerst gedacht, es läge an dem In-den-Hintergrund-setz-Timer, der andauernd die Methode für OnDesktop aufruft und hab dann auch den Timer ausgeschaltet. Aber trotzdem: wenn ich will dass die Form wieder per Methode "normal" wird - geht nix...

Original geschrieben von TAZttDevil

Aber wenn dir das so reicht, kannst du das ja so machen.. ich versteh nur nicht, warum das andere nicht funzt... In welchen Routine hast du den kram denn genau reingeschrieben??

Viel Glück, Gruß, Taz....

Der von mit gepostete Code ist eigentlich die ganze (vereinfachte) Fenster-Handling-Angelegenheit. Das ist das minimalste für die Funktion und dann taucht der Fehler bereits auf.

Die Form1, welche in den Hintergrund soll, hat den von mir geposteten Code. Form2 ist egal...

Gruß,

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm.. also dein Quelltext sieht bündig und einfach aus.. ich sehe darin auch keinen Fehler...

Mal was anderes.. wie kann man denn VB ohne OOP porgrammieren?? deine Formulare sind Objekte, du setzt Ereignisse ein... das alles sind doch schon Teile von OOP...

Und, kann man in VB einstellen, ob ein Formular neu erstellt oder abgeleitet wird?? Ich selber programmier überwiegend in C und Delphi (also kein VB), deshlab bin ich mir nicht so sicher...

Ähm... erstellst du das Formular2 eigentlich beim Programmstart oder erst hinterher (wenn man es braucht)??

Weil du rufst, das Form ja mit Show auf... Hast du mal probiert, das Form erst an der Stelle des ersten Aufrufs zu erstellen??

ansonsten fällt mir auch nichts mehr ein.. sorry...

Taz...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von TAZttDevil

Hmm.. also dein Quelltext sieht bündig und einfach aus.. ich sehe darin auch keinen Fehler...

Mal was anderes.. wie kann man denn VB ohne OOP porgrammieren?? deine Formulare sind Objekte, du setzt Ereignisse ein... das alles sind doch schon Teile von OOP...

Und, kann man in VB einstellen, ob ein Formular neu erstellt oder abgeleitet wird?? Ich selber programmier überwiegend in C und Delphi (also kein VB), deshlab bin ich mir nicht so sicher...

VB ohne OOP...

so ganz stimmt das natürlich nicht...

Formulare sind natürlich Objekte, die über Methoden verfügen.

Nur alles "weitergehende" der OOP muss man selber implementieren.

VB6 kann sogar noch KEINE Vererbung!!! (gibt's erst ab .NET)

So ein Formular erstellt man einfach über den Menübefehl "Projekt - Formular hinzufügen" im VisualBasic.

Mit C++ mäßigem "new Formular()" is da nix!

Original geschrieben von TAZttDevil

Ähm... erstellst du das Formular2 eigentlich beim Programmstart oder erst hinterher (wenn man es braucht)??

Weil du rufst, das Form ja mit Show auf... Hast du mal probiert, das Form erst an der Stelle des ersten Aufrufs zu erstellen??

ansonsten fällt mir auch nichts mehr ein.. sorry...

Taz...

Mir Show wird die Form entweder angezeigt oder, wenn sie noch nicht geladen wurde, geladen.

Direkt die Form an dieser Stelle zu "erstellen", ist mit VB nicht so ohne weiteres möglich.

Na ja, ich probier jetzt eben noch irgendwie rum, das Proggie doch noch richtig zum Laufen zu kriegen...

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Taz,

ich hab jetzt noch mal mit Timern und diversem Zeugs herumexperimentiert – hat leider alles nix gebracht :(

Darum habe ich jetzt mal in einem speziellen VB-Forum gefragt. Hoffentlich findet sich da noch was!

Trotzdem Danke für deine Hilfe dass du dich mit dem Problem beschäftigt hast, auch wenn du dich mit VB nicht so unbedingt auskennst! :)

Technician

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...