12

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

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

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

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

4

4 回答 4

7

如果出现“第二次点击消息”,则说明有问题。(一方面,Windows 没有“单击”消息,只有鼠标向上和鼠标向下消息。)双击是这样的:鼠标向下,鼠标向上,双击,鼠标向上。对话框在双击消息和第二个鼠标向上消息之间消失。如果您的控件收到鼠标向上消息并将其视为完全单击,则说明了问题,您需要停止;单击始终是一对鼠标按下和鼠标按下消息。如果你还没有得到两者,那么它不是一个点击。

于 2013-02-04T04:51:05.843 回答
1

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

于 2013-05-24T09:10:19.637 回答
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();

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

于 2013-11-13T10:32:57.673 回答
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
于 2020-04-11T04:35:35.437 回答