首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可点击控制内拖放控制

可点击控制内拖放控制
EN

Stack Overflow用户
提问于 2013-06-19 09:46:28
回答 1查看 98关注 0票数 0

我有一个可拖动的控件(A),里面有一个按钮。A中还有其他控件,即按钮不填充A。

为了管理拖动功能,控件(A)捕获任何MouseDown事件。稍后,它将根据鼠标移动的距离来决定是否启动拖动。

如果单击了按钮,然后在拖动启动之前接收到一个MouseUp事件,我希望该按钮的Click事件启动。

目前,这还没有发生,因为MouseUp事件是由父控件(A)捕获的。我可以在A上实现功能来手动处理这个问题:

代码语言:javascript
复制
private void MouseUp(object sender, MouseEventArgs e) {
    if (DragHasStarted) {
        DealWithDrag();
    }
    else {
        DelegateToChildControls();
    }
}

但是,这很复杂,而且扩展得不太好,因为DelegateToChildControls需要计算出要委派给哪个子节点。

如果父控件不处理MouseUp事件,是否有一种方法可以让Windows处理这个问题并直接调用按钮的Click方法?

编辑-关于事件序列的更多细节:

单击按钮时,我会看到以下事件序列:

  1. 按钮上的MouseDown
  2. 按钮上的MouseDown (拖动处理程序)
  3. 我把这个转发给按钮的父级
  4. 父程序上的MouseDown (拖动处理程序)
  5. 父程序捕获的鼠标(拖动处理程序)
  6. 关于父母的MouseUp
  7. 末端拖动(拖动处理程序)

我从来没有在按钮上看到过MouseUp事件。

EN

回答 1

Stack Overflow用户

发布于 2013-06-19 11:28:50

我不知道您使用什么样的Control作为容器,因为我已经用UserControl进行了测试,我可以与UserControl的所有子级交互,但是如果您只想单击这些子容器,我有以下解决方案:

代码语言:javascript
复制
[DllImport("user32")]
private static extern IntPtr WindowFromPoint(POINT point);
[DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);
struct POINT
{
  public int x, y;
}
private void MouseUp(object sender, MouseEventArgs e){
   if(DragHasStarted){
      DealWithDrag();
   }
   else {
      Point screenLocation = PointToScreen(e.Location);
      IntPtr childHandle = WindowFromPoint(new POINT{x=screenLocation.X,y=screenLocation.Y });
      if(childHandle != IntPtr.Zero){
         SendMessage(childHandle, 0x201, IntPtr.Zero, IntPtr.Zero);
         SendMessage(childHandle, 0x202, IntPtr.Zero, IntPtr.Zero);
      }
   }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17188074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档