vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Form Handling - MDI - kein MDI 
Autor: sebbi
Datum: 31.08.16 14:10

Hallo zusammen,

ich habe da ein kleines Problem:
In meiner MDI Forms Anwendung musste ich einige Formulare dazunehmen, die kein MDI Child sind.
Ich rufe aus diesen Formularen aber MDI-Cild Forms auf. Dass dann die aufrufende Form minimiert wird bzw. in den Hintergrund geht, damit die Full-Screen MDI Hauptform angezeigt wird ist ja OK, nun sollte aber, sobald die Child Form beendet wird der Focus wieder auf die "Nicht MDI" Form springen.

Ich habe das ganze bis jetzt soweit gelöst:
MDI Child
Option Explicit
Public RefocusForm as Form
 
Private Sub cmdEnd_Click()
    Unload Me
 
    If Not IsNull(RefocusForm) And Not RefocusForm Is Nothing Then
         If IsFormActive(RefocusForm.Name) Then RefocusForm.SetFocus
    End If
End Sub
Nicht MDI Form
Private Sub ZeigeMdiChildForm()
 
    frmMdiChild.Show()
    Set frmMdiChild.RefocusForm = Me
End Sub
Dieses Handling funktioniert auch prima, nun zum eigentlich Problem:
Wenn ich den Code in dem ich den Focus zurücksetze in Form_Unload des MDIChilds verschiebe um auch das Schliessen Kreuz abfangen zu können, funktionierts nicht mehr .. es wird kurz zwar die Nicht MDI Form angezeigt, danach springt der Focus aber direkt wieder zurück auf die MDI Hauptform.

Hat jemand irgend ne Idee wo ich noch suchen kann, bin irgendwie momentan etwas ratlos ...

Vielen Dank schonmal

Sebastian
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Form Handling - MDI - kein MDI 
Autor: Blackbox
Datum: 31.08.16 17:43

Hallo Sebbi,

das Verhalten ist bekannt. Du kannst innerhalb einer MDI-Sitzung nur einen MDI-Frame haben und dieser Frame bestimmt das Verhalten aller Fenster der Anwendung. Um der MDI-Frame diese "Allmächtigkeit" etwas abzumildern und auch Child-Windows ein Eigenleben zu gestatten muss das Frame-Window einen Style: MDIS_ALLCHILDSTYLES haben. Damit ist gesagt, dass die MDI-Frame alle Windows, nicht nur die Childs, beeinträchtigt die als Parent den MDI-Frame haben. Die VB-MDI-Application steht
im Verdacht alles an die eigentliche MDI-Client-Klasse weiterzureichen.

Const MDIS_ALLCHILDSTYLES As Long = &H1

Diesen Style kannst Du mit der API SetWindowsLong() beim Start der Anwendung hinzufügen. Dann sollte dein Vorhaben klappen.

Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
	 ByVal hwnd As Long, _ 
	 ByVal nIndex As Long, _ 
	 ByVal dwNewLong As Long) As Long
 
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
	 ByVal hwnd As Long, _ 
	 ByVal nIndex As Long) As Long
 
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _ 
	 ByVal hWnd1 As Long, _ 
	 ByVal hWnd2 As Long, _ 
	 ByVal lpsz1 As String, _ 
	 ByVal lpsz2 As String) As Long
 
 
Private Const MDIS_ALLCHILDSTYLES As Long = &H1
Private Const GWL_STYLE As Long = -16
Private g_OldStyle As Long
Private MDI-FRAMEhWnd As Long
 
MDI-FRAMEhWnd = FindWindowEx(DeinMIDI.hWnd, 0, "MDICLIENT", "")
 
g_OldStyle = GetWindowLong(MDI-FRAMEhWnd, GWL_Style)
SetWindowLong MDI-FRAMEhWnd, GWL_Style, g_OldStyle OR MDIS_ALLCHILDSTYLES
Die MDI-Frame dürfte aber in die VB-Form eingebettet sein. Daher muss man erst die eigentliche
MDI-Client-Klasse herauslesen und diesem dann die neue Eigenschaft anpassen.

Beitrag wurde zuletzt am 31.08.16 um 18:09:02 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Form Handling - MDI - kein MDI 
Autor: sebbi
Datum: 05.09.16 13:04

Hallo,
danke für die Antwort, hatte gerade mal etwas Zeit zu testen, aber irgendwie läuft das bei mir nicht:

Es scheint so wie wenn
MDI_FRAMEhWnd = FindWindowEx(frmMdiChild.hwnd, 0, "MDICLIENT", "")
nichts ermitteln kann, in der Variable MDI_FRAMEhWnd steht immer der Wert 0

Eingebunden ist der Code in der Nicht MDI Form:
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
     ByVal hwnd As Long, _
     ByVal nIndex As Long, _
     ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
     ByVal hwnd As Long, _
     ByVal nIndex As Long) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
     ByVal hWnd1 As Long, _
     ByVal hWnd2 As Long, _
     ByVal lpsz1 As String, _
     ByVal lpsz2 As String) As Long
Private Const MDIS_ALLCHILDSTYLES As Long = &H1
Private Const GWL_STYLE As Long = -16
Private g_OldStyle As Long
Private MDI_FRAMEhWnd As Long
 
Private Sub ZeigeMdiChildForm()
 
    frmMdiChild.Show()
 
    MDI_FRAMEhWnd = FindWindowEx(frmMdiChild.hwnd, 0, "MDICLIENT", "")
 
    g_OldStyle = GetWindowLong(MDI_FRAMEhWnd, GWL_STYLE)
    SetWindowLong MDI_FRAMEhWnd, GWL_STYLE, g_OldStyle Or MDIS_ALLCHILDSTYLES
 
    Set frmMdiChild.RefocusForm = Me
End Sub
Mfg
Sebastian
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Form Handling - MDI - kein MDI 
Autor: Blackbox
Datum: 05.09.16 17:11

Hallo,

nicht die Childs. Den MDI-Frame, also die Form, die die Childs verwaltet, die musst du nehmen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Beispiel FindWindowEx für MDI-FRAME-Client 
Autor: Blackbox
Datum: 08.09.16 19:51

Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
     ByVal hwnd As Long, _
     ByVal nIndex As Long, _
     ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
     ByVal hwnd As Long, _
     ByVal nIndex As Long) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _
     ByVal hWnd1 As Long, _
     ByVal hWnd2 As Long, _
     ByVal lpsz1 As String, _
     ByVal lpsz2 As String) As Long
Private Const MDIS_ALLCHILDSTYLES As Long = &H1
Private Const GWL_STYLE As Long = -16
Private g_OldStyle As Long
Private MDI_FRAMEhWnd As Long
 
Private Sub ZeigeMdiChildForm()
 
    frmMdiChild.Show()
 
    MDI_FRAMEhWnd = FindWindowEx(frmMdiChild.hwnd, 0, "MDICLIENT", "")
 
    'MDI_FRAMEhWnd muss größer 0 sein!!! sonst hast Du die falsche Form.
 
    g_OldStyle = GetWindowLong(MDI_FRAMEhWnd, GWL_STYLE)
    SetWindowLong MDI_FRAMEhWnd, GWL_STYLE, g_OldStyle Or MDIS_ALLCHILDSTYLES
 
    Set frmMdiChild.RefocusForm = Me
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel