请教如何实现鼠标点住窗口的任何位置都能移动窗口?

sbf2000 2003-08-22 05:02:14
请教如何实现鼠标点住窗口的任何位置都能移动窗口?
...全文
81 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chainet 2003-08-22
  • 打赏
  • 举报
回复
to ArLi2003(阿利 正版 大家帮忙找工作) :
你的代码也有一点点问题。窗体的最大最小和Close按键失效了。
chainet 2003-08-22
  • 打赏
  • 举报
回复
to weifenluo(weifenluo) :
问题1.确实存在。
问题2.好像没有出现你说的情况,因为在拖动时基本不可能在窗体外放开左键。
问题3。确实存在
因为没有考虑那么多,所以作为一个简单的功能实现还是可以用的。
weifenluo 2003-08-22
  • 打赏
  • 举报
回复
楼上的代码有几个问题:

1. 这种实现只对用户区的鼠标有效.在非用户区中不能拖动窗口;
2. 由于没有捕获鼠标, 可能出现在窗口之外放开左键, 因为isMouseDown仍然是true, 结果还是可以拖动窗口.
3. 按一下ALT-ESC切换到别的应用程序试试.

做一个Custom Drag-and-Drop比想象的要复杂一些, 需要:
1. 在WM_LBUTTONDOWN和WM_NCLBUTTONDOWN消息处理中,调用DragDetect(Win32 API) Capture Mouse到一个顶层窗口.并且把输入焦点设到该窗口.
2. 在该窗口程序中处理WM_MOUSEMOVE消息,直到WM_LBUTTONUP消息或ESC键按下.
3. 如果有WM_CANCELMODE或WM_CAPTURECHANGED也要终止
ArLi2003 2003-08-22
  • 打赏
  • 举报
回复
protected override void WndProc(ref Message msg) {
if (msg.Msg == 0x0084)
msg.Result = (IntPtr) 2;
else
base.WndProc(ref msg);
}
chainet 2003-08-22
  • 打赏
  • 举报
回复
private Point mouseOffset;
private bool isMouseDown;
private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (isMouseDown)
{
Point mousePos = Control.MousePosition;
mousePos.Offset(mouseOffset.X, mouseOffset.Y);
Location = mousePos;
}

}

private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{

int xOffset;
int yOffset;

if (e.Button == MouseButtons.Left)
{
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.Y - SystemInformation.CaptionHeight - SystemInformation.FrameBorderSize.Height;
mouseOffset = new Point(xOffset, yOffset);
isMouseDown = true;
}
}

private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isMouseDown = false;
}

}

110,539

社区成员

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

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

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