新建一个窗体。给窗体加一个LocationChanged或者Move事件。代码如下: 
                private   void   Form1_Move(object   sender,   EventArgs   e) 
                { 
                        if   (Cursor.Position.X   <   20) 
                        { 
                                this.Left   =   0; 
                                this.Top   =   0; 
                                this.Height   =   Screen.PrimaryScreen.WorkingArea.Height; 
                        } 
                        else 
                        { 
                                this.Height   =   300; 
                        } 
                } 实现效果:1、把窗口拖动到屏幕左侧,窗口会吸附上去,怎么让窗口不要老是刷新闪烁? 
2、吸附上去再拖出来的时候,设置高度为300,但是拖动完成后高度回到吸附时的高度,怎么解决?? 

解决方案 »

  1.   

    基本一样的代码,我在vb下怎么就可以啊    Private Sub Form1_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
            If Me.Left < 20 Then
                Me.Location = New Point(0, 0)
                Me.Height = Screen.PrimaryScreen.WorkingArea.Height
            Else
                Me.Height = 300
            End If
        End Sub
      

  2.   

    wzuomin :C#下你试一下。我没有安装VB.NET
      

  3.   

    c#也沒問題,不過
    if       (Cursor.Position.X       <       20)
    改為
    if (this.Left< 20)
      

  4.   

    有问题。改了没用。还是一样的情况。可以留QQ,我把编译的EXE或者程序发过去。
      

  5.   

    现在wzuomin 提供了一种解决方法,在视觉效果中把“拖动时显示窗口内容”选项去掉,但是效果不是我原来想要的了。大家可以试一下
      

  6.   

    if(this.Location.X < 20)
                {
                    this.Left = 0;
                    this.Top = 0;
                    this.Height = Screen.PrimaryScreen.WorkingArea.Height;
                }
                else
                {
                    this.Height = 300;
                }
      

  7.   

          第一个问题的好象可以这样解决吧``       在窗体属性中找到`     DoubleBuffered    把它的属性改为 true
       
                   你试下咯 `````
      

  8.   

    DoubleBuffered改为TRUE还是闪烁!
      

  9.   

    你这个代码在Vista上根本不吸附,看看下午或什么时候有时间我再看看。
      

  10.   

        Private Sub Form1_ResizeEnd(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ResizeEnd
            If Me.Left < 20 Then
                Me.Location = New Point(0, 0)
                If Me.Height <> Screen.PrimaryScreen.WorkingArea.Height Then                Me.Height = Screen.PrimaryScreen.WorkingArea.Height
                End If
            Else
                Me.Height = 300        End If
        End Sub
    关键是使用的事件不对
      

  11.   

    resize事件在什么时候触发啊?现在的主要问题是在move的时候,不停的在0和当前值之间不断的变化。这个move是一个系统管理的,我想从form的事件中很难去做。是不是可以变通一下,把窗口Title部分自己做呢?今天公司的事情太多,晚上我回家试验一下。
      

  12.   

    27楼因为用的ResizeEnd事件,只在拖动结束放开鼠标时才触发,因此不能产生吸上去的效果。
    下面的方法基本能实现你希望的功能,但是不完美。首先添加窗体类的几个私有字段:
             private  int startX = -1;
            private bool dock = false;
    以及一个常量
             private const int WM_NCLBUTTONDOWN = 161;startX记录开始拖动时窗口的Left,因为要区分是把窗口从中央往左侧拖还是相反。
    dock指示是否要停靠在窗口左侧重写窗口的WndProc方法
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_NCLBUTTONDOWN) startX= this.Left;            base.WndProc(ref m);
            }
    在此方法中截取鼠标左键在非客户区按下的消息,记录窗口的位置。添加Move事件处理方法
            private void Form1_Move(object sender, EventArgs e)
            {
                if ((startX > 20) || (startX <0))
                {
                    if ((this.Left < 20) && (this.Left >0))
                    {
                        this.Capture = false;
                        dock = true;
                    }
                }
                else
                {
                    dock = false;
                }
            }
    如果拖动从中央或者屏幕以外开始,并且窗口进入被吸附的区域,设置this.Capture为false,强制解除鼠标对窗口的控制,相当于鼠标左键抬起。注意两个判断条件不能在一条if语句里。添加Form1_LocationChanged事件处理方法
            private void Form1_LocationChanged(object sender, EventArgs e)
            {
                if (dock)
                {
                    this.Left = 0;
                    this.Top = 0;
                    this.Height = Screen.PrimaryScreen.WorkingArea.Height;
                 }
                else             {
                    this.Height = 300;
                }
            }
    这个很简单,判断是否停靠到左侧,相应设置窗口位置大小添加Form1_Resize事件处理方法        private void Form1_Resize(object sender, EventArgs e)
            {
                if (dock)
                    this.Height = Screen.PrimaryScreen.WorkingArea.Height;
                else
                    this.Height = 300;
            }
    如果不添加这个方法,那么把窗口从左侧拖动到中央时,系统会自动把窗口高度设置为拖动前的值。所以虽然它和LocationChanged方法重复还是不能缺少。当然也可以不用
    Resize而用ResizeEnd,省略掉LocationChanged设置高度的代码,但是这样窗口大小就只能在鼠标按键放开后才会改变。这个方法有两个缺陷。
    1. 在Move方法强制释放鼠标控制后,窗口会弹回到拖动前的位置,抵消掉在MOVE中设置窗口位置的效果,这就是为什么要在LocationChanged中进行设置的原因。也因为这个原因,窗口在被吸到左侧前会在拖动前的位置闪一下。
    2. 在鼠标移动速度很快的情况下,有可能因为系统不能及时处理消息的缘故,会失去吸附的效果。
    目前还没有找到解决的办法。
      

  13.   

    因为鼠标每移动一个像素,你就要计算一下位置,导致窗体在不停的重绘,因为结果我们看到的就是在不停的闪。建议使用窗体消息来做移动的处理,在你鼠标放开的时候,再做窗体是吸附效果可能会好一点。这里有篇文章或许对你有用。.net 下移动无标题栏窗体的几种方法
    http://www.dotnet-tech.cn/view.asp?id=2
      

  14.   

    如果是在.Net Framework 3.0和3.5中可以直接用Window类的DragMove() 方法.如果是更早的版本,你可以在位移量达到一定程度时才执行代码(比如10个像素,不建议设太大,一般5-10就ok)这样可以消除闪烁.如果设太大,闪烁时没了,不过视觉效果也变差了
      

  15.   

    不是吧.问题还没解决?你用的.net 2.0?我看看能不能办...
      

  16.   

    使用这段代码看看,反正在我的机器上没有闪动了.
    if (this.Left < 20)
    {
    this.Left = 0;
    this.Top = 0;
    this.Height = Screen.PrimaryScreen.WorkingArea.Height;
    this.Enabled = false;
    this.Enabled = true;
    this.Activate();
    }