2010-01-01 66 views
0

我正在編寫一個紙牌遊戲,當我在做視覺部分時,我遇到了將面板內的卡從一個地方移動到另一個地方的問題,圖像保持閃爍,並在每次嘗試移動它。移動picturebox的問題

這是我的代碼.....

public partial class Form1 : Form 
{ 
    bool clicked = false; 
    public Form1() 
    { 
     InitializeComponent(); 
     pictureBox1.ImageLocation = @"c:\kingHearts.png"; 
     pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 

    } 

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     clicked = true; 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (clicked) 
      pictureBox1.Location = e.Location; 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     clicked = false; 

    } 
} 

那麼,什麼是錯的,任何人都可以幫助PLZ ....

回答

2

,用於移動通過點擊並拖動在運行時UI對象,並且當控制是一種形式將在其上工作,或在像面板一個容器A非常典型的圖案:

private bool pb_mouseIsDown; 
private int oX; 
private int oY; 

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    pb_mouseIsDown = true; 
    oX = e.X; 
    oY = e.Y; 
} 

private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
{ 
    pb_mouseIsDown = false; 
} 

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (pb_mouseIsDown) 
    { 
     pictureBox1.Left += e.X - oX; 
     pictureBox1.Top += e.Y - oY; 
    } 
} 

注意:...在設計時間:如果您在控件位於「開啓」窗體(控件的父窗體爲窗體)時爲MouseUp,MouseDown和MouseMove定義事件處理程序,然後將其剪切並粘貼到一個容器,就像一個Panel:您將重新建立控件和IDE中的MouseDown,MouseUp和MouseMove事件之間的綁定/鏈接,以便它能夠工作。

+0

Thanx BillW它的工作原理。 但我還有一個想法,如果我想將卡片停靠在realeas上的其他面板上,我使用了以下內容,但是我錯過了該條件......? private void pictureBox1_MouseUp(object sender,MouseEventArgs e) if()//什麼情況應該是'contains'!! { pictureBox1.Left = panel1.Left; pictureBox1.Top = panel1.Top; } } – Waleedoo 2010-01-01 19:39:04

+0

@Waleedoo,當鼠標上移時,在「卡片」移動之後,只有「卡片」獲得鼠標移動:您需要編寫代碼來測試哪個「卡片槽」適合。使用矩形類的'InterSectsWith方法來檢查重疊:if(pictureBox1.Bounds.IntersectsWith(panel1.Bounds)){//找到匹配}典型的策略:製作一個列表:對該列表做一個'foreach'找到它應該「卡扣」到的卡容器:如果不匹配:將卡卡回到原來的位置。 「捕捉」匹配很簡單:只需將卡片邊界設置爲匹配「插槽」的邊界即可。 – BillW 2010-01-02 09:58:27

0

e.Location返回鼠標相對於圖片框的位置。
您需要編寫PointToClient(pictureBox1.PointToScreen(e.Location))以獲取相對於表單的位置。

+0

部分問題已解決,但每當我點擊圖片並將其移動鼠標保持在圖片的左上角.. 有沒有解決這個問題的...... ??? – Waleedoo 2010-01-01 19:23:45

0

對於閃爍的問題,您可以將this.DoubleBuffered設置爲true。

但移動PictureBox或其他控件效率低下,更好的辦法是將繪圖代碼寫入pictureBox1.Paint事件或像WPF,DirectX或OpenGL那樣更快地使用某些東西。

我不知道你想達到哪種效果,如果一切都是靜態的,而且你沒有大的運動部件,那麼目前的解決方案已經足夠好了。