如何防止双击“打开文件”对话框来注册对它下面的表单的单击?

问题描述 投票:10回答:4

我有一个自定义控件,它实质上是一个绘图画布,还有一个使用它来编辑文件的程序。但是,当打开一个新文件时,可能会发生一些非常奇怪的事情。

如果用户在“打开文件”对话框(标准TOpenDialog控件)中双击文件,而不是选择一个项目并单击ENTER,则下面的画布会注册一个click事件,并最终在该画布上执行绘制操作。加载完成后立即将光标置于位置。

显然,这不是预期的行为。我之前注意到,当您双击鼠标时,双击消息会在第二次单击消息之前到达。我认为对话框可能已从双击关闭,然后第二次单击消息到达并发送到适当坐标处的任何位置,因为它消失了。

我有什么方法可以使此停止发生?我不能告诉我的代码“加载后,只吃下一次单击”,因为它可能是用“ ENTER”键打开的,然后会错过第一次合法的单击。谁能想到一种更好的方法来解决这个问题? (使用Windows 7,以防万一。)

windows delphi click messages double-click
4个回答
7
投票

[如果出现“第二次点击消息”,则说明有问题。 (一方面,Windows没有“单击”消息,只有向上和向下鼠标消息。)A double click goes like this:向下,鼠标向上,双击,向上鼠标。该对话框在双击消息和第二个鼠标上移消息之间消失。如果您的控件收到鼠标悬停消息并将其视为完整单击,则说明问题所在,您需要停止;单击始终是鼠标按下和鼠标按下消息的pair。如果您没有两者都获得,则不是单击。


1
投票

实际上,这是在图片框上触发的第二个鼠标上移事件,它导致事件处理程序调用。这似乎是一个OpenFileDialog错误。需要添加对IsMouseCaptured的鼠标上移事件的检查,单击一次是鼠标下移和鼠标上移,而不仅仅是鼠标上移。


1
投票

我以这种方式解决了它(当然是一种变通方法):

    CFileDialog my_file_dialog(...);
    if ( my_file_dialog.DoModal()!=IDOK )
        return;

    CString fileName= my_file_dialog.GetPathName();

    //...

    CSelectItemsDlg dlg;


    // Avoid that the double-click on the CFileDialog sends the WM_LBUTTONUP message to the next window causing the Unselect of an item that is under the mouse cursor.
    // http://www.experts-exchange.com/Programming/System/Windows__Programming/Q_10287063.html#a2476475
    MSG msg;
    while(PeekMessage(&msg,0,WM_LBUTTONUP,WM_LBUTTONUP,PM_REMOVE));

    int DoModalRes = dlg.DoModal();

而且您可以相信我在老板的脸上露出了灿烂的笑容:)


0
投票
Private IsMouseDown As Boolean
Private Sub picNenIn_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles picNenIn.MouseDown
    IsMouseDown = True
    'Code
End Sub
Private Sub picNenIn_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles picNenIn.MouseMove
    If IsMouseDown Then
        'Code
    End If
End Sub
Private Sub picNenIn_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles picNenIn.MouseUp
    IsMouseDown = False
    'Code
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.