| |
Fortgeschrittene ProgrammierungForm 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 | |
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. | |
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 | |
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. | |
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 | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|