| |
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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere Infos
|