2013-01-17 53 views
0

你好這可能是一個愚蠢的問題,但我無法弄清楚這裏的問題..這裏是我的代碼填寫的表格與單塊:表單打開時如何繪製?

private void drawBackground() 
{ 
    Graphics g = genPan.CreateGraphics(); 
    Image Block = Image.FromFile(@"C:\Users\Administrator\Desktop\movment V1\movment V1\images\BrownBlock.png"); 
    float recWidth = Block.Width; 
    // rectangle width didnt change the name from previous code, it's picture width. 

    float recHeight = Block.Height; 
    // rectangle Heightdidnt change the name from previous code, it's picture Height. 

    float WinWidth = genPan.Width; // genPan is a panel that docked to the form 

    float WinHeight = genPan.Height; 

    float curWidth = 0; //indicates where the next block will be placed int the X axis 
    float curHeight = 0;//indicates where the next block will be placed int the Y axis 

    while ((curHeight + recHeight) <= WinHeight) 
    { 
     if (curWidth >= WinWidth/3 || curWidth <= WinWidth/1.5 || 
      curHeight >= WinHeight/3 || curHeight <= WinHeight/1.5) 
     { 
      g.DrawImage(Block, curWidth, curHeight, recWidth , recHeight); 
     } 
     curWidth += recWidth; 
     if ((WinWidth - curWidth) < recWidth) 
     { 
      curWidth = 0; 
      curHeight += 50; 
     } 
    } 
} 

如果我啓動本功能,通過一個按鈕,它將工作得很好。但是,如果我在InitializeComponent()之後啓動func,方法在構造函數中或在FORM顯示的事件中,而按鈕仍然在窗體上,它將執行func,但塊背景不會是可見的,但灰色將是。但如果我刪除按鈕的背景將是可見的。 = \

我不明白爲什麼會發生,如何解決它,以及我在做什麼錯誤..任何人都可以解釋請.. ..?

+0

你有沒有試過OnLoad方法? – Sayse

回答

1

你不能用你當前的邏輯來做到這一點。問題在於控件(在你的情況下爲genPan面板)有它自己的Paint事件,當被調用時,覆蓋你在其上使用的任何圖形。

即使您在繪製按鈕時單擊,它仍然可用,直到表單重新繪製爲止,例如,嘗試關注其他窗口並再次關注你的表單:你將失去你所畫的東西。

正確的做這種事情的方法是編寫自己的類,繼承自一些基本控件(Panel),然後重寫它的OnPaint事件並在那裏繪製任何你想要的東西。

所以首先,有這樣的類:

public class BlockBackgroundPanel : Panel 
{ 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     Image Block = Image.FromFile(@"C:\Users\Administrator\Desktop\movment V1\movment V1\images\BrownBlock.png"); 
     float recWidth = Block.Width; 
     //rest of your code, replace "genPan" with "this" as you are inside the Panel 
    } 
} 
了.Designer.cs文件

然後(您可以在Studio中打開它)改變代碼,以便genPan將成爲您的新類的實例:

private BlockBackgroundPanel genPan; 
//... 
this.genPan = new BlockBackgroundPanel(); 
+0

我爲什麼要創建一個全新的課程? 不是最好在常規genPan_paint事件中調用該方法嗎?我試了一下,它的工作原理.. –

+0

@ user1984425優點!猜猜我太習慣自己的工作方式了。給你更多的靈活性。 –

+0

好的,非常感謝你真的幫助了我! =] –

1

如果您只需要根據一些條件/動作/用戶交互繪製背景...

呼叫這個功能可按入形式OnPaint方法,並使其只有如果一些bollean variale等於true。而布爾變成真,只有在按鈕點擊。

一些假設的例子:

protected override OnPaint(...) //FORMS ONPAINT OVERRIDE 
{ 
    if(needBackGround) //INITIAL VALUE AT STARTUP IS FALSE 
     drawBackground(); 
} 

public void ButtonClickHandler(...) 
{ 
    needBackGround= !needBackGround; //INVERSE THE VALUE OF BOOLEAN 
} 

這顯然只是一個sniplet給你一個提示,而不是一個真正的代碼。可能還有其他問題需要面對,比如:閃爍,處理大小調整,性能......但這只是一個開始。