Weird MDI problem - sample code attached - WindowsApplication1.zip (0/1)

A

Andrew K

Hi,

This is a problem I noticed in one of my applications the other day
and can't figure out how to fix.

In the attached code I have 2 forms. The form named form1 is the MDI
container, form2 is an MDIChild. I show the child form with the
following code in the Form_Load event of the MDI container...

Private Sub Form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim f As New Form2
f.MdiParent = Me
f.Show()
End Sub

....on the child form I have placed 2 controls, a button and a
checkbox. I've set both the controls to FlatStyle.Flat so the
appearance changes on mouse events.

The following code is on the button click event...

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
Static bln As Boolean
If (bln) Then
Dim f As Form = Me.Owner
Me.Owner = Nothing
Me.MdiParent = f
bln = False
Else
Dim f As Form = Me.MdiParent
Me.MdiParent = Nothing
Me.Owner = f
bln = True
End If
End Sub

....this sets form2 to non-MDIChild and back to MDIChild.

The problem is when I do this with the code shown above the 2 controls
on the form stop responding to the mouse events enter and leave. This
can be seen quite easily because they no longer change appearance.

Is the code on the button click incorrect, or is this a known bug?

Any help would be much appreciated...

Regards
Andrew K
 
A

Andrew K

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Public Sub New()
MyBase.New()

'This call is required by the Windows Form Designer.
InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As
Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form
Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(320, 213)
Me.IsMdiContainer = True
Me.Name = "Form1"
Me.Text = "Form1"

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim f As New Form2
f.MdiParent = Me
f.Show()
End Sub
End Class



Public Class Form2
Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

Public Sub New()
MyBase.New()

'This call is required by the Windows Form Designer.
InitializeComponent()

'Add any initialization after the InitializeComponent() call

End Sub

'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal disposing As
Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer

'NOTE: The following procedure is required by the Windows Form
Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents CheckBox1 As System.Windows.Forms.CheckBox
Friend WithEvents Button1 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.CheckBox1 = New System.Windows.Forms.CheckBox
Me.Button1 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'CheckBox1
'
Me.CheckBox1.Cursor = System.Windows.Forms.Cursors.Hand
Me.CheckBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.CheckBox1.Location = New System.Drawing.Point(48, 32)
Me.CheckBox1.Name = "CheckBox1"
Me.CheckBox1.TabIndex = 0
Me.CheckBox1.Text = "CheckBox1"
'
'Button1
'
Me.Button1.Cursor = System.Windows.Forms.Cursors.Hand
Me.Button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.Button1.Location = New System.Drawing.Point(48, 80)
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 1
Me.Button1.Text = "Button1"
'
'Form2
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(240, 133)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.CheckBox1)
Me.Name = "Form2"
Me.Text = "Form2"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles Button1.Click
Static bln As Boolean
If (bln) Then
Dim f As Form = Me.Owner
Me.Owner = Nothing
Me.MdiParent = f
bln = False
Else
Dim f As Form = Me.MdiParent
Me.MdiParent = Nothing
Me.Owner = f
bln = True
End If
End Sub

Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Button1.MouseEnter
Console.WriteLine("Button1_MouseEnter")
End Sub

Private Sub Button1_MouseLeave(ByVal sender As Object, ByVal e As
System.EventArgs) Handles Button1.MouseLeave
Console.WriteLine("Button1_MouseLeave")
Me.Button1.FlatStyle = FlatStyle.Flat
End Sub

Private Sub CheckBox1_MouseEnter(ByVal sender As Object, ByVal e
As System.EventArgs) Handles CheckBox1.MouseEnter
Console.WriteLine("CheckBox1_MouseEnter")
End Sub

Private Sub CheckBox1_MouseLeave(ByVal sender As Object, ByVal e
As System.EventArgs) Handles CheckBox1.MouseLeave
Console.WriteLine("CheckBox1_MouseLeave")
End Sub
End Class
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top