C#中为什么调用对话框后,就找不到原来的图片了(不是静态的图片) 20
我用C#开发了一个简单图形软件,其中涉及到移动图形,所以调用对话框传递参数,可是调用后,先前画的图形就找不到了。...
我用C#开发了一个简单图形软件,其中涉及到移动图形,所以调用对话框传递参数,可是调用后,先前画的图形就找不到了。
展开
展开全部
您好,
我猜想您应该是使用GDI+在应用程序中进行绘图的吧,并且,您的对话框挡住了曾经的图形的全部或一部分。
如果是,那么这个问题的出现是很正常的,这里涉及了Windows系统的绘图原理:当您打开一个新的窗体时,被这个窗体挡住的部分是不会进行窗体的重新绘制的,也就是说,Windows不管那部分了,当窗体关闭后,被挡住的部分会在窗体的Paint事件处理函数中重新绘制,可是您的图像不会被绘制,这就导致了图像消失的问题。为了重现您的问题,我编写了这样一个小程序,它有两个按钮,当单击按钮2时会在窗体上画一个矩形,单击按钮1则打开一个新窗口,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ShowLineJoin(PaintEventArgs e)
{
// Create a new pen.
Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);
// Set the pen's width.
skyBluePen.Width = 8.0F;
// Set the LineJoin property.
skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;
// Draw a rectangle.
e.Graphics.DrawRectangle(skyBluePen,
new Rectangle(40, 40, 150, 200));
//Dispose of the pen.
skyBluePen.Dispose();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
//ShowLineJoin(e);
}
private void button2_Click(object sender, EventArgs e)
{
// Create a new pen.
Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);
// Set the pen's width.
skyBluePen.Width = 8.0F;
// Set the LineJoin property.
skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;
Graphics gra = this.CreateGraphics();
// Draw a rectangle.
gra.DrawRectangle(skyBluePen,
new Rectangle(40, 40, 150, 200));
//Dispose of the pen.
skyBluePen.Dispose();
gra.Dispose();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
if (frm.ShowDialog() == DialogResult.OK)
{ }
}
}
}
这时,当Form2出现并被关闭后,主窗体上的图像也不见了。您可以把Form2的StartPosition设置为CenterScreen,使它在出现时不会挡住主窗体,然后您移动Form2,使它遮挡主窗体上的图像,当它移走后,您会发现原来的图像不见了。
解决的方法是将绘图的代码放到主窗体的Paint事件处理函数中,这样就不会发生图像消失的现象了。
希望这些信息对您有帮助,如果您还有疑问,请补充问题,谢谢!
我猜想您应该是使用GDI+在应用程序中进行绘图的吧,并且,您的对话框挡住了曾经的图形的全部或一部分。
如果是,那么这个问题的出现是很正常的,这里涉及了Windows系统的绘图原理:当您打开一个新的窗体时,被这个窗体挡住的部分是不会进行窗体的重新绘制的,也就是说,Windows不管那部分了,当窗体关闭后,被挡住的部分会在窗体的Paint事件处理函数中重新绘制,可是您的图像不会被绘制,这就导致了图像消失的问题。为了重现您的问题,我编写了这样一个小程序,它有两个按钮,当单击按钮2时会在窗体上画一个矩形,单击按钮1则打开一个新窗口,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void ShowLineJoin(PaintEventArgs e)
{
// Create a new pen.
Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);
// Set the pen's width.
skyBluePen.Width = 8.0F;
// Set the LineJoin property.
skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;
// Draw a rectangle.
e.Graphics.DrawRectangle(skyBluePen,
new Rectangle(40, 40, 150, 200));
//Dispose of the pen.
skyBluePen.Dispose();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
//ShowLineJoin(e);
}
private void button2_Click(object sender, EventArgs e)
{
// Create a new pen.
Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);
// Set the pen's width.
skyBluePen.Width = 8.0F;
// Set the LineJoin property.
skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;
Graphics gra = this.CreateGraphics();
// Draw a rectangle.
gra.DrawRectangle(skyBluePen,
new Rectangle(40, 40, 150, 200));
//Dispose of the pen.
skyBluePen.Dispose();
gra.Dispose();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
if (frm.ShowDialog() == DialogResult.OK)
{ }
}
}
}
这时,当Form2出现并被关闭后,主窗体上的图像也不见了。您可以把Form2的StartPosition设置为CenterScreen,使它在出现时不会挡住主窗体,然后您移动Form2,使它遮挡主窗体上的图像,当它移走后,您会发现原来的图像不见了。
解决的方法是将绘图的代码放到主窗体的Paint事件处理函数中,这样就不会发生图像消失的现象了。
希望这些信息对您有帮助,如果您还有疑问,请补充问题,谢谢!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询