表格打开时如何画画?

时间:2013-01-17 11:06:50

标签: c# windows forms background

您好,这可能是一个愚蠢的问题,但我无法弄清楚这里的问题..这是我的代码用单个块填充表单:

    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但是块背景不可见但灰色将是。但如果我删除按钮,背景将是可见的。 = \

我无法理解为什么会发生这种情况,如何解决它以及我做错了什么......有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

如果您只需要根据某些条件/操作/用户互动来绘制背景......

调用这个函数放入表单OnPaint方法中,如果某个bollean变量等于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
}

这显然只是一个提示,而不是真正的代码。您可能还需要面对其他问题,例如:闪烁,处理调整大小,性能......但这只是一个重点。

答案 1 :(得分: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 ();