2010年2月3日水曜日

.NET MDI子フォーム(FormBoderStyle=None)を表示するときにちらつく

MDI親フォームからFormBorderStyle=Noneの子―フォームを開くとき
一瞬だけタイトルバーが表示されてしまいます。


現象を確認出来るコード

MDI親フォームでは開くメニューを用意し、Clickイベントで子―フォームを開きます。
Public Class FrmMdi
    Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click
        '開いているフォームをすべて閉じる
        For Each f As Form In Me.MdiChildren
            f.Close()
        Next
        '新しいフォームを開く
        Dim frm As New FrmChild
        frm.MdiParent = Me
        frm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        frm.Dock = DockStyle.Fill
        frm.Show()
    End Sub
End Class
MDI子フォームは新規作成したフォームのままで特にコードはかきません。
Public Class FrmChild
End Class

開くボタンを連打すると子フォームのタイトルバーが一瞬表示されると思います。


この現象を防ぐために、子フォームのOnLoadをオーバーライドし下記のように記述します。
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    Me.FormBorderStyle = Me.FormBorderStyle
    MyBase.OnLoad(e)
End Sub

これでタイトルバーが一瞬表示される現象が発生しなくなるのですが
今度は子フォームを閉じるとき一瞬画面全体が上に移動してしまう現象が発生しちらつきますw
たぶんタイトルバーの高さ分だけ移動していると思われます。
こちらは回避方法がわかりません。

そこでMDI親フォームの開くボタンではフォームを開いてから、他のフォームを閉じることにし、閉じているところを隠しました。
根本的な解決ではありませんが・・・

Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click
        ''開いているフォームをすべて閉じる
        'For Each f As Form In Me.MdiChildren
        '    f.Close()
        'Next

        '新しいフォームを開く
        Dim frm As New FrmChild
        frm.MdiParent = Me
        frm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        frm.Dock = DockStyle.Fill
        frm.Show()

        '開いているフォームをすべて閉じる
        For Each f As Form In Me.MdiChildren
            If f IsNot frm Then
                f.Close()
            End If
        Next

    End Sub

0 件のコメント: