How do I prevent a double-click on an Open File dialog from registering a click on the form under it?
我有一个自定义控件,它本质上是一个绘图画布,以及一个使用它来编辑文件的程序。但是,当打开一个新文件时,可能会发生一些非常奇怪的事情。
如果用户在打开文件对话框(标准 TOpenDialog 控件)中双击文件,而不是选择一个项目并点击 ENTER,则下方的画布会注册一个单击事件并最终在加载完成后光标的位置。
显然,这不是预期的行为。我之前注意到,当您双击鼠标时,双击消息在第二次单击消息之前到达。我认为对话框可能会从双击关闭,然后第二次点击消息到达并被发送到适当坐标的任何地方,因为它已经消失了。
有什么办法可以阻止这种情况发生吗?我不能告诉我的代码”加载后,只吃下一次点击”,因为它可以用 \\’ENTER\\’ 键打开,然后它会错过第一次合法点击。谁能想到更好的方法来处理这个问题? (使用 Windows 7,以防万一。)
- 我猜你想要两个对话框的解决方案,XP 一个和 Vista 一个。
- 任何重复的代码示例的机会?不注册对具有空项目的表单的单击。
- 我在 Windows 7 上始终如一地看到它。(也许不同的操作系统会有所不同?)
如果出现”第二次点击消息”,则说明有问题。 (一方面,Windows 没有”单击”消息,只有鼠标向上和鼠标向下消息。)双击是这样的:鼠标向下,鼠标向上,双击,鼠标向上。对话框在双击消息和第二个鼠标向上消息之间消失。如果您的控件收到鼠标向上消息并将其视为完全单击,则说明了问题,您需要停止;单击始终是一对鼠标按下和鼠标按下消息。如果两者都没有,那就不是点击。
- 这个问题看起来好像控件实际上是在捕捉鼠标而不是点击(我的意思是,好像它被设置为捕捉前者而不是后者)。
- 完美的!是的,我在 Down 事件触发的方法上使用标志解决了问题。仅当真正单击图片框时才会触发向下事件: private void pictureBox1_MouseD(object sender, MouseEventArgs e) { picturebox_sel_clicked = true; Console.WriteLine(“D”); }
我就是这样解决的(这当然是一种变通方法):
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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. int DoModalRes = dlg.DoModal(); |
而且你可以相信我的老板脸上露出了灿烂的笑容:)
事实上,它是在图片框上触发了第二个鼠标上移事件,这导致了事件处理程序的调用。这似乎是一个 OpenFileDialog 错误。需要为鼠标向上事件添加对 IsMouseCaptured 的检查,单击是鼠标向下和鼠标向上,而不仅仅是鼠标向上。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 |
来源:https://www.codenong.com/14679207/