2013-02-20 33 views
2

我一直在爲pictureBox的onPaint事件處理程序發生問題。我簡化了代碼,所以現在我試圖實現這一點:將路徑中的位圖加載到pictureBox1中,並在移動pictureBox1時在鼠標光標周圍繪製一個小矩形。PictureBox onPaint清除每個控件

private int mouseX; 
    private int mouseY; 
    private String path; 

    public Form1() 
    { 
     InitializeComponent(); 
     path = "images\\image.jpg"; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     pictureBox1.Image = new Bitmap(path); 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     mouseX = e.X; 
     mouseY = e.Y; 
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawRectangle(Pens.Black, mouseX - 10, mouseY - 10, 20, 20); 
     pictureBox1.Invalidate(); 
    } 

當我運行該應用程序時,位圖被成功加載,並且無論在哪裏拖動鼠標,矩形都被很好地繪製。無論如何有兩個問題:

1)當窗體加載時,一切都是白色,但pictureBox直到我把窗口移動到某個地方。這意味着menuStrip,toolStrip例如用白色清除。當我添加pictureBox.Invalidate();到Form1_Load它似乎照顧這個問題(一切都被加載和可見),但在toolStrip有一些按鈕和comboBoxes相互作用,改變其可見性,這仍然會導致問題。我只想在pictureBox上減少Paint的funcionality。

2)儘管鼠標光標沒有進入pictureBox,但在Form加載的時候繪製矩形。當光標離開pictureBox時,最後繪製的矩形也停留在那裏。我試圖刪除它,但我無法弄清楚。

感謝您的任何建議,在我看來,有一些基本的東西在那裏丟失,但不知道是什麼。

+3

使用'pictureBox1.Invalidate();'在'Paint'事件處理程序中是一個壞主意,因爲它會導致另一個paint事件。 – 2013-02-20 12:00:07

+3

考慮將'pictureBox1.Invalidate()'移動到'MouseMove'處理程序。 – 2013-02-20 12:01:24

+0

如果矩形不能跟上光標,則用'Refresh'替換'Invalidate'。 – 2013-02-20 12:02:35

回答

0

2)MouseMove僅當光標位於圖片框上方時才起作用。嘗試使用MouseEnterMouseLeave來處理何時開始繪製矩形以及何時停止這樣做。