Создание полосы выбираемых букв для формы - PullRequest
1 голос
/ 01 декабря 2008

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

Приветствия

Ответы [ 3 ]

1 голос
/ 01 декабря 2008

Вы можете использовать FlowLayoutPanel и цикл следующим образом:

private void button1_Click(object sender, EventArgs e)
{
  flowLayoutPanel1.FlowDirection = FlowDirection.LeftToRight;
  flowLayoutPanel1.AutoSize = true;
  flowLayoutPanel1.WrapContents = false; //or true, whichever you like
  flowLayoutPanel1.Controls.Clear();

  for (char c = 'A'; c <= 'Z'; c++)
  {
    Label letter = new Label();
    letter.Text = c.ToString();
    letter.AutoSize = true;
    letter.Click += new EventHandler(letter_Click);
    flowLayoutPanel1.Controls.Add(letter);

  }
}

private void letter_Click(object sender, EventArgs e)
{
  MessageBox.Show("You clicked on " + ((Label)sender).Text);
}
1 голос
/ 01 декабря 2008

Это «динамический путь», в котором я бы сделал это. Я знаю, что вы просили другие умные способы сделать это, но я думаю, что это наиболее приемлемый способ сделать это. Это произведет те кнопки и добавит обработчик щелчка, который принимает кнопку как отправителя. Также будет видно, что расположение кнопок переносится, если находится за пределами ширины формы.

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim ButtonSize As New Size(20, 20)
    Dim ButtonLocation As New Point(10, 20)

    For p As Integer = Asc("A") To Asc("Z")
        Dim newButton As New Button            
        If ButtonLocation.X + ButtonSize.Width > Me.Width Then
            ButtonLocation.X = 10
            ButtonLocation.Y += ButtonSize.Height
        End If
        newButton.Size = ButtonSize
        newButton.Location = ButtonLocation
        newButton.Text = Chr(p)
        ButtonLocation.X += newButton.Width + 5
        AddHandler newButton.Click, AddressOf ButtonClicked
        Me.Controls.Add(newButton)
    Next

    End Sub

    Sub ButtonClicked(ByVal sender As Object, ByVal e As System.EventArgs)
        MsgBox(CType(sender, Button).Text)
    End Sub
End Class

альтернативный текст http://img235.imageshack.us/img235/2267/testoa6.jpg

0 голосов
/ 01 декабря 2008

Нарисуйте строку в элементе управления, затем сопоставьте щелчки мыши с позициями символов в форме. На самом деле это проще, чем кажется (это адаптировано из стандартной документации по MeasureCharacterRanges, что упрощает задачу entrire). Пример нарисован на форме, было бы достаточно просто превратить его в пользовательский элемент управления.

В этом примере нажатие на букву вызовет появление окна сообщения с сообщением, какое письмо вы только что нажали.

Надеюсь, это поможет.

P.S. Пожалуйста, прости "магические числа", например. «зная», что в массиве будет 25 элементов, это всего лишь пример:)

Public Class Form1

    Const LETTERS As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Private letterRects(25) As System.Drawing.RectangleF
    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
        Dim index As Integer = -1
        Dim mouseP As Point = Me.PointToClient(MousePosition)
        For i As Integer = 0 To 25
            If letterRects(i).Contains(mouseP.X, mouseP.Y) Then
                index = i
                Exit For
            End If
        Next
        If index >= 0 Then
            MessageBox.Show("Letter = " + LETTERS(index).ToString())
        End If
    End Sub

    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        ' Set up string.
        Dim stringFont As New Font("Times New Roman", 16.0F)

        ' Set character ranges 
        Dim characterRanges(26) As CharacterRange
        For i As Integer = 0 To 25
            characterRanges(i) = New CharacterRange(i, 1)
        Next

        ' Create rectangle for layout, measurements below are not exact, these are "magic numbers"
        Dim x As Single = 50.0F
        Dim y As Single = 50.0F
        Dim width As Single = 400.0F 
        Dim height As Single = 40.0F
        Dim layoutRect As New RectangleF(x, y, width, height)

        ' Set string format.
        Dim stringFormat As New StringFormat
        stringFormat.FormatFlags = StringFormatFlags.FitBlackBox
        stringFormat.SetMeasurableCharacterRanges(characterRanges)

        ' Draw string to screen.
        e.Graphics.DrawString(letters, stringFont, Brushes.Black, _
        x, y, stringFormat)
        Dim stringRegions() As [Region]
        ' Measure two ranges in string.
        stringRegions = e.Graphics.MeasureCharacterRanges(letters, _
        stringFont, layoutRect, stringFormat)
        For i As Integer = 0 To 25
            letterRects(i) = stringRegions(i).GetBounds(e.Graphics)
        Next
    End Sub
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...