2016-05-18 18 views
0

私はMDIの子フォームを含むプロジェクトに取り組んでいます。私は、ユーザーがのMDI親のボーダーレスフォームのエッジからドラッグしようとすると、私のMDI子フォームが動かなくなるようにしました。しかし、ユーザーが主張する場合、MDIの子供のフォームはちらつきクレイジーのように!私はすでにDoubleBuffered = Trueに自分のフォームを設定していると私はまた、イベントの最後にme.Refresh()me.parentform.Refresh()を追加しているVB.NET - mdi親ボーダーレスフォームエッジ上を移動すると、mdiの子フォームがちらつくのを止めるにはどうすればいいですか?

注意

ほかに何かできますか?ここで


は、私のコードの編集した例です...

まず、カスタムタイトルバーコントロールを持っており、これはそれの必要な部分はコードだ次のとおりです。

Imports System.Windows.Forms 
Imports System.ComponentModel 

Public Class cmosTitleBar 

Region "Custom events." 
    Public Event FormTitleBar_DoubleClick_Plus(sender As Object, e As EventArgs) 
    Public Event FormTitleBar_MouseDown_Plus(sender As Object, e As EventArgs) 
    Public Event FormTitleBar_MouseMove_Plus(sender As Object, e As EventArgs) 
    Public Event FormTitleBar_MouseEnter_Plus(sender As Object, e As EventArgs) 
    Public Event FormTitleBar_MouseLeave_Plus(sender As Object, e As EventArgs) 
End Region 

Region "Form Code." 

    Dim NewPoint As New System.Drawing.Point 
    Dim X, Y As Integer 

Region "FormTitleBar Events." 
    Private Sub FormTitleBar_DoubleClick(sender As Object, e As EventArgs) Handles FormTitleBar.DoubleClick 
     RaiseEvent FormTitleBar_DoubleClick_Plus(sender, e) 
     Call PreventFlickering() 
    End Sub 
    Private Sub FormTitleBar_MouseDown(sender As Object, e As MouseEventArgs) Handles FormTitleBar.MouseDown, FormIcon.MouseDown, MyBase.MouseDown 
     If Not ParentForm.WindowState = FormWindowState.Maximized Then 
      X = Control.MousePosition.X - ParentForm.Location.X 
      Y = Control.MousePosition.Y - ParentForm.Location.Y 
     End If 
     RaiseEvent FormTitleBar_MouseDown_Plus(sender, e) 
    End Sub 
    Private Sub FormTitleBar_MouseMove(sender As Object, e As MouseEventArgs) Handles FormTitleBar.MouseMove, FormIcon.MouseMove, MyBase.MouseMove 
     If Not ParentForm.WindowState = FormWindowState.Maximized Then 
      If e.Button = Windows.Forms.MouseButtons.Left Then 
       NewPoint = Control.MousePosition 
       NewPoint.X -= (X) 
       NewPoint.Y -= (Y) 
       ParentForm.Location = NewPoint 
      End If 
     End If 
     Call PreventChildMoveOut() 
     RaiseEvent FormTitleBar_MouseMove_Plus(sender, e) 
     RaiseEvent FormIcon_MouseMove_Plus(sender, e) 
     Call PreventFlickering() 
    End Sub 
    Private Sub FormTitleBar_MouseEnter(sender As Object, e As EventArgs) Handles FormTitleBar.MouseEnter, FormIcon.MouseEnter 
     If ParentForm.WindowState = FormWindowState.Normal Then 
      FormTitleBar.Cursor = Cursors.NoMove2D 
      FormIcon.Cursor = Cursors.NoMove2D 
     Else 
      FormTitleBar.Cursor = Cursors.Default 
      FormIcon.Cursor = Cursors.Default 
     End If 
     RaiseEvent FormTitleBar_MouseEnter_Plus(sender, e) 
    End Sub 
    Private Sub FormTitleBar_MouseLeave(sender As Object, e As EventArgs) Handles FormTitleBar.MouseLeave 
     RaiseEvent FormTitleBar_MouseLeave_Plus(sender, e) 
    End Sub 
End Region 

End Region 

Region "Custom subs." 
    Private Sub PreventFlickering() 
     If Me.ParentForm.IsMdiChild = True Then 
      Me.ParentForm.Refresh() 
      Me.ParentForm.ParentForm.Refresh() 
     Else 
      Me.ParentForm.Refresh() 
     End If 
    End Sub 
    Private Sub PreventChildMoveOut() 
     If ParentForm.IsMdiChild = True Then 
      If ParentForm.Left < ParentForm.MdiParent.ClientRectangle.Left Then 
       ParentForm.Left = ParentForm.MdiParent.ClientRectangle.Left 
       If ParentForm.Top < ParentForm.MdiParent.ClientRectangle.Top Then 
        ParentForm.Top = ParentForm.MdiParent.ClientRectangle.Top 
       ElseIf ParentForm.Bottom > ParentForm.MdiParent.ClientRectangle.Height - 98 Then 
        ParentForm.Top = ParentForm.MdiParent.ClientRectangle.Bottom - ParentForm.Height - 98 
       End If 
      ElseIf ParentForm.Right > ParentForm.MdiParent.ClientRectangle.Width Then 
       ParentForm.Left = ParentForm.MdiParent.ClientRectangle.Right - ParentForm.Width 
       If ParentForm.Top < ParentForm.MdiParent.ClientRectangle.Top Then 
        ParentForm.Top = ParentForm.MdiParent.ClientRectangle.Top 
       ElseIf ParentForm.Bottom > ParentForm.MdiParent.ClientRectangle.Height - 98 Then 
        ParentForm.Top = ParentForm.MdiParent.ClientRectangle.Bottom - ParentForm.Height - 98 
       End If 
      ElseIf ParentForm.Top < ParentForm.MdiParent.ClientRectangle.Top Then 
       ParentForm.Top = ParentForm.MdiParent.ClientRectangle.Top 
      ElseIf ParentForm.Bottom > ParentForm.MdiParent.ClientRectangle.Height - 98 Then 
       ParentForm.Top = ParentForm.MdiParent.ClientRectangle.Bottom - ParentForm.Height - 98 
      End If 
     End If 
    End Sub 
End Region 

End Class 

私のボーダレスMDI親のフォームに必要なコードは、カスタムタイトルバーコントロール:また、私のカスタムタイトルバーコントロールが含まれている私のボーダレスMDI子フォームに

Public Class MainForm 

Region "Form Code." 
     Private Sub SettingsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SettingsToolStripMenuItem.Click 
      SettingsForm.MdiParent = Me 
      SettingsForm.Show() 
     End Sub 
    End Region 

End Class 

すべて原因このアクションのためのコードは(今まで)は存在しないがカスタムタイトルバーコントロールに年代に起こりますコード。

+1

境界線が通常の大きさの境界線でない限り、MDIは正しく機能しません。あなたは上り坂と戦っています。 MDIは基本的に古くからのパラダイムです。 – LarsTech

答えて

1

場所を> =​​ 0に制限しようとしているためにちらつきがあり、場所が-1と0に移動します。次に、境界を越えてフォームを強要しようとすると、場所は実際に-1、0、 - 1、0などです。最初に-1にすることはできません。代わりに、mdi子を移動するときにカーソル領域を制限します。

テストするには、2つのフォームを使用してプロジェクトを作成します。

  • MdiParentForm MdiChildForm
  • IsMdiContainer = true

MdiParentFormコード:

Public Class MdiParentForm 

    Private child As Form 

    Private Sub MdiParentForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     child = New MdiChildForm() 
     child.MdiParent = Me 
     child.Show() 
    End Sub 

End Class 

MdiChildFormコード:

Public Class MdiChildForm 

    Private mouseIsDown As Boolean = False 
    Private myParent As Form 
    Private myRectangle As System.Drawing.Rectangle 
    Private myCursorLocation As System.Drawing.Point 
    Private myBorderWidth As Integer 
    Private myTitlebarHeight As Integer 

    Private Sub MdiChildForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     myParent = Me.MdiParent 
    End Sub 

    Private Sub MdiChildForm_MouseCaptureChanged(sender As Object, e As EventArgs) Handles Me.MouseCaptureChanged 
     If mouseIsDown Then 
      myRectangle = myParent.Bounds 
      myCursorLocation = Me.PointToClient(Cursor.Position) 
      myBorderWidth = (Me.Width - Me.ClientSize.Width)/2 
      myTitlebarHeight = Me.Height - Me.ClientSize.Height - 2 * myBorderWidth 
     End If 
    End Sub 

    Private Sub MdiChildForm_Move(sender As Object, e As EventArgs) Handles Me.Move 
     If mouseIsDown Then 
      Cursor.Clip = New Rectangle(myRectangle.Left + myCursorLocation.X + myBorderWidth, 
             myRectangle.Top + myCursorLocation.Y + myTitlebarHeight, 
             myRectangle.Width - Me.Width - myBorderWidth, 
             myRectangle.Height - Me.Height) 
     Else 
      Cursor.Clip = Nothing 
     End If 
    End Sub 

    ' there is no event for title bar click, so use WndProc 
    Protected Overrides Sub WndProc(ByRef m As Message) 
     MyBase.WndProc(m) 
     Select Case m.Msg 
      Case &H21 
       mouseIsDown = True 
      Case &H22 
       mouseIsDown = False 
     End Select 
    End Sub 

End Class 

あなたがCUSTを使用しているのでomコントロールを使用する場合は、Cursor.Clipの矩形の寸法を調整し、内部の座標をMdiChildForm_Moveに調整する必要があります。

+0

あなたの答えは正しいです、私は新しいプロジェクトを作り、すべて一緒に入れてもそれは私のプロジェクトに収まらないのです...それはうまくいきません!!!たぶん私はそれについてもっと詳しく述べるべきです。私はすぐに私の質問を編集します! –

+0

コード例を編集しました。どうぞご覧ください。 –

関連する問題