- 題名: フォーム内にフォームを表示でComboBoxのテキストが編集できない
- 日時: 2008/12/29 10:35:16
- ID: 23717
- この記事の返信元:
- (なし)
- この記事への返信:
- [23718] Re[1]: フォーム内にフォームを表示でComboBoxのテキストが編集できない2008/12/29 23:37:42
- ツリーを表示
私のPCで試したところ、 以下の方法でクリック時に編集可能になりました。 クリック後のキャレット移動はカーソルキーしか使えないため、 通常の動作と全く同じではありませんが、 とりあえず以下のコードで試してみてください。 ' このFormを別Formの中に表示する Public Class ComboBoxAndForm Inherits Form Dim TextBox1 As New TextBox Dim WithEvents ComboBox1 As New ComboBox Public Sub New() Me.Text = Me.GetType.Name With Me.TextBox1 .Location = New Point(100, 30) End With With Me.ComboBox1 .Location = New Point(50, 80) .DropDownStyle = ComboBoxStyle.DropDown .DataSource = New String() {"あああ", "いいい", "ううう", "えええ"} End With Me.Controls.AddRange(New Control() {Me.TextBox1, Me.ComboBox1}) End Sub Private Sub ComboBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.Click Me.ComboBox1.Select() End Sub End Class
コードをバージョンアップしてみました。 通常の動作では、ComboBoxのTextが「あいうえお」の場合、 「い」の右半分をクリックすると、「う」にキャレットが移動するようです。 それに合わせて作ってみました。 また、マウスドラッグ時の反転表示も実装しました。 参考になれば幸いです。 ' このFormを別Formの内部に表示する Public Class ComboBoxAndForm Inherits Form Dim TextBox1 As New TextBox Dim WithEvents ComboBox1 As New ComboBoxEx Public Sub New() Me.Text = Me.GetType.Name With Me.TextBox1 .Location = New Point(100, 30) End With With Me.ComboBox1 .Location = New Point(50, 80) .Width = 200 .DropDownStyle = ComboBoxStyle.DropDown .DataSource = New String() {"あいうえおABCかき", "いいい1", "ううう2", "えええ3"} End With Me.Controls.AddRange(New Control() {Me.TextBox1, Me.ComboBox1}) End Sub End Class ' カスタマイズされたComboBox Public Class ComboBoxEx Inherits ComboBox ' ↓Mouseドラッグ時の反転表示領域の後端のIndexを保持する変数 Dim m_selectionend As Integer = 0 ' ↓Focus取得時のClickなら、True Dim m_isfirstclick As Boolean = False Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs) If Me.Focused = False Then Me.m_isfirstclick = True Me.Focus() Else Me.m_isfirstclick = False Me.SelectionStart = Me.HitTest Me.SelectionLength = 0 Me.m_selectionend = Me.SelectionStart End If MyBase.OnMouseDown(e) End Sub Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs) If Me.m_isfirstclick = False AndAlso e.Button = Windows.Forms.MouseButtons.Left Then Dim ht As Integer = Me.HitTest If ht < Me.m_selectionend Then Me.SelectionStart = ht Me.SelectionLength = Me.m_selectionend - ht Else Me.SelectionLength = Me.HitTest - Me.SelectionStart End If End If MyBase.OnMouseMove(e) End Sub ' Clickした文字のIndexを取得する Private Function HitTest() As Integer Dim p As Point = Me.PointToClient(Cursor.Position) ' 各部分文字列の幅を格納するList Dim lst As New List(Of Single) lst.Add(0) Using g As Graphics = Me.CreateGraphics For i As Integer = 1 To Me.Text.Length Dim ss As String = Me.Text.Substring(0, i) Dim sz As SizeF = g.MeasureString(ss, Me.Font) lst.Add(sz.Width - Me.Margin.Left) ' ← Me.Margin.Leftを引いているのは、苦し紛れ Next For i As Integer = 0 To Me.Text.Length - 1 If p.X <= (lst(i) + lst(i + 1)) / 2 Then ' この文字にヒットした Return i End If Next End Using ' ヒットしない場合は、後端のIndexを返す Return Me.Text.Length End Function End Class
分類:[.NET]
「DOBON.NET プログラミング道」の「フォーム内にフォームを表示する」を基に
した画面をVB2005で作成しています。
フォーム内に表示するフォーム(子フォーム)上にコンボボックス(DropDown)を
配置していますが、実行時にマウスでクリックしてもテキスト部分にカーソルが
移動しません。
タブでフォーカス移動するか、マウスでドロップダウンのリストを表示すると
テキスト入力部分にカーソルが設定され、編集できるようになります。
子フォーム上でも通常の動作をするような解決策はないでしょうか?