C# Winform无边框窗体鼠标拖动怎么实现?

丁心驿 2011-04-22 11:25:54
Winform无边框窗体鼠标拖动怎么实现?
网上不少代码试了不管用。谁能给个实例。做一个小程序,只要能实现无边框窗体鼠标拖动就可以。
十分感谢!
希望发到邮箱
562515212@qq.com
就当帮忙吧同志们!
...全文
990 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
肖恩 2011-07-07
  • 打赏
  • 举报
回复
放到你的代码中

// 移动窗体
const int WM_NCLBUTTONDOWN = 0xA1;
const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

// 窗体上鼠标按下时
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left & this.WindowState == FormWindowState.Normal)
{
// 移动窗体
this.Capture = false;
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}

huawenzi750 2011-07-07
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_6ab738af0100juex.html
636f6c696e 2011-07-07
  • 打赏
  • 举报
回复
DragMove()
rqx110 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 secretgarden 的回复:]

第二种方法,是更普遍的做法:

C# code
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;

protected override void WndProc(ref Message message)
{
base……
[/Quote]

xu_2007 2011-07-07
  • 打赏
  • 举报
回复
一般是通过数标点击事件里面的坐标值来分析当前点击位置是否属于可以拖动区,如果属于则调用拖动方法!
SecretGarden 2011-04-22
  • 打赏
  • 举报
回复
第二种方法,是更普遍的做法:

private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;

protected override void WndProc(ref Message message)
{
base.WndProc(ref message);

if (message.Msg == WM_NCHITTEST && (int)message.Result == HTCLIENT)
{
message.Result = (IntPtr)HTCAPTION;
}
}
SecretGarden 2011-04-22
  • 打赏
  • 举报
回复
using System.Runtime.InteropServices;

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;

[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
wtj2832 2011-04-22
  • 打赏
  • 举报
回复
丁心驿 2011-04-22
  • 打赏
  • 举报
回复
能不能写个小程序呢?很多人说的方法我试了就是不行,写好的程序比较好。
丁心驿 2011-04-22
  • 打赏
  • 举报
回复
谢谢!我先试试。
Dobzhansky 2011-04-22
  • 打赏
  • 举报
回复
一个窗口是分为客户区和非客户区的。

非客户区指的是:
四个边, 四个角, 以及左上角的图标区, 右上角的按钮区

鼠标移动到这些区域时,行为会发生相应变化,
这个是 windows 的桌面管理器通过询问你的窗口来实现的。
是程序告诉桌面管理器哪些部分是边框,哪些部分是特殊按钮的。
具体是通过向窗口发送消息 WM_NCHITTEST ,
由程序通过判断当前鼠标位置返回的。
你要的这个是 HT_CAPTION 具备的行为。


对于大多数的应用来说, 默认实现的足够好。
不需要我们特别处理,如果特殊处理。
只需自己相应 WM_NCHITTEST 消息即可。

按照这些里头挑选关键词,能搜到不少。
lulianqi 2011-04-22
  • 打赏
  • 举报
回复
   private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mypos = new Point(-e.X, -e.Y);
isok = true;
}
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (isok)
{
//Point xx = MousePosition;
Point xx = Control.MousePosition;
xx.Offset(mypos);
Location = xx;
}
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isok = false;
}
}

这样就可以了
lz自己看看吧

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧