c#调用API函数拖动无标题窗口及控件

在Windows编程中,为了界面的美观,相信很多朋友都有过把Windows的Form的标题栏隐藏掉,然后自己做一个标题栏的经验。但是,隐藏掉标题栏后的Form怎么拖动呢?大部份人的做法都是在MouseDown,MouseMove等事件中自己写代码进行处理,用代码随着鼠标的移动,一点点的移动窗口。其实,还有一种比较简单的方法,就是以系统的身份向窗体发送一个消息,告诉窗体,你要开始移动啦,呵呵,下面,我们来看一看具体做法。

这个功能,我们用两个常用的API函数 SendMessage和ReleaseCapture来实现,介绍一下这两个函数。
ReleaseCapture函数的作用是为当前的应用程序释放鼠标的捕获
SendMessage函数的作用是调用一个窗口的窗口函数,将一条消息命令发给那个窗口。需要注意的是,这里所说的窗口不是.Net中的窗体(Form),而是相当于.Net中的控件。当然,System.Windows.Forms.Form也是一个Control.

SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

hwnd,要接收消息的那个窗口的句柄
wMsg,消息的标识符
wParam,具体取决于发送的消息 
lParam,具体取决于发送的消息

首先,调用API函数,需添加 System.Runtime.InteropServices命名空间的引用。

using System.Runtime.InteropServices;

然后,在程序中声明我们要用到的API函数及要用到的参数常量。

        [DllImport("user32")]
        
private static extern bool ReleaseCapture();

        [DllImport(
"user32")]
        
private static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

        
public const int WM_SYSCOMMAND = 0x0112;
        
public const int SC_MOVE = 0Xf010;
        
public const int HTCAPTION = 0x0002;

其中,
WM_SYSCOMMAND常量代表要向窗口发送消息,SC_MOVE常代表要向窗口发送移动的消息。
然后,接下来就很简单了。在Form的MouseDown事件中加入以下代码即可:

            ReleaseCapture();
            SendMessage(
this .Handle, WM_SYSCOMMAND, SC_MOVE  +  HTCAPTION, 0 );

这里,this.Handle代表当前Form的句柄。

细心的朋友可能会注意到我前面说一我句话:
需要注意的是,这里所说的窗口不是.Net中的窗体(Form),而是相当于.Net中的控件。当然,System.Windows.Forms.Form也是一个Control.
这么说,这个方法是不是还可以用来移动Form以外的其它控件呢?答案是肯定的。

我们继续往Form里添加一个Button控件,Name为 MoveButton。然后,在Button的MouseDown事件中写入以下代码:

            ReleaseCapture();
            SendMessage(
this .MoveButton.Handle, WM_SYSCOMMAND, SC_MOVE  +  HTCAPTION,  0 );

编译运行,这时我们会发现,鼠标在Form的标题栏以外的空白地方也可以拖动窗口了。而鼠标在Button控件中时,即可以拖动按钮。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# ArcEngine 中实现鼠标右键拖动地图可以通过以下步骤实现: 1. 首先在 ArcMap 中设置地图控件的 MouseUp 和 MouseDown 事件,以便在鼠标右键按下和释放时触发相应的事件处理函数。 2. 在 MouseDown 事件处理函数中,检测鼠标右键是否按下。如果是,则记录当前鼠标位置,并设置一个标志(如 isDragging),表示正在进行拖动操作。 3. 在 MouseMove 事件处理函数中,检测标志(isDragging)是否已设置,如果是,则计算当前鼠标位置与上一次记录的鼠标位置之间的差值,然后调用 IMapControl2 接口的 Pan 方法来实现地图的平移操作。 4. 最后,在 MouseUp 事件处理函数中,清除标志(isDragging),表示拖动操作已经完成。 以下是示例代码: ```csharp public void axMapControl1_MouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e) { if (e.button == 2) //右键按下 { m_LastMousePosition = new Point(e.x, e.y); //记录当前鼠标位置 m_IsDragging = true; //设置标志 } } public void axMapControl1_MouseMove(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseMoveEvent e) { if (m_IsDragging) //正在进行拖动操作 { int deltaX = e.x - m_LastMousePosition.X; int deltaY = e.y - m_LastMousePosition.Y; axMapControl1.Pan(deltaX, deltaY); //平移地图 m_LastMousePosition = new Point(e.x, e.y); //更新鼠标位置 } } public void axMapControl1_MouseUp(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseUpEvent e) { if (e.button == 2) //右键释放 { m_IsDragging = false; //清除标志 } } ``` 希望这些对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值