处理 ListView 中的 MouseMove、MouseDown、MouseUp 事件以拖动无边框表单

2024-03-30

我在用着MouseMove, MouseUp, MouseDown移动无边界表单的事件(如此处的示例)。

它工作得很好,但对于 ListView,只有当我单击列表中的项目(其文本)时它才有效。如果我单击不包含项目的 ListView 的空间,它将不起作用。

有可能解决这个问题的方法吗?

private bool mouseDown;
private Point lastLocation;

private void ListView1_MouseDown(object sender, MouseEventArgs e)
{
    mouseDown = true;
    lastLocation = e.Location;
}

private void ListView1_MouseMove(object sender, MouseEventArgs e)
{
    if(mouseDown)
    {
        this.Location = new Point(
            (this.Location.X - lastLocation.X) + e.X, (this.Location.Y - lastLocation.Y) + e.Y);

        this.Update();
    }
}

private void ListView1_MouseUp(object sender, MouseEventArgs e)
{
    mouseDown = false;
}

要移动表单,单击并拖动任何控件,您可以实现IMessageFilter接口 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.imessagefilter。您将在消息发送到目标控件之前收到消息(可以选择抑制它们,返回true).
实施要求您实施预过滤消息 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.imessagefilter.prefiltermessage.

当消息出现时存储当前鼠标位置WM_LBUTTONDOWN并在表格出现时移动表格WM_MOUSEMOVE,如果仍然按下左侧按钮(当前按下的按钮在WParam,请参阅有关此的文档)。

Use 应用程序.AddMessageFilter https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.application.addmessagefilter注册实现该接口的类(在本例中为表单本身)。在这里,它被称为OnHandleCreated.
Call 应用程序.删除消息过滤器 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.application.removemessagefilter取下过滤器。在这里,请来了OnHandleDestroyed.

请注意,我已经使用过Capture = true; in WM_MOUSEMOVE,因此按下鼠标左键并拖动(例如,按钮控件)不会导致(在本例中)单击事件。
如果您不喜欢它,请修改它。

笔记: 正如 Reza Aghaei 建议的那样,如果您将 ListView 设置为MultiSelect = false,然后您可以单击其上的任意位置来拖动表单。

public partial class SomeForm : Form, IMessageFilter
{
    private const int WM_MOUSEMOVE = 0x0200;
    private const int WM_LBUTTONDOWN = 0x0201;

    Point mouseDownPos = Point.Empty;

    public bool PreFilterMessage(ref Message m) {
        switch (m.Msg) {
            case WM_LBUTTONDOWN:
                mouseDownPos = PointToClient(MousePosition);
                break;
            case WM_MOUSEMOVE:
                if ((m.WParam.ToInt32() & 1) != 1) break; 
                Capture = true;
                var p = PointToClient(MousePosition);
                Location = new Point(Left + p.X - mouseDownPos.X, Top + p.Y - mouseDownPos.Y);
                break;
        }
        return false;
    }

    protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
        if (!DesignMode) Application.AddMessageFilter(this);
    }

    protected override void OnHandleDestroyed(EventArgs e) {
        if (!DesignMode) Application.RemoveMessageFilter(this);
        base.OnHandleDestroyed(e);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理 ListView 中的 MouseMove、MouseDown、MouseUp 事件以拖动无边框表单 的相关文章

  • 轮廓积分算法 C++

    我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分 对于初学者来说 我想为梯形方法编写一个算法 但我有点坚持理解它会是什么样子 毕竟 我们通常将梯形方法视为 2D 图 而这里我们有 f C gt C 所以我们谈论的是 4D 最终我希望用
  • C# 委托实例化与仅传递方法引用 [重复]

    这个问题在这里已经有答案了 我有一个简单的问题 与仅传递函数引用相比 实例化 C 委托有什么优势 我的意思是 Why do Thread t new Thread new ThreadStart SomeObject SomeMethod
  • 使用 boost::asio 是否有一种可移植的方法来查找空闲端口号

    我目前正在尝试找出一种方法来查找空闲端口号以建立连接 最好使用 boost asio 然后 该端口号将用于侦听 只有这样我才能打开套接字 大致来说 有没有办法做到 tcp resolver query query localhost por
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 如何使用“std::array”作为“template class”形式的模板参数?

    请考虑以下事项tree class template
  • boost变体简单调用常用方法

    我有两个指针 只能设置其中之一 所以我正在考虑使用 boost variant 例如 boost variant
  • System.NotSupportedException:“集合是只读的。”从 iList 中删除对象时抛出

    运行下面的代码片段时抛出异常 我有一个 iListof webelements 如果该元素包含字符串 WSC 我想将其从 iList 中删除 谁能帮我吗 代码如下 IList
  • 将私有部分保留在 C++ 标头之外:纯虚拟基类与 pimpl

    我最近从 Java 和 Ruby 切换回 C 令我惊讶的是 当我更改私有方法的方法签名时 我必须重新编译使用公共接口的文件 因为私有部分也位于 h 文件中 我很快想出了一个解决方案 我想这对于 Java 程序员来说是典型的 接口 纯虚拟基类
  • 从动态服务器中抓取 html 列表数据

    哈喽大家好 抱歉提出转储问题 这是我最后的手段 我发誓我尝试了无数其他 Stackoverflow 问题 不同的框架等 但这些似乎没有帮助 我有以下问题 一个网站显示一个数据列表 前面有大量的 div li span 等标签 它是一个很大的
  • 在 WiX 中轻量运行时,DefaultDir 无效

    我只是想做一个安装程序 将一些文件移动到程序文件中 设置开始菜单链接 并出现在要卸载的添加 删除程序中 目前我很乐意点击开始菜单链接 因为这看起来相对简单 需要注意的是 我特别希望可以通过脚本构建它without任何类型的全局安装 这意味着
  • 尝试加载自定义配置时,Visual Studio 安装和部署项目中出现 FileNotFoundException

    我试图在我的设置和部署项目中调用自定义操作来更新我的应用程序上的 app config 中的某些项目 我已经以通常的方式完成了自定义配置部分 例如 ConfigurationProperty serviceProvider IsRequir
  • OpenCV:处理每一帧

    我想使用 OpenCV 编写一个跨平台应用程序进行视频捕获 在所有示例中 我发现来自相机的帧是使用抓取功能进行处理并等待一段时间 我想处理序列中的每一帧 我想定义自己的回调函数 每次当一个新帧准备好处理时都会执行该函数 例如直播对于 Win
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • 如何使用 MVVM 更改数据网格或列表视图中的内容

    我有一个 MainWindowViewModel DataContext 它公开不同的 ObservableCollections 带有 INotifyProperty 的 poco 对象的视图模型 从组合框中选择一个值后 我想单击一个加载
  • 如何在 OpenCV 中删除 mouseCallback

    在使用 C 的 OpenCV 中 有没有办法删除 mouseHandler int event int x int y int flags void param 通过函数添加到窗口 image window cv setMouseCallb
  • System.IndexOutOfRangeException:索引超出了数组的范围[重复]

    这个问题在这里已经有答案了 我正在开发一个 ATM 软件作为家庭作业 我想知道今天处理的交易总量 为此我编写了以下代码 public decimal getDayTransaction int accountid string date s
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 隐式类型转换 - 编译器错误

    这个问题与this https stackoverflow com questions 3529449 can i make the ternary operator treat my class like a bool问题 下面的代码在V
  • C++ 从文件中读取字符串

    我试图将字符串直接存储到一个文件中 以便稍后在 C 中读取 基本上 对于整个范围 我试图将带有字符串变量的对象数组存储在文件中 并且这些字符串变量将通过类似 object 的内容读取 0 字符串 然而 每次我尝试读取字符串变量时 系统都会给
  • wpf中的图像问题(图像不显示)

    我不明白为什么我无法在 WPF 中显示图像 也许我不小心修改了我的资源文件夹 这就是我没有显示的原因 所以我创建了一个新的 wpf 应用程序 我有这个 当我运行该程序时 我的图片显示为 为什么当我尝试在程序中执行相同的操作时 图像没有显示

随机推荐

  • 在struts 2对话框中显示错误消息?

    我在 Struts 2 中有一个登录表单 其中包含用户名和密码字段 我想要的是当用户提交表单时 如果它不是有效用户 我想在对话框中显示错误消息 而不是在登录表单本身中显示错误消息 struts 2 中是否有可用的标签 或者有 人可以向我指出
  • Play Framework——向类路径添加新目录

    我希望能够有一个单独的目录 可以将代表插件的 jar 文件添加到 Play 2 0 项目中 Jar 文件通常保存在 Play 中的 lib 目录下 我想将我的 jar 放在一个名为 plugins 的目录中 这个问题之前被问过 但建议是只使
  • 在 Java 和 C# 中计算 SHA-1 哈希值

    在 Java 和 C 中计算 SHA 1 哈希值 我正在尝试在 C 应用程序中复制 Java 应用程序的逻辑 其中一部分涉及生成密码的 SHA 1 哈希值 不幸的是我无法从 Java 和 C 获得相同的结果 C Output 64 0a b
  • NotImplementedError:frozendict 不支持“更新” - Odoo v8

    我的 Odoo v8 模块上有以下代码 api multi def button generate wh doc self context self context partner self env res partner res for
  • 使用多个 log4net 文件记录器

    我有文件附加器 FileA FileB 和 FileC 我将 FileA 添加到根元素 因为我希望它成为一个包罗万象的元素 下面将详细介绍 我将 FileB 和 FileC 用于特定消息 并为每个附加程序创建命名记录器 在代码中 我加载用于
  • 为什么使用预编译头(C/C++)?

    为什么要使用预编译头 读了这些回复 我怀疑我对它们所做的事情有点愚蠢 pragma once Defines used for production versions ifndef PRODUCTION define eMsg x x Sh
  • 找不到 microsoft.sqlserver.batchparser.dll

    我编写了一个 asp net Web 应用程序 它使用 SMO 针对 SQL Server 2008 来运行一些数据库脚本 它引用这些程序集 位于 C Program Files Microsoft SQL Server 100 SDK A
  • qt5中MainWindow是用自身初始化的吗?

    我尝试学习 qt 5 但不明白一件事 Qt Creator 默认创建这两个文件 主窗口 h ifndef MAINWINDOW H define MAINWINDOW H include
  • 在 Laravel 迁移中向现有表添加新列

    我想在现有表中添加一些新列users在拉拉维尔 我已经用谷歌搜索了这一点 并在这些搜索之后我已经使用命令创建了迁移php artisan make migration add columns to users add columns to
  • 为什么 Swing 线程模型被认为是错误的?应该如何理解? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我多次听说 Java Swing 线
  • 使用图像映射创建不规则形状的 HTML 链接?

    我必须创建这种奇怪的蜂窝式导航 理想情况下 当用户悬停在每个 蜂窝 上时 它会改变颜色 也许是透明的橙色覆盖物或其他东西 我做了一个有点工作的 JS Fiddle 但不知道如何突出显示悬停时的形状 我已经很长时间没有看到使用图像映射了 但这
  • 如何取消设置嵌套 foreach 中的每个数组?

    我有一段多维数组输出 如下所示 Array 0 gt Array item gt null count gt 0 child gt Array Dagadu Bocah gt Array item gt Dagadu Bocah count
  • 如何在 adb (android) 中使用 Bash 而不是 Shell?

    我目前正在使用 adb 终端访问我的数据库文件 但是 我只能使用以下命令访问终端 adb shell 我想从 sh 切换到 bash 因为它对于某些快捷方式来说更方便 我怎么做 我不认为 adb 有 bash 选项 如果你输入adb hel
  • 如何使用 Apache Poi 在折线图中设置轴标签

    我正在尝试使用 java 和 Apache POI 自动创建报告 我快要完成了 但找不到如何在 XSSFChart 中设置轴标签 我已经找到了如何设置图表的标题 Apache POI 设置 Excel 图表标题 https stackove
  • SlideToggle 高度为“跳跃”

    我的 jQueryslideToggle 实验 谁能告诉我为什么我打开盒子时会 跳动 前半部分他们滑动 其余部分他们 跳跃 Thanks 约翰内斯 对我有帮助的是 overflow hidden 到那个切换
  • Android NDK:使用预编译静态库进行链接

    我正在尝试将 Jnetpcap 移植到 Android 以便使用它来解析 pcap 文件 Jnetpcap 是使用 JNI 的 libpcap 的 java 包装器 我已经使用 android 的源代码树将 libpcap 编译为静态库 当
  • 需要 EJB 3.1 Singleton + JPA + JSF 设计建议

    给定 简单的 JSF web 应用程序 无 Seam 让 JSF bean 调用几个 EJB 而 EJB 又加载并保存 JPA 实体 我想要的是使用 Singletonejb 和注入的注释EntityManager 代替 EntityMan
  • 将分析仪连接到 Howler sound

    我已经尝试将分析仪连接到 Howler 声音一段时间了 但没有成功 我像这样创建我的嚎叫声音 var sound new Howl urls media sounds genesis mp3 然后我使用 Howler 全局上下文创建分析器
  • 如何防止应用程序被标记为可疑

    我有一个使用 Visual Studio 2012 用 C 编写的 NET 应用程序 我通过自己的网站推广该应用程序并提供下载 在 Chrome 中下载它时 我收到一条消息 指出我的应用程序 不常下载 可能很危险 此外 当我下载自己的应用程
  • 处理 ListView 中的 MouseMove、MouseDown、MouseUp 事件以拖动无边框表单

    我在用着MouseMove MouseUp MouseDown移动无边界表单的事件 如此处的示例 它工作得很好 但对于 ListView 只有当我单击列表中的项目 其文本 时它才有效 如果我单击不包含项目的 ListView 的空间 它将不