您好,这可能是一个愚蠢的问题,但我无法弄清楚这里的问题..这是我的代码用单个块填充表单:
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 :(得分: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 ();