C#下如何实现无标题可拖动窗口
2011-12-29 16:17
495 查看
http://hi.baidu.com/tclaaa/blog
C#winform
|字号 订阅
在 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控件中时,即可以拖动按钮。
完整代码如下:From MouseDown时调用DraggingForm_MouseDown
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
//命名空间的引用
using System.Runtime.InteropServices;
namespace DraggingForm
{
public partial class DraggingForm : Form
{
public DraggingForm()
{
InitializeComponent();
}
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public 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;
private void DraggingForm_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
}
}
C#下如何实现无标题可拖动窗口
2011-03-05 01:21:22| 分类:C#winform
|字号 订阅
在 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控件中时,即可以拖动按钮。
完整代码如下:From MouseDown时调用DraggingForm_MouseDown
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
//命名空间的引用
using System.Runtime.InteropServices;
namespace DraggingForm
{
public partial class DraggingForm : Form
{
public DraggingForm()
{
InitializeComponent();
}
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public 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;
private void DraggingForm_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
}
}
相关文章推荐
- C#下如何实现无标题可拖动窗口
- C#下如何实现无标题可拖动窗口2
- C#下如何实现无标题可拖动窗口
- C#下如何实现无标题可拖动窗口 (转)
- c#实现无标题栏窗口的拖动
- C# 实现无标题栏窗口拖动效果
- 如何在 PB 中实现无标题可拖动的窗口
- C# 实现无标题栏窗口拖动效果
- c# 实现用鼠标拖动没有标题栏的窗口(窗体的任何部分都可实现拖动效果)
- c#实现无标题栏窗口的拖动
- c#实现无标题栏窗口的拖动
- 如何实现文件拖动到窗口中
- C# 无边框窗口实现拖动
- [ASP.NET教程] C#中如何实现数据拖动?(拖动图片,到TextBox,并显示)
- 无标题栏窗口拖动的实现
- c#如何实现无标题栏窗口程序的移动?
- C# 使用重载消息处理函数的方式,实现没有标题栏的窗体的拖动。
- (C#)Excel中如何实现以分页预览的方式显示,凍結窗口
- 无标题栏窗口拖动的实现
- C#实现鼠标拖动自定义窗口