Обнаружение события перемещения формы из дочернего элемента управления - PullRequest
2 голосов
/ 08 июля 2010

Я создаю пользовательский элемент управления, где, когда пользователь нажимает кнопку, появляется всплывающее окно с информацией. Всплывающее окно управляется toolStripDropDown, поэтому, когда оно появляется, оно делает 2 вещи

  1. Не перемещает другие элементы управления в форме, а отображает над ними
  2. что он может отображать детали за пределами самого пользовательского элемента управления без необходимости заранее резервировать пространство

Вот код

Public Class Popup
Private treeViewHost As ToolStripControlHost
Private Shadows dropDown As ToolStripDropDown

Public Sub New()
    InitializeComponent()
    Dim treeView As New TreeView()

    treeView.BorderStyle = BorderStyle.None
    treeViewHost = New ToolStripControlHost(treeView)
    treeViewHost.Padding = New Padding(6)

    dropDown = New ToolStripDropDown()
    dropDown.AutoClose = False
    dropDown.AutoSize = True
    dropDown.BackColor = Color.LemonChiffon
    dropDown.Items.Add(treeViewHost)
End Sub

Public Sub ShowDropDown()      
    If dropDown.Visible = False Then
        dropDown.Show(Me, Button1.Left + Button1.Height + 5, Button1.Top)
    Else
        dropDown.Close()
    End If

End Sub    

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ShowDropDown()
End Sub

Private Sub Popup_Move(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Move, Button1.Move
    If (dropDown IsNot Nothing AndAlso Button1 IsNot Nothing AndAlso dropDown.Visible) Then
        dropDown.Left = Button1.Left + Button1.Height + 5
        dropDown.Top = Button1.Top
    End If
End Sub
End Class

А вот и инициализация управления

'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()
    Me.Button1 = New System.Windows.Forms.Button
    Me.SuspendLayout()
    '
    'Button1
    '
    Me.Button1.Location = New System.Drawing.Point(4, 4)
    Me.Button1.Name = "Button1"
    Me.Button1.Size = New System.Drawing.Size(27, 23)
    Me.Button1.TabIndex = 0
    Me.Button1.Text = "Button1"
    Me.Button1.UseVisualStyleBackColor = True
    '
    'Popup
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    Me.Controls.Add(Me.Button1)
    Me.Name = "Popup"
    Me.Size = New System.Drawing.Size(39, 35)
    Me.ResumeLayout(False)

End Sub
Friend WithEvents Button1 As System.Windows.Forms.Button

Теперь моя проблема в том, как форма перемещается или изменяет размеры. Tooldropdown не перемещается относительно. Я это понимаю. Когда я пытаюсь захватить событие перемещения пользовательского элемента управления, это событие не срабатывает, когда перемещается вся форма. Должно быть что-то, что я могу захватить, потому что элементы управления в контейнере формы перемещаются относительно, что движет этим? Я пробовал wndproc, но во время перемещения формы ничего не запускается, если форма не перекрашена.

Спасибо

Текущий код в VB, но я могу справиться с обоими.

Ответы [ 4 ]

2 голосов
/ 19 июля 2010

Вы можете подписать родительские события с помощью AddHandler

Но вы делаете это на событиях Parent_changed. Обратите внимание, что Parent является ничем, пока элемент управления не будет добавлен к другому элементу управления или форме.

Private Sub GantCtl_ParentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ParentChanged
   Dim mParent = DirectCast(Parent, Form)
   AddHandler mParent.KeyDown, AddressOf Parent_KeyDown
   AddHandler mParent.MouseWheel, AddressOf Parent_MouseWheel
   AddHandler mParent.Resize, AddressOf parent_Resize
End Sub
2 голосов
/ 08 июля 2010

В C #:

События Move и Resize:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.move.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.control.move.aspx

Просто добавьте в свой .Designer.cs

this.Move +=new System.EventHandler(Form_Changed);
this.Resize += new System.EventHandler(Form_Changed);

Я не знаю, возможно ли это в VB.

1 голос
/ 08 июля 2010

Насколько я понимаю, у вас есть набор инструментов, который необходимо перемещать вместе с формой всякий раз, когда она перемещается пользователем или каким-либо событием, которым вы управляете.Если бы это было так, я бы сделал что-то вроде следующего:

'Function within the form that is being moved and governs the location of the ToolStrip
Private Sub Form1_LocationChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LocationChanged
    'lastLocation is a global variable that is reset every time the form is moved
    Dim offsetX As Integer = lastLocationX.X - Location.X
    Dim offsetY As Integer = lastLocationX.Y - Location.Y
    ToolStrip1.show(lastXcoord - offsetX, lastYcoord - offsetY)
    lastLocation = Location
End Sub
1 голос
/ 08 июля 2010

Я думаю, что это сделал

 AddHandler Me.ParentForm.Move, AddressOf Popup_Move

В событии загрузки. Я должен был сделать это в событии загрузки, потому что ParentForm ранее не был доступен. Я также попробовал событие ParentChange, но это не сработало, если я был в Panel

Me.Parent would equal Panel but
Me.Parent.Parent would equal nothing (also .ParentForm was Nothing)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...