小白求助,无边窗体的移动问题
c#吧
全部回复
仅看楼主
level 1
西村道柳 楼主
我的代码如下,可就是生成后没有办法移动
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Point mouseOffset;
private bool isMouseDown = false;
private void Form1_Load(object sender, EventArgs e)
{
button1.Text = "X";
}
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.X - SystemInformation.CaptionHeight - SystemInformation.FrameBorderSize.Height;
mouseOffset = new Point(xOffset,yOffset);
isMouseDown = true;
}
}
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_MouseUp(object sender,System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==MouseButtons.Left)
{
isMouseDown = false;
}
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
2014年02月01日 03点02分 1
level 1
西村道柳 楼主
大神快来~
2014年02月01日 03点02分 2
level 12
xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
yOffset = -e.X - SystemInformation.CaptionHeight - SystemInformation.FrameBorderSize.Height;
两个e.x ?
2014年02月01日 04点02分 3
改了还是不行
2014年02月01日 04点02分
回复 西村道柳 : xOffset = -e.X ; yOffset = -e. Y;试试
2014年02月01日 05点02分
level 12
Point p;
mousedown leftbutton
p=e.location
mousemove leftbutton
设置窗体Location=Control.MousePosition向左上角平移p
2014年02月05日 01点02分 4
level 12
2.重写WinProc
截获WM_LButtonDown消息
然后RelaseCapture
接着SendMessage()
WM_SYSCOMMAND
wParam SC_MOVE+HTCAPTION
lParam 0
2014年02月05日 01点02分 5
+1 楼主想多了。告诉系统那个部位是标题栏,系统就允许你拖放了。
2014年02月05日 01点02分
回复 bag29 :改msg的wparam?
2014年02月05日 02点02分
回复 此ID已被我抢注 :我试了改m.Msg=0x1a WM_NCLBUTTONDOWN m.Wparam=0x2 HTCAPTION 可以拖动,但是不能响应click mousedown等事件了,在WinProc里面调OnClick,可以引发Click事件,MouseDown咋
2014年02月05日 03点02分
level 6
方便一点你就在点击窗体空白处时算个坐标偏移值出来,然后加上去location属性既可,麻烦点就要考虑一下标题栏的矩形区域。
2014年02月05日 01点02分 6
level 12
加上一句this.refresh试试
2014年02月05日 02点02分 7
level 13
[呼~] 打开方式不对?
2014年02月05日 18点02分 8
level 13
[乖] 混脸熟!
2014年02月06日 12点02分 9
level 1
/// <summary>
/// 使特定的Control支持无边框左键移动
/// </summary>
public class NoBorderMove
{
private Control _control; //作用的控件
private bool _mouseIsDown; //记录左键是否按下
private int _x0ffset; //记录按下位置x轴
private int _yOffset; //记录按下位置y轴
/// <summary>
/// 创建无边框左键移动支持的新实例
/// </summary>
/// <param name="control">要支持无边框移动的控件</param>
public NoBorderMove(Control control)
{
this._control = control;
this._mouseIsDown = false;
this._x0ffset = 0;
this._yOffset = 0;
control.MouseDown += new MouseEventHandler(MouseDownHandler);
control.MouseMove += new MouseEventHandler(MouseMoveHander);
control.MouseUp += new MouseEventHandler(MouseUpHandler);
}
private void MouseDownHandler(object o,MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this._mouseIsDown = true;
this._x0ffset = e.X;
this._yOffset = e.Y;
}
}
private void MouseMoveHander(object o, MouseEventArgs e)
{
if (_mouseIsDown)
{
_control.Location = new Point(_control.Location.X + e.X - _x0ffset, _control.Location.Y + e.Y - _yOffset);
}
}
private void MouseUpHandler(object o, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this._mouseIsDown = false;
}
}
}
正好写过这个,把这个对象New出来就可以了
2014年02月08日 06点02分 10
level 7
搜索
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
2014年02月08日 08点02分 11
level 5
Point point; //定义变量存储坐标值
//鼠标指针在组件上方并按下鼠标按钮时引发事件
private void FrmRegister_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) //如果获取鼠标左键按下
{
Point pt = new Point();
pt = MousePosition; // 获取鼠标指针坐标
pt.Offset(point); //把组件移到指定坐标位置
this.Location = pt;
}
}
//鼠标指针移过组件时引发事件
private void FrmRegister_MouseDown(object sender, MouseEventArgs e)
{
point = new Point(-e.X, -e.Y); //记录鼠标指针移过的坐标
}
2014年02月08日 11点02分 12
level 5
2014年02月08日 11点02分 13
level 5
就像截图里一样,最好是在窗体上方添加一个Panel控件,大小控制在窗体上面和关闭那些按钮相同宽度的地方,两个代码引发事件加载到Panel控件的属性里,不要直接选择在窗体的属性,这样可以和有边框的时候一样,只有单击窗体上方(也就是panel控件的范围)才可以移动
2014年02月08日 11点02分 14
level 11
[DllImport("user32.dll")]
public static extern bool Rese();
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0X84:
base.WndProc(ref m);
if (m.Result == (IntPtr)0X1)
{
m.Result = (IntPtr)2;
return;
}
break;
}
base.WndProc(ref m);
}
加在构造函数前面。
2014年02月10日 02点02分 15
level 11
  78、《春光乍泻》:聪明人都是未婚的,结婚的人很难再聪明起来。
2014年02月10日 09点02分 16
level 13
[笑眼]我是不是发现错别字了!
2014年02月10日 13点02分 17
level 11
你可以不同意我的观点,但我有揍你的权利。
2014年02月10日 13点02分 18
1