我知道需要自己绘制,但如果在onPaint事件中,每移动一像素就绘制一次,必然会影响性能,我看过有的在移动时出现虚线,到目标位置后再绘制,这是用windows中那个消息实现的呢?

解决方案 »

  1.   

    [DllImport("user32.dll")]
    static extern short GetAsyncKeyState(int vKey);const int VK_LBUTTON  = 0x01;bool IsKeyDown(VirtualKeys vkey)
    {
    return ( GetAsyncKeyState( (short)VirtualKeys.VK_LBUTTON ) & 0x8000 ) > 0;
    } 1)在窗体的MouseDown记录下鼠标点击的位置2) 在MouseMove事件中,查看 IsKeyDown(VK_LBUTTON);
    如果是按下了鼠标左键,那么
    this.Left += offsetX;
    this.Top  += offsetY;
      

  2.   

    正确为
    bool IsKeyDown(VirtualKeys vkey)
    {
    return ( GetAsyncKeyState( (short)vkey ) & 0x8000 ) > 0;
    }
      

  3.   

    我知道如何移动窗体,在将Form的FormBorderStyle设置为None时,Form就没有了标题栏,那么在移动窗体时需要自己绘制,这样每移动一个像素,都要进行绘制,对性能会有影响。当按住标题栏移动时不进行绘制,而是出现虚线边框,在释放鼠标左键时再进行绘制。但这个虚线边框是调用那个API显示的呢,还有,对于标题栏,是否有API可以将某一矩形区域设置为标题栏呢?
      

  4.   

    我想应该不用你去绘制什么虚线边框吧。关键是将某一矩形区域“设置”为标题栏,“欺骗”windows,让它认为那就是标题栏。
    是有这样的API,不过,不记得了。用VB开发的时候用过。王国荣的vb API的那本书上就有。
      

  5.   

    不用那么麻烦。
    一个全局变量
    private mouse_Offset as Point你窗体上的任一控件的以下二个事件,试试 Private Sub Top_Left_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles label1.mouseDown
            mouse_Offset = sender.Parent.PointToClient(sender.findform().mouseposition)
        End Sub    Private Sub Bottom_Left_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lable1.MouseMove
            If e.Button = MouseButtons.Left Then
                Dim mousepos As Point = sender.findform().mouseposition
                mousepos.Offset(-mouse_Offset.X, -mouse_Offset.Y)
                Me.Location = mousepos
            End If
        End Sub