C#拖动无边框窗体如何实现?

w276080872 2010-05-24 01:36:18
上网查了很多资料,基本确定从消息下手是可以的,但是不知道怎么做.....
还有好心的大家,请不要使用Form的Mousedown,up,move事件来做..这个绝对不可以的.
谢谢所有浏览的和回帖的
...全文
681 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
dylike 2010-05-25
  • 打赏
  • 举报
回复
用到的API:ReleaseCapture,SendMessage
用到的常数:
WM_MOVE = &H0003
移动一个窗口
WM_SIZE = &H0005
改变一个窗口的大小

const int WM_NCHITTEST = 0x0084;
const int HTLEFT = 10;
const int HTRIGHT = 11;
const int HTTOP = 12;
const int HTTOPLEFT = 13;
const int HTTOPRIGHT = 14;
const int HTBOTTOM = 15;
const int HTBOTTOMLEFT = 0x10;
const int HTBOTTOMRIGHT = 17;
zhuazhuqingchong 2010-05-25
  • 打赏
  • 举报
回复
mark
w276080872 2010-05-25
  • 打赏
  • 举报
回复

this.Capture = false;
Message msg = Message.Create(Handle, WM_Move, (IntPtr)WM_SIZE, (IntPtr)HTLEFT);
WndProc(ref msg);

这样也不可以..
w276080872 2010-05-25
  • 打赏
  • 举报
回复
呵呵,绑定的也照样感谢,现在只剩下最后一个问题了....
那API的方法如何调用啊...就是参数都是什么意思?
我这样调用不行,假设我现在要发送左拉伸的命令。

ReleaseCapture();
const int WM_SIZE=0x06;
const int WM_Move = 0x06;
const int HTLEFT = 10;
const int WM_SYSCOMMAND = 0x0112;
SendMessage(this.Handle, WM_SYSCOMMAND, (IntPtr)(WM_Move + WM_SIZE), "");
cjnkd 2010-05-25
  • 打赏
  • 举报
回复
帮顶回复内容太短了!
w276080872 2010-05-25
  • 打赏
  • 举报
回复
to dylike :感谢你这么早起床回答问题 。。。。我去找找API的相关资料
w276080872 2010-05-24
  • 打赏
  • 举报
回复
大家一起学习,有问题一起交流探讨
gegewozai 2010-05-24
  • 打赏
  • 举报
回复
路过 学习一下。。
w276080872 2010-05-24
  • 打赏
  • 举报
回复
to zzx509:你的回答百分百是正确的!但是...第一全局鼠标钩子我不知道是什么东西,第二,发送消息也不会。。。 不然我就用一个Tick 判断然后发送消息也可。
zzx509 2010-05-24
  • 打赏
  • 举报
回复
那只能是用全局鼠标钩子了,找下这方面的资料,判断鼠标位置后发消息。
w276080872 2010-05-24
  • 打赏
  • 举报
回复
to zzx509:我太介意这个边框样式了,他会有白色的边框,这是我最早找到的资料之一,不过还是非常感谢你的热心与帮助,本人向所有热心的人致敬!
w276080872 2010-05-24
  • 打赏
  • 举报
回复
to wuyazhe:非常感谢热心的你... 其实在没有被填充的无边框Form窗口里,重载WndPro已经可以实现拖动了,但是Dock = fill以后,容器Panel遮住了Form,所以我这厢还是实现不了。。请问有办法吗?
兔子-顾问 2010-05-24
  • 打赏
  • 举报
回复
没看到1楼回复。拖动大小。。。
w276080872 2010-05-24
  • 打赏
  • 举报
回复
继续感谢楼上的2位....非常感谢你们的热心
zzx509 2010-05-24
  • 打赏
  • 举报
回复
如果你不介意无边框窗体改变一点点样式的话,不需要API就能实现。

protected override CreateParams CreateParams
{
get
{
CreateParams cp= base.CreateParams;
cp.Style |= (int)0x00040000;
return cp;
}
}

hopewoo 2010-05-24
  • 打赏
  • 举报
回复
我晕, 要不你加QQ675747953我帮你看看.没那么复杂的吧.....
兔子-顾问 2010-05-24
  • 打赏
  • 举报
回复
在你的窗体中粘贴如下代码即可
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wparam, int lparam);
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
if (e.Button == MouseButtons.Left)//按下的是鼠标左键
{
Capture = false;//释放鼠标,使能够手动操作
SendMessage(this.Handle, 0x00A1, 2, 0);//拖动窗体
}
}
w276080872 2010-05-24
  • 打赏
  • 举报
回复
就是到了边界让他拖动大小,继续发代码,我这是异性窗体。。而且窗体本身被填充...郁闷.
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_NCHITTEST: //
{
//// 分解当前鼠标的坐标
//int nPosX = (m.LParam.ToInt32() & 0xFFFF);
//int nPosY = (m.LParam.ToInt32() >> 16);
//MessageBox.Show(nPosX + "|" + nPosY);

//if (nPosX >= this.Left && nPosY >= this.Top - 2)
//{
// // 鼠标位置在窗体的右下角附近
// m.Result = (IntPtr)HTBOTTOMRIGHT;
// return;
//}
//else if (nPosX >= this.Left - 2)
//{
// // 鼠标位置在窗体右侧
// m.Result = (IntPtr)HTRIGHT;
// return;
//}
//else if (nPosY >= this.Top - 2)
//{
// // 鼠标位置在窗体下方
// m.Result = (IntPtr)HTBOTTOM;
// return;
//}
//break;
Point vPoint = new Point((int)m.LParam & 0xFFFF, (int)m.LParam >> 16 & 0xFFFF);
vPoint = PointToClient(vPoint);
if (vPoint.X <= 5)
if (vPoint.Y <= 5) { m.Result = (IntPtr)HTTOPLEFT; }
else if (vPoint.Y >= ClientSize.Height - 5) { m.Result = (IntPtr)HTBOTTOMLEFT; }
else m.Result = (IntPtr)HTLEFT;
else if (vPoint.X >= ClientSize.Width - 5)
if (vPoint.Y <= 5) { m.Result = (IntPtr)HTTOPRIGHT; }
else if (vPoint.Y >= ClientSize.Height - 5) { m.Result = (IntPtr)HTBOTTOMRIGHT; }
else m.Result = (IntPtr)HTRIGHT;
else if (vPoint.Y <= 5) { m.Result = (IntPtr)HTTOP; }
else if (vPoint.Y >= ClientSize.Height - 5) { m.Result = (IntPtr)HTBOTTOM; }

else if (vPoint.Y < 30) { m.Result = (IntPtr)HTCAPTION; }
break;
}
default:
break;
}

}
lhm741cs 2010-05-24
  • 打赏
  • 举报
回复
窗体右角的坐标(X1,Y1)
鼠标进入窗体的时候鼠标X=X1的时候、鼠标Y=Y1的时候,还有X=X1,Y=Y1的时候改变下鼠标外观
根据外观判断再用MOUSEDOWN应该可以啊,以前做过
hopewoo 2010-05-24
  • 打赏
  • 举报
回复
拖动大小 ?是不是根据某些情况自动更改窗体的大小?
加载更多回复(24)

110,539

社区成员

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

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

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