2014-02-19 54 views
2

我正在製作一個沒有控制框的程序,因爲我不想要一個。我試圖做到這一點,當我點擊任何不是控件的區域時,它都會移動。這是我到目前爲止的代碼:單擊表單時移動表單,而不是頂欄區域

public Form1() 
    { 
     InitializeComponent(); 
     BackColor = Color.linen; 
     TransparencyKey = Color.Linen; 
    } 
    bool canMove = false; 
    int mouseX; 
    int mouseY; 
    public void MoveForm() 
    { 
     mouseX = MousePosition.X - Form1.ActiveForm.Location.X; 
     mouseY = MousePosition.Y - Form1.ActiveForm.Location.Y; 
     Form1.ActiveForm.Location = new Point(mouseX, mouseY); 
    } 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     canMove = true; 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (canMove) 
      MoveForm(); 

    } 

    private void Form1_MouseUp(object sender, MouseEventArgs e) 
    { 
     canMove = false; 
    } 

這適用於移動,但如果窗體位於邊緣,則不會顯示正確。 它所做的另一件事是,當它被拖動時會閃爍。

有沒有什麼辦法可以正確做到這一點?

+0

你閃爍的發生,因爲當你的鼠標按鈕即使您的鼠標位於相同的位置,它也會開始生成鼠標移動事件!它就像一個計時器。一招和移動事件不會停止。 –

+0

處理它的一種方法是使用鼠標的相對位置來屏幕座標。如果相同,請不要調用MoveForm()。 –

+0

@valter你會怎麼做? – Dozer789

回答

2

只需添加該代碼形成,就大功告成了:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private const int HTCLIENT = 0x0001; 
    private const int HTCAPTION = 0x0002; 
    private const int WM_NCHITTEST = 0x0084; 

    protected override void WndProc(ref Message m) 
    { 
     base.WndProc(ref m); 
     if ((m.Msg == WM_NCHITTEST) & (m.Result.ToInt32() == HTCLIENT)) 
     { 
      m.Result = (IntPtr)HTCAPTION; 
     } 
    } 

} 
+0

作品完美無瑕!非常感謝! – Dozer789

0

的代碼是在VB(對不起):

Private posx, posy As Integer 

Private Sub Form1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown 
    canMove = 1 

    posx = MousePosition.X 
    posy = MousePosition.Y 
End Sub 

Private Sub Form1_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove 
    If canMove = 1 And (posx <> MousePosition.X Or posy <> MousePosition.Y) Then 
     MoveForm() 
    End If 

    posx = MousePosition.X 
    posy = MousePosition.Y 
End Sub 

它不走個來回(其因爲在MoveForm你的代碼()),但如果你不動鼠標停止。

編輯:在C#(使用翻譯)

int posx, posy; 
private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    canMove = true; 
    posx = MousePosition.X; 
    posy = MousePosition.Y; 
} 

private void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (canMove == 1 && (posx != MousePosition.X || posy != MousePosition.Y)) { 
     MoveForm(); 
    } 

    posx = MousePosition.X; 
    posy = MousePosition.Y; 
} 

瓦爾特

+0

工作比以前更好,但它仍然在兩個地點之間閃爍。我打算使用Idle_Mind的解決方案,因爲它更短,而且看起來更好。感謝您的幫助! – Dozer789