写一个可以winform保存窗体绘图并重新读取显示的程序,完成注释

时间: 2023-03-20 11:02:15 浏览: 37
好的,以下是一个简单的C# WinForm程序,它可以保存窗体上的绘图,并在需要时重新读取并显示出来。 ``` using System; using System.Drawing; using System.Windows.Forms; using System.IO; namespace SaveAndLoadDrawings { public partial class Form1 : Form { private bool isDrawing = false; private Point startPoint; private Point endPoint; private Bitmap bitmap; public Form1() { InitializeComponent(); bitmap = new Bitmap(ClientSize.Width, ClientSize.Height); pictureBox.Image = bitmap; pictureBox.MouseMove += new MouseEventHandler(pictureBox_MouseMove); pictureBox.MouseDown += new MouseEventHandler(pictureBox_MouseDown); pictureBox.MouseUp += new MouseEventHandler(pictureBox_MouseUp); } private void pictureBox_MouseMove(object sender, MouseEventArgs e) { if (isDrawing) { endPoint = e.Location; using (Graphics g = Graphics.FromImage(bitmap)) { g.DrawLine(Pens.Black, startPoint, endPoint); } startPoint = endPoint; pictureBox.Refresh(); } } private void pictureBox_MouseDown(object sender, MouseEventArgs e) { isDrawing = true; startPoint = e.Location; } private void pictureBox_MouseUp(object sender, MouseEventArgs e) { isDrawing = false; } private void saveButton_Click(object sender, EventArgs e) { SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "Bitmap files (*.bmp)|*.bmp"; if (dialog.ShowDialog() == DialogResult.OK) { using (FileStream fs = new FileStream(dialog.FileName, FileMode.Create)) { bitmap.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp); } } } private void loadButton_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Bitmap files (*.bmp)|*.bmp"; if (dialog.ShowDialog() == DialogResult.OK) { using (FileStream fs = new FileStream(dialog.FileName, FileMode.Open)) { bitmap = new Bitmap(fs); } pictureBox.Image = bitmap; pictureBox.Refresh(); } } } } ``` 这个程序使用一个pictureBox控件来显示绘图,当鼠标在pictureBox上移动时,会根据鼠标的位置绘制一条直线。当用户单击保存按钮时,程序会弹出一个SaveFileDialog来让用户选择保存的文件名和位置,并将当前窗体绘图保存为一个BMP文件。当用户单击加载按钮时,程序会弹出一个OpenFileDialog来让用户选择要加载的BMP文件,并将其显示在pictureBox上。 希望这个程序对您有帮助。

相关推荐

好的,以下是一个可以保存窗体绘图并重新读取显示的winform程序的示例: c# using System; using System.Drawing; using System.Windows.Forms; namespace WinFormGraphicsDemo { public partial class MainForm : Form { private Bitmap _bitmap; public MainForm() { InitializeComponent(); _bitmap = new Bitmap(ClientSize.Width, ClientSize.Height); } private void MainForm_Paint(object sender, PaintEventArgs e) { using (var graphics = Graphics.FromImage(_bitmap)) { graphics.Clear(Color.White); graphics.DrawLine(Pens.Black, new Point(0, 0), new Point(ClientSize.Width, ClientSize.Height)); graphics.DrawLine(Pens.Black, new Point(0, ClientSize.Height), new Point(ClientSize.Width, 0)); } e.Graphics.DrawImage(_bitmap, 0, 0); } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { using (var saveFileDialog = new SaveFileDialog()) { saveFileDialog.Filter = "Bitmap files (*.bmp)|*.bmp"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { _bitmap.Save(saveFileDialog.FileName); } } } private void openToolStripMenuItem_Click(object sender, EventArgs e) { using (var openFileDialog = new OpenFileDialog()) { openFileDialog.Filter = "Bitmap files (*.bmp)|*.bmp"; if (openFileDialog.ShowDialog() == DialogResult.OK) { _bitmap = new Bitmap(openFileDialog.FileName); Invalidate(); } } } } } 在这个程序中,我们创建了一个名为“MainForm”的窗体,其中包含了一个可以绘制图形的画布,并且我们添加了“保存”和“打开”功能,可以让用户将绘制的图形保存到文件中,或者从文件中读取并显示出来。当用户绘制图形时,我们会将其保存到一个名为“_bitmap”的位图对象中,在窗体需要重新绘制时,我们会从该位图对象中读取图形并绘制到窗体上。 希望这个程序可以帮助到您!
### 回答1: 非常乐意为您解答,编写可以画圆的WinForm窗体程序,可以通过使用GDI+来实现,具体步骤如下:1.使用Visual Studio创建一个WinForm程序;2.在Form1设计器中,拖动一个PictureBox控件到Form上;3.在Form1的构造函数中添加如下代码:this.picBox.Image = new Bitmap(this.picBox.Width, this.picBox.Height);4.在Form1的Form_Paint事件中添加如下代码:Graphics g = Graphics.FromImage(this.picBox.Image);g.DrawEllipse(Pens.Blue, 20, 20, 200, 200);5.在Form1的Form_Closing事件中添加如下代码:this.picBox.Image.Save(@"D:\circle.jpg");6.运行程序,即可在Form1中看到一个画有圆的Form,并且可以保存重新显示。 ### 回答2: 编写一个可以画圆的WinForm窗体程序并保存重新显示,可以分为以下几个步骤: 1. 创建一个新的WinForm应用程序项目。打开Visual Studio并选择创建新项目,在模板中选择Windows窗体应用程序,并命名为“CircleDraw”。 2. 在窗体上添加一个画布控件,可以使用Panel或PictureBox控件来实现。使用鼠标事件功能,监听鼠标点击事件。 3. 在窗体的代码文件中,定义以下变量: csharp List circlePoints = new List(); // 用于存储圆的所有点坐标 bool isDrawing = false; // 标识是否正在绘制圆形 4. 在鼠标点击事件的处理方法中,判断是否正在绘制圆形。如果是,则记录鼠标点击的点坐标,并将其添加到circlePoints列表中。 csharp private void panel1_MouseClick(object sender, MouseEventArgs e) { if (isDrawing) { circlePoints.Add(e.Location); panel1.Invalidate(); // 触发画布重绘 } } 5. 在窗体的Paint事件处理方法中,使用GDI+绘制所有的圆形。 csharp private void panel1_Paint(object sender, PaintEventArgs e) { using (Graphics g = e.Graphics) { foreach (Point p in circlePoints) { g.DrawEllipse(Pens.Black, p.X - 10, p.Y - 10, 20, 20); } } } 6. 在窗体上添加一个“保存”按钮,点击按钮时,将circlePoints列表的数据保存到一个文件中。 csharp private void btnSave_Click(object sender, EventArgs e) { using (StreamWriter sw = new StreamWriter("circleData.txt")) { foreach (Point p in circlePoints) { sw.WriteLine($"{p.X},{p.Y}"); } } } 7. 在窗体的Load事件处理方法中,读取保存的数据,并重新绘制圆形。 csharp private void Form1_Load(object sender, EventArgs e) { if (File.Exists("circleData.txt")) { using (StreamReader sr = new StreamReader("circleData.txt")) { string line; while ((line = sr.ReadLine()) != null) { string[] coords = line.Split(','); int x = int.Parse(coords[0]); int y = int.Parse(coords[1]); circlePoints.Add(new Point(x, y)); } } } panel1.Invalidate(); // 触发画布重绘 } 现在,当你运行程序,单击鼠标左键时,就可以绘制圆形。点击保存按钮时,圆形数据将被保存到文件中。下次重新打开程序时,将会自动读取并显示之前绘制的圆形。 ### 回答3: 编写一个可以画圆的WinForm窗体程序,并且可以保存重新显示,可以通过以下步骤实现: 1. 创建一个新的WinForm窗体应用程序项目。 2. 在程序的主窗体上添加一个画布,可以使用PictureBox控件,该控件可以支持绘制图形。 3. 添加一个按钮用于绘制圆的功能。 4. 在按钮的点击事件中,添加绘制圆的逻辑。可以利用Graphics对象的DrawEllipse方法来绘制圆。 5. 在绘制完成后,可以选择将绘制好的图形保存成图片文件,可以使用Graphics对象的Save方法,将图形保存成文件。 6. 在需要重新显示绘制好的图形时,可以使用Graphics对象的DrawImage方法,将保存的图片加载到画布上进行重新显示。 7. 可以添加一个清除按钮,点击后可以清空画布上的内容,可以使用Graphics对象的Clear方法来实现。 8. 可以将绘制圆的参数(如圆心坐标、半径等)保存起来,可以用一个数据结构如List来存储多个圆的参数,每次绘制完后将参数添加到List中。 9. 在重新显示图形时,可以遍历List中的参数,依次绘制出保存的圆。 10. 可以使用文件操作来保存或读取圆的参数,如可以使用StreamWriter和StreamReader来将参数保存到文本文件或从文本文件读取参数。 通过以上步骤,就可以编写一个可以画圆的WinForm窗体程序,并且可以保存重新显示。
语言编写程序的优缺点是什么? 用C语言编写程序的优点包括: 1. 执行速度快:C语言是一种高效的编程语言,可以生成高效的本地代码,因此非常适合用于开发需要快速执行的应用程序。 2. 可移植性好:C语言代码可以在不同的操作系统和平台上运行,这使得它成为一种非常流行的编程语言。 3. 灵活性强:C语言提供了许多强大且灵活的工具,如指针、结构体和联合体等,允许开发人员在编写程序时更加自由和创造性。 4. 可以直接访问硬件:由于C语言可以与汇编语言混合使用,因此开发人员可以直接访问计算机的硬件资源,这对于编写底层程序(如操作系统或驱动程序)非常有用。 但C语言也有一些缺点: 1. 容易造成内存泄漏或越界访问:由于C语言没有自动垃圾回收机制,因此需要开发人员手动管理内存。这可能会导致内存泄漏或越界访问等问题。 2. 不够安全:由于C语言中允许进行指针运算,可能会导致访问空指针或释放已经释放的内存等问题,这可能会导致崩溃或安全漏洞等问题。 3. 开发周期长:由于C语言需要手动管理内存,处理指针和调试应用程序等,因此开发时间可能会比其他高级语言更长。 综上所述,C语言是一种高效、灵活、可移植的编程语言,但需要开发人员具备相应的技能和经验,才能正确地使用它来编写可靠和安全的应用程序。
### 回答1: 很高兴回答您的问题,可以通过调用Windows GDI(图形设备接口)的API来实现winform窗体程序中的绘图重新显示。您可以通过在窗体的Load事件中调用API来绘制图形,并在OnPaint事件中重新绘制图形。 ### 回答2: 要让WinForm窗体程序中的绘图在下次打开后重新显示,可以考虑将绘图保存到文件中或者使用数据库存储绘图数据。以下是具体的步骤: 1. 将绘图保存为文件:在绘图完成后,将绘图数据保存到一个文件中,可以选择常见的图像格式,如PNG、JPEG等。通过使用Graphics类的Save方法,可以将绘图保存为文件。在下次打开窗体程序时,读取该文件并显示绘图即可。 2. 使用数据库存储绘图数据:可以将绘图数据存储到数据库中,例如SQL Server、MySQL等。可以创建一个表,用于存储绘图数据的相关信息,如图像名称、文件路径等。在窗体程序中,可以通过读取数据库中的数据来获取并显示绘图。 3. 在重新打开窗体程序时,通过读取文件或者数据库中的数据,获取存储的绘图信息。然后,使用Graphics类的相关方法将绘图重新显示出来。可以在窗体的Paint事件中进行绘图操作,将读取的绘图数据传递给Graphics对象,然后调用相应的绘图方法来显示绘图。 需要注意的是,如果选择将绘图保存为文件,应该确定保存文件的路径,并在下次打开程序时设置正确的文件路径来读取绘图数据。如果选择使用数据库存储绘图数据,要确保数据库连接的正确性,并及时更新数据库中的绘图数据。 通过这些步骤,就可以实现下次打开WinForm窗体程序后重新显示之前绘制的图形。 ### 回答3: 要让WinForm窗体程序中的绘图再下次打开后重新显示,可以通过以下方法实现: 1. 在窗体程序中利用画图工具(如Graphics)记录绘图的信息,例如绘制的图形类型、位置、颜色等。可以将这些信息保存在一个数据结构中,比如一个集合或者自定义的类。 2. 将绘图信息保存到一个持久化的存储介质中,比如文件或数据库。可以使用序列化(serialization)来将绘图信息转换为字节流,并将其写入文件或存储到数据库中。 3. 在窗体程序加载时,从持久化存储介质中读取绘图信息。可以使用反序列化(deserialization)将保存的字节流转换为绘图信息,并重新绘制到窗体上。 4. 在窗体的绘图事件(如Paint事件)中,使用保存的绘图信息重新绘制图形。可以遍历保存的绘图信息集合,根据每个绘图的属性使用画图工具绘制图形。 通过以上步骤,每次打开窗体程序时,都可以根据保存的绘图信息重新显示绘图。这样就可以实现让WinForm窗体程序中的绘图再下次打开后重新显示的效果。

最新推荐

在类库或winform项目中打开另一个winform项目窗体的方法

主要介绍了在类库或winform项目中打开另一个winform项目窗体的方法,可以实现Winform项目间窗体的调用,在进行Winform项目开发中非常具有实用价值,需要的朋友可以参考下

WinForm实现窗体最大化并遮盖任务栏的方法

主要介绍了WinForm实现窗体最大化并遮盖任务栏的方法,涉及C#实现WinForm窗体全屏显示的实现及调用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

C# WinForm打开PDF文件并在窗体中显示

本文主要介绍通过引用Adobe reader提供的COM组件,以实现在WinForm程序中显示PDF文件的功能。

WinForm遍历窗体所有子控件的方法

主要介绍了WinForm遍历窗体所有子控件的方法,涉及C#递归遍历相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下

C#实现winform用子窗体刷新父窗体及子窗体改变父窗体控件值的方法

主要介绍了C#实现winform用子窗体刷新父窗体及子窗体改变父窗体控件值的方法,涉及C#窗体交互的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

代码随想录最新第三版-最强八股文

这份PDF就是最强⼋股⽂! 1. C++ C++基础、C++ STL、C++泛型编程、C++11新特性、《Effective STL》 2. Java Java基础、Java内存模型、Java面向对象、Java集合体系、接口、Lambda表达式、类加载机制、内部类、代理类、Java并发、JVM、Java后端编译、Spring 3. Go defer底层原理、goroutine、select实现机制 4. 算法学习 数组、链表、回溯算法、贪心算法、动态规划、二叉树、排序算法、数据结构 5. 计算机基础 操作系统、数据库、计算机网络、设计模式、Linux、计算机系统 6. 前端学习 浏览器、JavaScript、CSS、HTML、React、VUE 7. 面经分享 字节、美团Java面、百度、京东、暑期实习...... 8. 编程常识 9. 问答精华 10.总结与经验分享 ......

基于交叉模态对应的可见-红外人脸识别及其表现评估

12046通过调整学习:基于交叉模态对应的可见-红外人脸识别Hyunjong Park*Sanghoon Lee*Junghyup Lee Bumsub Ham†延世大学电气与电子工程学院https://cvlab.yonsei.ac.kr/projects/LbA摘要我们解决的问题,可见光红外人重新识别(VI-reID),即,检索一组人的图像,由可见光或红外摄像机,在交叉模态设置。VI-reID中的两个主要挑战是跨人图像的类内变化,以及可见光和红外图像之间的跨模态假设人图像被粗略地对准,先前的方法尝试学习在不同模态上是有区别的和可概括的粗略的图像或刚性的部分级人表示然而,通常由现成的对象检测器裁剪的人物图像不一定是良好对准的,这分散了辨别性人物表示学习。在本文中,我们介绍了一种新的特征学习框架,以统一的方式解决这些问题。为此,我们建议利用密集的对应关系之间的跨模态的人的形象,年龄。这允许解决像素级中�

javascript 中字符串 变量

在 JavaScript 中,字符串变量可以通过以下方式进行定义和赋值: ```javascript // 使用单引号定义字符串变量 var str1 = 'Hello, world!'; // 使用双引号定义字符串变量 var str2 = "Hello, world!"; // 可以使用反斜杠转义特殊字符 var str3 = "It's a \"nice\" day."; // 可以使用模板字符串,使用反引号定义 var str4 = `Hello, ${name}!`; // 可以使用 String() 函数进行类型转换 var str5 = String(123); //

数据结构1800试题.pdf

你还在苦苦寻找数据结构的题目吗?这里刚刚上传了一份数据结构共1800道试题,轻松解决期末挂科的难题。不信?你下载看看,这里是纯题目,你下载了再来私信我答案。按数据结构教材分章节,每一章节都有选择题、或有判断题、填空题、算法设计题及应用题,题型丰富多样,共五种类型题目。本学期已过去一半,相信你数据结构叶已经学得差不多了,是时候拿题来练练手了,如果你考研,更需要这份1800道题来巩固自己的基础及攻克重点难点。现在下载,不早不晚,越往后拖,越到后面,你身边的人就越卷,甚至卷得达到你无法想象的程度。我也是曾经遇到过这样的人,学习,练题,就要趁现在,不然到时你都不知道要刷数据结构题好还是高数、工数、大英,或是算法题?学完理论要及时巩固知识内容才是王道!记住!!!下载了来要答案(v:zywcv1220)。

通用跨域检索的泛化能力

12056通用跨域检索:跨类和跨域的泛化2* Soka Soka酒店,Soka-马上预订;1印度理工学院,Kharagpur,2印度科学学院,班加罗尔soumava2016@gmail.com,{titird,somabiswas} @ iisc.ac.in摘要在这项工作中,我们第一次解决了通用跨域检索的问题,其中测试数据可以属于在训练过程中看不到的类或域。由于动态增加的类别数量和对每个可能的域的训练的实际约束,这需要大量的数据,所以对看不见的类别和域的泛化是重要的。为了实现这一目标,我们提出了SnMpNet(语义Neighbourhood和混合预测网络),它包括两个新的损失,以占在测试过程中遇到的看不见的类和域。具体来说,我们引入了一种新的语义邻域损失,以弥合可见和不可见类之间的知识差距,并确保潜在的空间嵌入的不可见类是语义上有意义的,相对于其相邻的类。我们还在图像级以及数据的语义级引入了基于混�