如何防止双击“打开文件”对话框,在其下面的表单上注册单击?

时间:2013-02-04 01:10:12

标签: windows delphi click messages double-click

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

如果用户双击“打开文件”对话框(标准TOpenDialog控件)中的文件而不是选择项目并点击ENTER,则下方的画布会注册单击事件并最终执行加载完成后,光标位置的绘制动作。

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

有什么方法可以让这个停止发生吗?我无法告诉我的代码“加载后,只需吃下一次点击”,因为它可能已经用“ENTER”键打开,然后它将错过第一次合法点击。谁能想到更好的方法来处理这个问题? (使用Windows 7,以防它有所作为。)

4 个答案:

答案 0 :(得分:7)

如果有“第二次点击消息”,则表示出现了问题。 (首先,Windows没有“点击”消息,只有鼠标按下和鼠标按下消息。)A double click goes like this:鼠标按下,鼠标按下,双击,鼠标按下。对话框在双击消息和第二个鼠标消息之间消失。如果您的控件收到鼠标注射消息并将其视为完整点击,那么这就解释了问题,您需要停止;单击始终是鼠标按下和鼠标按下消息的。如果你还没有得到这两个,那就不是点击了。

答案 1 :(得分:1)

实际上,它是第二个鼠标悬停事件在图片框上被触发,这导致事件处理程序调用。这似乎是一个OpenFileDialog错误。需要为鼠标注册事件添加IsMouseCaptured的检查,只需单击鼠标按下鼠标,然后单击鼠标即可。

答案 2 :(得分: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();

你可以相信我已经在我老板的脸上露出灿烂的笑容:)

答案 3 :(得分: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