none
MenuStripを継承したクラスに於けるTooStripMenuItemの移動方法は? RRS feed

  • 質問

  • MenuStripを継承し、1個のTooStripMenuItemを追加したカスタムコントロールがあるのですが、
    このカスタムコントロールをFormに追加したときに、そのTooStripMenuItemが先頭(左)に
    表示されたままデザイナで移動させることができません。
    このカスタムコントロールにForm上で新たに追加したTooStripMenuItemはデザイナで
    移動させることができますが、カスタムコントロールに内包したTooStripMenuItemも同様に
    移動させる方法は無いものでしょうか?
    最悪、コード(プロパティ設定)で移動させる方法でもいいです。
    よろしくお願いします。
    2006年10月30日 3:02

すべての返信

  •  コリン星人 さんからの引用

    MenuStripを継承し、1個のTooStripMenuItemを追加したカスタムコントロールがあるのですが、
    このカスタムコントロールをFormに追加したときに、そのTooStripMenuItemが先頭(左)に
    表示されたままデザイナで移動させることができません。

    デザイナはFormのインスタンスを操作します。
    つまり、デザイナが扱えるのはFormクラスを通してアクセスできるオブジェクトです。
    追加済みのToolStripMenuItemはそのオブジェクトの中にありデザイナからは見えませんので
    そのような挙動になるのでしょう。

    そのコントロールに位置を指定するようなプロパティを設けてはどうでしょうか?

    2006年10月31日 4:13
  • ???????????????????????????AddRenge?????????????????????????
    Form1??MyMenuStrip1?New?????(1)????????????????MyToolStripMenuItem?
    ?????????(2)???????MyToolStripMenuItem???ToolStripMenuItem1?ToolStripMenuItem2
    ???????????????????????????????????????????????
    Public Class MyMenuStrip
        Inherits System.Windows.Forms.MenuStrip
    
        Private WithEvents MyToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
    
        Private Sub InitializeComponent()
            Me.MyToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem
            Me.SuspendLayout()
            '
            'MyMenuStrip
            '
       (1)->Me.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MyToolStripMenuItem})
            Me.Location = New System.Drawing.Point(0, 0)
            Me.Name = "MyMenuStrip"
            Me.Size = New System.Drawing.Size(826, 24)
            Me.Text = "MyMenuStrip"
            '
            'ToolStripMenuItem1
            '
            Me.MyToolStripMenuItem.Name = "ToolStripMenuItem1"
            Me.MyToolStripMenuItem.Size = New System.Drawing.Size(57, 20)
            Me.MyToolStripMenuItem.Text = "??????(&M)"
    
            Me.ResumeLayout(False)
            Me.PerformLayout()
        End Sub
    
    End Class
    
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
        '???????????????????????????? dispose ????????????
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
            MyBase.Dispose(disposing)
        End Sub
    
        'Windows ???? ??????????
        Private components As System.ComponentModel.IContainer
    
        '??: ?????????? Windows ???? ??????????
        'Windows ???? ????????????????  
        '??? ???????????????????
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            Me.components = New System.ComponentModel.Container
            Me.MyMenuStrip1 = New MyMenuStrip
            Me.ToolStripMenuItem1 = New System.Windows.Forms.ToolStripMenuItem
            Me.ToolStripMenuItem2 = New System.Windows.Forms.ToolStripMenuItem
            Me.MyMenuStrip1.SuspendLayout()
            Me.SuspendLayout()
            '
            'MyMenuStrip1
            '
            Me.MyMenuStrip1.AllowItemReorder = True
       (2)->Me.MyMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripMenuItem1, Me.ToolStripMenuItem2})
            Me.MyMenuStrip1.Location = New System.Drawing.Point(0, 0)
            Me.MyMenuStrip1.Name = "MyMenuStrip1"
            Me.MyMenuStrip1.Size = New System.Drawing.Size(992, 24)
            Me.MyMenuStrip1.Text = "MyMenuStrip1"
            '
            'ToolStripMenuItem1
            '
            Me.ToolStripMenuItem1.Name = "ToolStripMenuItem1"
            Me.ToolStripMenuItem1.Size = New System.Drawing.Size(118, 20)
            Me.ToolStripMenuItem1.Text = "ToolStripMenuItem1"
            '
            'ToolStripMenuItem2
            '
            Me.ToolStripMenuItem2.Name = "ToolStripMenuItem2"
            Me.ToolStripMenuItem2.Size = New System.Drawing.Size(118, 20)
            Me.ToolStripMenuItem2.Text = "ToolStripMenuItem2"
            '
            'Form1
            '
            Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.ClientSize = New System.Drawing.Size(992, 501)
            Me.Controls.Add(Me.MyMenuStrip1)
            Me.MainMenuStrip = Me.MyMenuStrip1
            Me.Name = "Form1"
            Me.Text = "Form1"
            Me.MyMenuStrip1.ResumeLayout(False)
            Me.MyMenuStrip1.PerformLayout()
            Me.ResumeLayout(False)
            Me.PerformLayout()
    
        End Sub
        Friend WithEvents MyMenuStrip1 As MyMenuStrip
        Friend WithEvents ToolStripMenuItem1 As System.Windows.Forms.ToolStripMenuItem
        Friend WithEvents ToolStripMenuItem2 As System.Windows.Forms.ToolStripMenuItem
    End Class
    
    2006年10月31日 6:10
  • 例えば以下のようなコードがあるときに、メニューの並びはAddRengeメソッドの引数の配列の順番で決まってしまうようで、
    Form1内でMyMenuStrip1をNewした時点で(1)が実行されて、メニューの一番左にMyToolStripMenuItemが
    生成され、その後、(2)が実行されて、MyToolStripMenuItemの隣にToolStripMenuItem1とToolStripMenuItem2
    が生成されてしまうようです。なので、コントロールの位置を指定するのもなかなか難しそうなのです。
    Public Class MyMenuStrip
        Inherits System.Windows.Forms.MenuStrip
    
        Private WithEvents MyToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
    
        Private Sub InitializeComponent()
            Me.MyToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem
            Me.SuspendLayout()
            '
            'MyMenuStrip
            '
       (1)->Me.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.MyToolStripMenuItem})
            Me.Location = New System.Drawing.Point(0, 0)
            Me.Name = "MyMenuStrip"
            Me.Size = New System.Drawing.Size(826, 24)
            Me.Text = "MyMenuStrip"
            '
            'ToolStripMenuItem1
            '
            Me.MyToolStripMenuItem.Name = "ToolStripMenuItem1"
            Me.MyToolStripMenuItem.Size = New System.Drawing.Size(57, 20)
            Me.MyToolStripMenuItem.Text = "マイメニュー(&M)"
    
            Me.ResumeLayout(False)
            Me.PerformLayout()
        End Sub
    
    End Class
    
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
        'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。
        <System.Diagnostics.DebuggerNonUserCode()> _
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
            MyBase.Dispose(disposing)
        End Sub
    
        'Windows フォーム デザイナで必要です。
        Private components As System.ComponentModel.IContainer
    
        'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。
        'Windows フォーム デザイナを使用して変更できます。  
        'コード エディタを使って変更しないでください。
        <System.Diagnostics.DebuggerStepThrough()> _
        Private Sub InitializeComponent()
            Me.components = New System.ComponentModel.Container
            Me.MyMenuStrip1 = New MyMenuStrip
            Me.ToolStripMenuItem1 = New System.Windows.Forms.ToolStripMenuItem
            Me.ToolStripMenuItem2 = New System.Windows.Forms.ToolStripMenuItem
            Me.MyMenuStrip1.SuspendLayout()
            Me.SuspendLayout()
            '
            'MyMenuStrip1
            '
            Me.MyMenuStrip1.AllowItemReorder = True
       (2)->Me.MyMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ToolStripMenuItem1, Me.ToolStripMenuItem2})
            Me.MyMenuStrip1.Location = New System.Drawing.Point(0, 0)
            Me.MyMenuStrip1.Name = "MyMenuStrip1"
            Me.MyMenuStrip1.Size = New System.Drawing.Size(992, 24)
            Me.MyMenuStrip1.Text = "MyMenuStrip1"
            '
            'ToolStripMenuItem1
            '
            Me.ToolStripMenuItem1.Name = "ToolStripMenuItem1"
            Me.ToolStripMenuItem1.Size = New System.Drawing.Size(118, 20)
            Me.ToolStripMenuItem1.Text = "ToolStripMenuItem1"
            '
            'ToolStripMenuItem2
            '
            Me.ToolStripMenuItem2.Name = "ToolStripMenuItem2"
            Me.ToolStripMenuItem2.Size = New System.Drawing.Size(118, 20)
            Me.ToolStripMenuItem2.Text = "ToolStripMenuItem2"
            '
            'Form1
            '
            Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.ClientSize = New System.Drawing.Size(992, 501)
            Me.Controls.Add(Me.MyMenuStrip1)
            Me.MainMenuStrip = Me.MyMenuStrip1
            Me.Name = "Form1"
            Me.Text = "Form1"
            Me.MyMenuStrip1.ResumeLayout(False)
            Me.MyMenuStrip1.PerformLayout()
            Me.ResumeLayout(False)
            Me.PerformLayout()
    
        End Sub
        Friend WithEvents MyMenuStrip1 As MyMenuStrip
        Friend WithEvents ToolStripMenuItem1 As System.Windows.Forms.ToolStripMenuItem
        Friend WithEvents ToolStripMenuItem2 As System.Windows.Forms.ToolStripMenuItem
    End Class
    
    2006年10月31日 6:13
  • アイテム追加時に指定位置に移動してみた

    Friend Class CustumMenu
        Inherits MenuStrip

        Private mMenu As ToolStripMenuItem

        Sub New()
            mMenu = New ToolStripMenuItem("あれげ")
            Me.Items.Add(mMenu)
        End Sub

        Public Property PrivateMenuIndex() As Integer
            Get
                Return mMenuIndex
            End Get
            Set(ByVal value As Integer)
                mMenuIndex = value
                MoveItemToMenuIndex()
            End Set
        End Property
        Private mMenuIndex As Integer = -1

        Protected Overrides Sub OnItemAdded(ByVal e As System.Windows.Forms.ToolStripItemEventArgs)
            MyBase.OnItemAdded(e)

            If e.Item IsNot mMenu Then
                MoveItemToMenuIndex()
            End If
        End Sub

        Private Sub MoveItemToMenuIndex()
            If PrivateMenuIndex >= 0 AndAlso PrivateMenuIndex < Me.Items.Count  _
                AndAlso Me.Items.IndexOf(mMenu) <> PrivateMenuIndex Then
                Me.Items.Remove(mMenu)
                Me.Items.Insert(PrivateMenuIndex, mMenu)
            End If
        End Sub

    End Class

    2006年10月31日 10:03
  • なるほど。いったん削除して再度追加する方法があったのですね。
    示していただいたコードでうまくいきました。
    ありがとうございました。
    2006年11月1日 1:34