Перехват событий мышки
От: skydion  
Дата: 14.07.06 06:15
Оценка:
Привет всем.

Вот возник вопрос, а как перехватывать собитие MouseDoubleClick когда есть перехватчики на MouseClick, MouseDown, MouseUp? Выходит так что сначал сработает MouseDown и в MouseDoubleClick уже ничего не прийдет? Как побороть такую ситуацию?

Спасибо!
Re: Перехват событий мышки
От: DarkSid Россия  
Дата: 14.07.06 06:21
Оценка:
Здравствуйте, skydion, Вы писали:

S>Привет всем.


S>Вот возник вопрос, а как перехватывать собитие MouseDoubleClick когда есть перехватчики на MouseClick, MouseDown, MouseUp? Выходит так что сначал сработает MouseDown и в MouseDoubleClick уже ничего не прийдет? Как побороть такую ситуацию?


S>Спасибо!



private void textBox3_MouseDown(object sender, MouseEventArgs e)
{
textBox2.Text += "Down" + Environment.NewLine;
}

private void textBox3_MouseUp(object sender, MouseEventArgs e)
{
textBox2.Text += "Up" + Environment.NewLine;
}

private void textBox3_MouseClick(object sender, MouseEventArgs e)
{
textBox2.Text += "Click" + Environment.NewLine;
}

private void textBox3_MouseDoubleClick(object sender, MouseEventArgs e)
{
textBox2.Text += "DoubleClick" + Environment.NewLine;


Все работает
}
Re[2]: Перехват событий мышки
От: skydion  
Дата: 14.07.06 06:38
Оценка:
Здравствуйте, DarkSid, Вы писали:

DS>Здравствуйте, skydion, Вы писали:


S>>Привет всем.


S>>Вот возник вопрос, а как перехватывать собитие MouseDoubleClick когда есть перехватчики на MouseClick, MouseDown, MouseUp? Выходит так что сначал сработает MouseDown и в MouseDoubleClick уже ничего не прийдет? Как побороть такую ситуацию?


S>>Спасибо!



DS> private void textBox3_MouseDown(object sender, MouseEventArgs e)

DS> {
DS> textBox2.Text += "Down" + Environment.NewLine;
DS> }

DS> private void textBox3_MouseUp(object sender, MouseEventArgs e)

DS> {
DS> textBox2.Text += "Up" + Environment.NewLine;
DS> }

DS> private void textBox3_MouseClick(object sender, MouseEventArgs e)

DS> {
DS> textBox2.Text += "Click" + Environment.NewLine;
DS> }

DS> private void textBox3_MouseDoubleClick(object sender, MouseEventArgs e)

DS> {
DS> textBox2.Text += "DoubleClick" + Environment.NewLine;


DS>Все работает

DS> }


А у меня другая ситуация

Public Class Form1
Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
Debug.Print("Click")
End Sub

Private Sub Form1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDoubleClick
Debug.Print("DoubleClick")
End Sub

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
Debug.Print("Down")
End Sub

Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
Debug.Print("MouseUp")
End Sub
End Class

при щелчке кнопки выдает:

Down
Click
MouseUp


при двойном щелчке выдает:

Down
Click
MouseUp
Down
DoubleClick
MouseUp

это так вот как попасть прямо в MouseClick или MouseDoubleClick при этом не теряя возможности при необходимость попасть в MouseDown или MouseUp?
Re[3]: Перехват событий мышки
От: DarkSid Россия  
Дата: 14.07.06 06:47
Оценка:
S>при двойном щелчке выдает:

S>Down

S>Click
S>MouseUp
S>Down
S>DoubleClick
S>MouseUp

S>это так вот как попасть прямо в MouseClick или MouseDoubleClick при этом не теряя возможности при необходимость попасть в MouseDown или MouseUp?


Т.е по логике так
Click
Down
Up

или
DoubleClick
Down
Up

?
или я что-то не понял
Re[4]: Перехват событий мышки
От: skydion  
Дата: 14.07.06 06:51
Оценка:
Здравствуйте, DarkSid, Вы писали:



S>>при двойном щелчке выдает:


S>>Down

S>>Click
S>>MouseUp
S>>Down
S>>DoubleClick
S>>MouseUp

S>>это так вот как попасть прямо в или при этом не теряя возможности при необходимость попасть в MouseDown или MouseUp?


DS>Т.е по логике так

DS>Click
DS>Down
DS>Up

DS>или

DS>DoubleClick
DS>Down
DS>Up

DS>?

DS>или я что-то не понял

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

Возможно есть другие методы для выхода из такой ситуации?
Re[5]: Перехват событий мышки
От: DarkSid Россия  
Дата: 14.07.06 07:04
Оценка:
Здравствуйте, skydion, Вы писали:


S>Ну скажем так нужно прямое попадание в ети два события и выход из них.

S>Ну к примеру есть на екране элемент и он по MouseClick подсвечивается, а по MouseDoubleClick к примеру выводится проперти диалог для этого элемента. Элемент может быть каким угодно, контрол, линия на екране...

S>Возможно есть другие методы для выхода из такой ситуации?


private void textBox3_MouseDown(object sender, MouseEventArgs e)
{
if (e.Clicks == 5)
{
textBox2.Text += "Down" + Environment.NewLine;
}
if (e.Clicks == 7)
{
textBox2.Text += "Down2" + Environment.NewLine;
}
}

private void textBox3_MouseUp(object sender, MouseEventArgs e)
{
if (e.Clicks >= 3)
{
textBox2.Text += "Up" + Environment.NewLine;
}
}

private void textBox3_MouseClick(object sender, MouseEventArgs e)
{
textBox2.Text += "Click" + Environment.NewLine;
MouseEventArgs e1 = new MouseEventArgs(e.Button, 5, e.X, e.Y, e.Delta);
textBox3_MouseDown(sender,e1);
textBox3_MouseUp(sender,e1);
}

private void textBox3_MouseDoubleClick(object sender, MouseEventArgs e)
{
textBox2.Text += "DoubleClick" + Environment.NewLine;
MouseEventArgs e1 = new MouseEventArgs(e.Button, 7, e.X, e.Y, e.Delta);
textBox3_MouseDown(sender,e1);
textBox3_MouseUp(sender,e1);
}

?
Re: Перехват событий мышки
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 14.07.06 07:14
Оценка:
Здравствуйте, skydion, Вы писали:

S>Привет всем.


S>Вот возник вопрос, а как перехватывать собитие MouseDoubleClick когда есть перехватчики на MouseClick, MouseDown, MouseUp? Выходит так что сначал сработает MouseDown и в MouseDoubleClick уже ничего не прийдет? Как побороть такую ситуацию?


S>Спасибо!


If you want to handle mouse click events in the proper order, you need to know the order in which click events are raised in Windows Forms controls. All Windows Forms controls raise click events in the same order when a mouse button is pressed and released (regardless of which mouse button), except where noted in the following list for individual controls. The following list shows the order of events raised for a single mouse-button click:

  1. MouseDown event.
  2. Click event.
  3. MouseClick event.
  4. MouseUp event.

Following is the order of events raised for a double mouse-button click:

  1. MouseDown event.
  2. Click event.
  3. MouseClick event.
  4. MouseUp event.
  5. MouseDown event.
  6. DoubleClick event. (This can vary, depending on whether the control in question has the StandardDoubleClick style bit set to true. For more information about how to set a ControlStyles bit, see the SetStyle method.)
  7. MouseDoubleClick event.
  8. MouseUp event.


Как вариант можно вручную после каждого клика отмечать время нажания (DateTime.Now.Ticks) и при следующем клике отлавливать ситуацию, когда от предыдущего прошло меньше чем SystemInformation.DoubleClickTime, только тогда нужно ещё отслеживать, чтобы курсор сдвинулся не более, чем на SystemInformation.DoubleClickSize. Но это нужно только в очень специфических ситуациях.
Нужно носить в себе еще хаос, чтобы быть в состоянии родить танцующую звезду.
Re[6]: Перехват событий мышки
От: skydion  
Дата: 14.07.06 07:23
Оценка:
Здравствуйте, DarkSid, Вы писали:

DS>Здравствуйте, skydion, Вы писали:



S>>Ну скажем так нужно прямое попадание в ети два события и выход из них.

S>>Ну к примеру есть на екране элемент и он по MouseClick подсвечивается, а по MouseDoubleClick к примеру выводится проперти диалог для этого элемента. Элемент может быть каким угодно, контрол, линия на екране...

S>>Возможно есть другие методы для выхода из такой ситуации?


DS>private void textBox3_MouseDown(object sender, MouseEventArgs e)

DS> {
DS> if (e.Clicks == 5)
DS> {
DS> textBox2.Text += "Down" + Environment.NewLine;
DS> }
DS> if (e.Clicks == 7)
DS> {
DS> textBox2.Text += "Down2" + Environment.NewLine;
DS> }
DS> }

DS> private void textBox3_MouseUp(object sender, MouseEventArgs e)

DS> {
DS> if (e.Clicks >= 3)
DS> {
DS> textBox2.Text += "Up" + Environment.NewLine;
DS> }
DS> }

DS> private void textBox3_MouseClick(object sender, MouseEventArgs e)

DS> {
DS> textBox2.Text += "Click" + Environment.NewLine;
DS> MouseEventArgs e1 = new MouseEventArgs(e.Button, 5, e.X, e.Y, e.Delta);
DS> textBox3_MouseDown(sender,e1);
DS> textBox3_MouseUp(sender,e1);
DS> }

DS> private void textBox3_MouseDoubleClick(object sender, MouseEventArgs e)

DS> {
DS> textBox2.Text += "DoubleClick" + Environment.NewLine;
DS> MouseEventArgs e1 = new MouseEventArgs(e.Button, 7, e.X, e.Y, e.Delta);
DS> textBox3_MouseDown(sender,e1);
DS> textBox3_MouseUp(sender,e1);
DS> }

DS>?


Щас опробую такой вариант и отпишусь
Re[2]: Перехват событий мышки
От: skydion  
Дата: 14.07.06 07:27
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Здравствуйте, skydion, Вы писали:


S>>Привет всем.


S>>Вот возник вопрос, а как перехватывать собитие MouseDoubleClick когда есть перехватчики на MouseClick, MouseDown, MouseUp? Выходит так что сначал сработает MouseDown и в MouseDoubleClick уже ничего не прийдет? Как побороть такую ситуацию?


S>>Спасибо!


K>

K>If you want to handle mouse click events in the proper order, you need to know the order in which click events are raised in Windows Forms controls. All Windows Forms controls raise click events in the same order when a mouse button is pressed and released (regardless of which mouse button), except where noted in the following list for individual controls. The following list shows the order of events raised for a single mouse-button click:

K>

    K>
  1. MouseDown event.
    K>
  2. Click event.
    K>
  3. MouseClick event.
    K>
  4. MouseUp event.
    K>

K>Following is the order of events raised for a double mouse-button click:

K>
    K>
  1. MouseDown event.
    K>
  2. Click event.
    K>
  3. MouseClick event.
    K>
  4. MouseUp event.
    K>
  5. MouseDown event.
    K>
  6. DoubleClick event. (This can vary, depending on whether the control in question has the StandardDoubleClick style bit set to true. For more information about how to set a ControlStyles bit, see the SetStyle method.)
    K>
  7. MouseDoubleClick event.
    K>
  8. MouseUp event.
    K>


K>Как вариант можно вручную после каждого клика отмечать время нажания (DateTime.Now.Ticks) и при следующем клике отлавливать ситуацию, когда от предыдущего прошло меньше чем SystemInformation.DoubleClickTime, только тогда нужно ещё отслеживать, чтобы курсор сдвинулся не более, чем на SystemInformation.DoubleClickSize. Но это нужно только в очень специфических ситуациях.


А события отлавливать и анализироват дельта-время на срабатывание кнопок это в MouseDown?
А DoubleClick посылать тоже из MouseDown после прохождения условия на приемлемость дельта-время?
Re[2]: Перехват событий мышки
От: skydion  
Дата: 14.07.06 07:42
Оценка:
У меня из vb.net невозможно создать переменную e1...

MouseEventArgs e1 = new MouseEventArgs(e.Button, 7, e.X, e.Y, e.Delta)
Re[3]: Перехват событий мышки
От: skydion  
Дата: 14.07.06 07:49
Оценка:
Public Class Form1
Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
Debug.Print("Click")
Dim e1 As MouseEventArgs = New MouseEventArgs(e.Button, 5, e.X, e.Y, e.Delta)
'Form1_MouseDown(sender, e1)
'Form1_MouseUp(sender, e1)
End Sub

Private Sub Form1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDoubleClick
Debug.Print("DoubleClick")
'Dim e1 As MouseEventArgs = New MouseEventArgs(e.Button, 7, e.X, e.Y, e.Delta)
'Form1_MouseDown(sender, e1)
'Form1_MouseUp(sender, e1)
End Sub

Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
If (e.Clicks = 5) Then
Debug.Print("Down")
End If

If (e.Clicks = 7) Then
Debug.Print("Down")
End If
End Sub

Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
If (e.Clicks = 3) Then
Debug.Print("Up")
End If
End Sub
End Class

Если сделать так то при MouseDoubleClick мы всеравно попадаем в MouseClick
Re[3]: Перехват событий мышки
От: DarkSid Россия  
Дата: 14.07.06 07:52
Оценка:
Здравствуйте, skydion, Вы писали:

S>У меня из vb.net невозможно создать переменную e1...


S>MouseEventArgs e1 = new MouseEventArgs(e.Button, 7, e.X, e.Y, e.Delta)


Dim e1 As System.Windows.Forms.MouseEventArgs
e1 = New System.Windows.Forms.MouseEventArgs(e.Button, 10, e.X, e.Y, e.Delta)
TextBox1_MouseDown(sender, e1)
Re[4]: Перехват событий мышки
От: skydion  
Дата: 14.07.06 07:55
Оценка:
Здравствуйте, DarkSid, Вы писали:

DS>Здравствуйте, skydion, Вы писали:


S>>У меня из vb.net невозможно создать переменную e1...


S>>MouseEventArgs e1 = new MouseEventArgs(e.Button, 7, e.X, e.Y, e.Delta)


DS> Dim e1 As System.Windows.Forms.MouseEventArgs

DS> e1 = New System.Windows.Forms.MouseEventArgs(e.Button, 10, e.X, e.Y, e.Delta)
DS> TextBox1_MouseDown(sender, e1)

Да-да спасибо, я уже вспомнил, я просто не очень давно знаком с .НЕТ поэтому так вас и мучаю
Ну ниче, еще немного еще чуть-чуть!
Re[5]: Перехват событий мышки
От: DarkSid Россия  
Дата: 14.07.06 08:35
Оценка:
Здравствуйте, skydion, Вы писали:

S> Да-да спасибо, я уже вспомнил, я просто не очень давно знаком с .НЕТ поэтому так вас и мучаю

S>Ну ниче, еще немного еще чуть-чуть!
Кстати. правильно будет наложить обе идеи мои и konsoletyper.Из моей логику из его константы и логику.
Re[3]: Перехват событий мышки
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 14.07.06 08:45
Оценка:
Здравствуйте, skydion, Вы писали:

S>А события отлавливать и анализироват дельта-время на срабатывание кнопок это в MouseDown?


Нет, из MouseUp.

S>А DoubleClick посылать тоже из MouseDown после прохождения условия на приемлемость дельта-время?


Никакого DoubleClick посылать не нужно. Можно прямо в MouseUp обрабатывать. Только такой подход годится ну уж в очень специфических ситуациях, наример, при написании легковесных контролов. А так лучше пользоваться стандартными событиями — с ниминет никаких проблем. Если требуется отделить щелчок от двойного щелчка, то это следствие плохого дизайна.
Нужно носить в себе еще хаос, чтобы быть в состоянии родить танцующую звезду.
Re[4]: Перехват событий мышки
От: skydion  
Дата: 14.07.06 09:41
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>Никакого DoubleClick посылать не нужно. Можно прямо в MouseUp обрабатывать. Только такой подход годится ну уж в очень специфических ситуациях, наример, при написании легковесных контролов. А так лучше пользоваться стандартными событиями — с ниминет никаких проблем. Если требуется отделить щелчок от двойного щелчка, то это следствие плохого дизайна.


Возможно я туплю... но все же.


Public Class Form1
    Dim c As Integer
    Dim t1, t2 As Long
    Dim p1, p2 As Point
    Dim dx, dy As Long

    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
        Debug.Print("Click")
    End Sub

    Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
        Debug.Print("DoubleClick")
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Debug.Print("DoubleClickTime " & SystemInformation.DoubleClickTime)
        Debug.Print("DoubleClickSize[w,h] " & SystemInformation.DoubleClickSize.Width, SystemInformation.DoubleClickSize.Height)
    End Sub

    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
        'Debug.Print("Click")
        Debug.Print("MouseClick nclicks " & e.Clicks)
        t1 = DateTime.Now.Ticks
        p1 = New Point(e.X, e.Y)

        Debug.Print("MouseClick time " & t1)
        Debug.Print("MouseClick pos [x,y] " & p1.X & " " & p1.Y)
    End Sub

    Private Sub Form1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDoubleClick
        Debug.Print("MouseDoubleClick nclicks " & e.Clicks)
        t2 = DateTime.Now.Ticks
        Debug.Print("DoubleMouseClick time " & t2)
        Debug.Print("delta time " & Int((t2 - t1) / 10000))

        p2 = New Point(e.X, e.Y)
        Debug.Print("MouseDoubleClick pos [x,y] " & p2.X & " " & p2.Y)
        dx = (p2.X - p1.X)
        dy = (p2.Y - p1.Y)
        Debug.Print("delta pos[dx,dy] " & dx & " " & dy)
    End Sub

    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        c = e.Clicks

        If (c = 1) Then
            Debug.Print("Down before mouseclick")
        ElseIf (c = 2) Then
            Debug.Print("Down before mousedoubleclick")
        End If
    End Sub

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        If (c = 1) Then
            Debug.Print("Up after mouseclick")
        ElseIf (c = 2) Then
            Debug.Print("Up after mousedoubleclick")
        End If

        Debug.Print("")
    End Sub
End Class


Как видно всеравно перед MouseDoubleClick имеем MouseClick, что для меня не есть гуд.
Вот и возникает вопрос как независимо обработать MouseDoubleClick без вызова MouseClick?

Сделать только два события причем независимые? Возможно я странного хочу, но разобраться нужно.
Re[5]: Перехват событий мышки
От: DarkSid Россия  
Дата: 14.07.06 11:36
Оценка:
Здравствуйте, skydion, Вы писали:

S>Здравствуйте, konsoletyper, Вы писали:


K>>Никакого DoubleClick посылать не нужно. Можно прямо в MouseUp обрабатывать. Только такой подход годится ну уж в очень специфических ситуациях, наример, при написании легковесных контролов. А так лучше пользоваться стандартными событиями — с ниминет никаких проблем. Если требуется отделить щелчок от двойного щелчка, то это следствие плохого дизайна.


S>Возможно я туплю... но все же.


S>

S>Public Class Form1
S>    Dim c As Integer
S>    Dim t1, t2 As Long
S>    Dim p1, p2 As Point
S>    Dim dx, dy As Long

S>    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
S>        Debug.Print("Click")
S>    End Sub

S>    Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
S>        Debug.Print("DoubleClick")
S>    End Sub

S>    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
S>        Debug.Print("DoubleClickTime " & SystemInformation.DoubleClickTime)
S>        Debug.Print("DoubleClickSize[w,h] " & SystemInformation.DoubleClickSize.Width, SystemInformation.DoubleClickSize.Height)
S>    End Sub

S>    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
S>        'Debug.Print("Click")
S>        Debug.Print("MouseClick nclicks " & e.Clicks)
S>        t1 = DateTime.Now.Ticks
S>        p1 = New Point(e.X, e.Y)

S>        Debug.Print("MouseClick time " & t1)
S>        Debug.Print("MouseClick pos [x,y] " & p1.X & " " & p1.Y)
S>    End Sub

S>    Private Sub Form1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDoubleClick
S>        Debug.Print("MouseDoubleClick nclicks " & e.Clicks)
S>        t2 = DateTime.Now.Ticks
S>        Debug.Print("DoubleMouseClick time " & t2)
S>        Debug.Print("delta time " & Int((t2 - t1) / 10000))

S>        p2 = New Point(e.X, e.Y)
S>        Debug.Print("MouseDoubleClick pos [x,y] " & p2.X & " " & p2.Y)
S>        dx = (p2.X - p1.X)
S>        dy = (p2.Y - p1.Y)
S>        Debug.Print("delta pos[dx,dy] " & dx & " " & dy)
S>    End Sub

S>    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
S>        c = e.Clicks

S>        If (c = 1) Then
S>            Debug.Print("Down before mouseclick")
S>        ElseIf (c = 2) Then
S>            Debug.Print("Down before mousedoubleclick")
S>        End If
S>    End Sub

S>    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
S>        If (c = 1) Then
S>            Debug.Print("Up after mouseclick")
S>        ElseIf (c = 2) Then
S>            Debug.Print("Up after mousedoubleclick")
S>        End If

S>        Debug.Print("")
S>    End Sub
S>End Class

S>


S>Как видно всеравно перед MouseDoubleClick имеем MouseClick, что для меня не есть гуд.

S>Вот и возникает вопрос как независимо обработать MouseDoubleClick без вызова MouseClick?

S>Сделать только два события причем независимые? Возможно я странного хочу, но разобраться нужно.


Private _bDoubleClick As Boolean


Private Sub TextBox1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseClick
Dim i1 As Long
Dim i As Long
_bDoubleClick = False

i1 = DateTime.Now.Ticks + 2 * SystemInformation.DoubleClickTime
For i = DateTime.Now.Ticks To i1
If _bDoubleClick Then
Exit Sub
End If
i = DateTime.Now.Ticks
Next
Debug.Print("Click")
End Sub

Private Sub TextBox1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDoubleClick
_bDoubleClick = True
Debug.Print("DoubleClick")
End Sub

ЭТО НУЖНО?????????????
Re[5]: Перехват событий мышки
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 14.07.06 12:46
Оценка:
Здравствуйте, skydion, Вы писали:

S>Возможно я туплю... но все же.


S>

S>Public Class Form1
S>    Dim c As Integer
S>    Dim t1, t2 As Long
S>    Dim p1, p2 As Point
S>    Dim dx, dy As Long

S>    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
S>        Debug.Print("Click")
S>    End Sub

S>    Private Sub Form1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
S>        Debug.Print("DoubleClick")
S>    End Sub

S>    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
S>        Debug.Print("DoubleClickTime " & SystemInformation.DoubleClickTime)
S>        Debug.Print("DoubleClickSize[w,h] " & SystemInformation.DoubleClickSize.Width, SystemInformation.DoubleClickSize.Height)
S>    End Sub

S>    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
S>        'Debug.Print("Click")
S>        Debug.Print("MouseClick nclicks " & e.Clicks)
S>        t1 = DateTime.Now.Ticks
S>        p1 = New Point(e.X, e.Y)

S>        Debug.Print("MouseClick time " & t1)
S>        Debug.Print("MouseClick pos [x,y] " & p1.X & " " & p1.Y)
S>    End Sub

S>    Private Sub Form1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDoubleClick
S>        Debug.Print("MouseDoubleClick nclicks " & e.Clicks)
S>        t2 = DateTime.Now.Ticks
S>        Debug.Print("DoubleMouseClick time " & t2)
S>        Debug.Print("delta time " & Int((t2 - t1) / 10000))

S>        p2 = New Point(e.X, e.Y)
S>        Debug.Print("MouseDoubleClick pos [x,y] " & p2.X & " " & p2.Y)
S>        dx = (p2.X - p1.X)
S>        dy = (p2.Y - p1.Y)
S>        Debug.Print("delta pos[dx,dy] " & dx & " " & dy)
S>    End Sub

S>    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
S>        c = e.Clicks

S>        If (c = 1) Then
S>            Debug.Print("Down before mouseclick")
S>        ElseIf (c = 2) Then
S>            Debug.Print("Down before mousedoubleclick")
S>        End If
S>    End Sub

S>    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
S>        If (c = 1) Then
S>            Debug.Print("Up after mouseclick")
S>        ElseIf (c = 2) Then
S>            Debug.Print("Up after mousedoubleclick")
S>        End If

S>        Debug.Print("")
S>    End Sub
S>End Class

S>


Здесь ошибка. Нужно переименовать t1 в t, p1 в pt, убрать t1, t2, p2, dx, dy, и сделать так:

Private Sub Form1_MouseUp(ByVal sender As Object, _
        ByVal e As MouseEventArgs) Handles Me.MouseClick
    Dim elapsed as Long
    Dim dx as Integer
    Dim dy as Integer
    ' DateTime.Now.Ticks даёт время в 100 наносекундных интервалах
    elapsed = (DateTime.Now.Ticks - t) \ 10000
    dx = e.X - pt.X
    dy = e.Y - pt.Y
    If (dx < SystemInforation.DoubleClickSize.Width) And _
        (dy < SystemInformation.DoubleClickSize.Height) And _
        (elapsed < SystemInformation.DoubleClickTime) Then
        Debug.Print("Double Click")
    Else
        Debug.Print("Click")
    End If
End Sub


Тут, правда, есть маленькие тонкости, но я для наглядности не стал их приводить.

Есть экзотические ситуации. Например, если щёлкнуть по надписи ярлыка дважды, то он откроется. Если щёлкнуть один раз, то начинается редактирование. Причём сразу понять, был ли один щёлчок, невозможно. Поэтому редактирование начинается через некоторое время. Чтобы повторить такое поведение, нужно в процедуре обработки щелчка завести таймер на SystemInformation.DoubleClickTime, и запустить его, но ничего не делать больше. В процедуре обработки таймера вызываем метод, обрабатывающий однократный клик, затем останавливаем таймер. В процедуре обработки двойного щелчка останавливаем таймер. Я понимаю, что написано непонятно, но лучше не придумал. Надеюсь, после внимательного вчитывания всё станет ясно.

Для обычной же ситуации, типа пользователь по клику выделяет значок, по двойному запускает, достаточно типовой обработки Click/DoubleClick.

Уже не первый раз пишу, что очень полезно обращаться к MSDN. Там много всего интересного написано.
Нужно носить в себе еще хаос, чтобы быть в состоянии родить танцующую звезду.
Re[6]: Перехват событий мышки
От: Аноним  
Дата: 14.07.06 14:50
Оценка:
Здравствуйте, konsoletyper, Вы писали:


K>Здесь ошибка. Нужно переименовать t1 в t, p1 в pt, убрать t1, t2, p2, dx, dy, и сделать так:


K>
K>Private Sub Form1_MouseUp(ByVal sender As Object, _
K>        ByVal e As MouseEventArgs) Handles Me.MouseClick
K>    Dim elapsed as Long
K>    Dim dx as Integer
K>    Dim dy as Integer
K>    ' DateTime.Now.Ticks даёт время в 100 наносекундных интервалах
K>    elapsed = (DateTime.Now.Ticks - t) \ 10000
K>    dx = e.X - pt.X
K>    dy = e.Y - pt.Y
K>    If (dx < SystemInforation.DoubleClickSize.Width) And _
K>        (dy < SystemInformation.DoubleClickSize.Height) And _
K>        (elapsed < SystemInformation.DoubleClickTime) Then
K>        Debug.Print("Double Click")
K>    Else
K>        Debug.Print("Click")
K>    End If
K>End Sub
K>


Спасибо!
За подробний ответ и Ваше время
А я еще над архитектурой посижу... что-то есть в Вашем замечании.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.