Einzelnes Fenster aktivieren --> alle Fenster im Vordergrund!

18/02/2008 - 15:43 von Johannes Franke | Report spam
Hi zusammen,

hàtte da mal eine Frage, ein VB6-Feature betreffend. Und zwar geht es um
eine Applikation mit mehreren Dialogen, die gleichzeitig geöffnet sein
können. Sobald einer davon z.B. per Mausklick aktiviert wird, kommen alle
anderen Dialoge der Applikation ebenfalls in den Vordergrund. Das irritiert
die Benutzer (und mich auch), ist aber vermutlich in der VB6 Runtime
verankert und beabsichtigt.

Folgendermaßen làsst sich die Sache reproduzieren:

- neues Standard VB6 EXE Projekt erstellen
- zu dem Projekt ein neues Modul hinzufügen
- "Sub Main()" als Startobjekt in den Projekteigenschaften wàhlen
- Sub Main() im Modul erzeugen, mit folgendem Inhalt:

Sub Main()

Dim oFrm As Form1
Dim n As Long

For n = 1 To 10
Set oFrm = New Form1
Call oFrm.Show
Set oFrm = Nothing
Next

End Sub

Dieses Projekt wird beim Start 10 kaskadierte Fenster in der oberen linken
Bildschirmecke erstellen. Davon kann man jetzt ein beliebiges an eine andere
Stelle auf dem Bildschirm ziehen. Die neun übrigen Fenster überdeckt man mit
z.B. einem Explorer (oder was gerade zur Hand ist).
Nun führt das Aktivieren per Mausklick auf dem "weggezogenen" Fenster dazu,
dass auch die neun anderen Fenster wieder in den Vordergrund kommen und
damit das Explorer-Fenster überdecken.
Gibt es eine Möglichkeit, dieses Verhalten zu àndern oder zu unterdrücken?

Vielen Dank für Eure Hilfe!

Viele Grüße
Johannes
 

Lesen sie die antworten

#1 Johannes Franke
18/02/2008 - 17:10 | Warnen spam
Hat sich erledigt...

der Trick besteht darin, mittels SetWindowLong() den HWND-Parent aller
Formulare auf 0 zu setzen. Damit hàngen Sie nicht mehr von dem unsichtbaren
VB6-Hauptfenster (z.B. "ThunderRT6Main") ab und können dann unabhàngig
voneinander aktiviert werden!

Deklarationsteil:

Private Declare Function SetWindowLong Lib "user32.dll" Alias
"SetWindowLongA" ( _
ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long)
As Long
Private Const GWL_HWNDPARENT As Long = -8

Aufruf der Funktion (z.B. in Form_Load):

Call SetWindowLong (Me.hWnd, GWL_HWNDPARENT, 0&)

Danke und viele Grüße,

Johannes


"Johannes Franke" schrieb im Newsbeitrag
news:
Hi zusammen,

hàtte da mal eine Frage, ein VB6-Feature betreffend. Und zwar geht es um
eine Applikation mit mehreren Dialogen, die gleichzeitig geöffnet sein
können. Sobald einer davon z.B. per Mausklick aktiviert wird, kommen alle
anderen Dialoge der Applikation ebenfalls in den Vordergrund. Das
irritiert die Benutzer (und mich auch), ist aber vermutlich in der VB6
Runtime verankert und beabsichtigt.

Folgendermaßen làsst sich die Sache reproduzieren:

- neues Standard VB6 EXE Projekt erstellen
- zu dem Projekt ein neues Modul hinzufügen
- "Sub Main()" als Startobjekt in den Projekteigenschaften wàhlen
- Sub Main() im Modul erzeugen, mit folgendem Inhalt:

Sub Main()

Dim oFrm As Form1
Dim n As Long

For n = 1 To 10
Set oFrm = New Form1
Call oFrm.Show
Set oFrm = Nothing
Next

End Sub

Dieses Projekt wird beim Start 10 kaskadierte Fenster in der oberen linken
Bildschirmecke erstellen. Davon kann man jetzt ein beliebiges an eine
andere Stelle auf dem Bildschirm ziehen. Die neun übrigen Fenster
überdeckt man mit z.B. einem Explorer (oder was gerade zur Hand ist).
Nun führt das Aktivieren per Mausklick auf dem "weggezogenen" Fenster
dazu, dass auch die neun anderen Fenster wieder in den Vordergrund kommen
und damit das Explorer-Fenster überdecken.
Gibt es eine Möglichkeit, dieses Verhalten zu àndern oder zu unterdrücken?

Vielen Dank für Eure Hilfe!

Viele Grüße
Johannes

Ähnliche fragen