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

时间: 2023-03-20 11:02:08 浏览: 45
好的,以下是一个可以保存窗体绘图并重新读取显示的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”的位图对象中,在窗体需要重新绘制时,我们会从该位图对象中读取图形并绘制到窗体上。 希望这个程序可以帮助到您!

相关推荐

好的,以下是一个简单的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上。 希望这个程序对您有帮助。
### 回答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窗体程序,并且可以保存重新显示。
### 回答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窗体程序中的绘图再下次打开后重新显示的效果。
语言编写程序的优缺点是什么? 用C语言编写程序的优点包括: 1. 执行速度快:C语言是一种高效的编程语言,可以生成高效的本地代码,因此非常适合用于开发需要快速执行的应用程序。 2. 可移植性好:C语言代码可以在不同的操作系统和平台上运行,这使得它成为一种非常流行的编程语言。 3. 灵活性强:C语言提供了许多强大且灵活的工具,如指针、结构体和联合体等,允许开发人员在编写程序时更加自由和创造性。 4. 可以直接访问硬件:由于C语言可以与汇编语言混合使用,因此开发人员可以直接访问计算机的硬件资源,这对于编写底层程序(如操作系统或驱动程序)非常有用。 但C语言也有一些缺点: 1. 容易造成内存泄漏或越界访问:由于C语言没有自动垃圾回收机制,因此需要开发人员手动管理内存。这可能会导致内存泄漏或越界访问等问题。 2. 不够安全:由于C语言中允许进行指针运算,可能会导致访问空指针或释放已经释放的内存等问题,这可能会导致崩溃或安全漏洞等问题。 3. 开发周期长:由于C语言需要手动管理内存,处理指针和调试应用程序等,因此开发时间可能会比其他高级语言更长。 综上所述,C语言是一种高效、灵活、可移植的编程语言,但需要开发人员具备相应的技能和经验,才能正确地使用它来编写可靠和安全的应用程序。
### 回答1: 好的,以下是一段C#代码示例,可以在WinForm窗体的Load事件中添加,以在窗口重新打开后显示之前的绘图: private List points = new List(); //存储绘图点坐标的列表 private void Form1_Load(object sender, EventArgs e) { //在窗口打开后重新绘制之前的图形 this.Refresh(); foreach (Point p in points) { //绘制每个点 Graphics g = this.CreateGraphics(); g.FillEllipse(Brushes.Black, p.X, p.Y, 5, 5); g.Dispose(); } } private void Form1_Paint(object sender, PaintEventArgs e) { //绘制当前的图形 foreach (Point p in points) { e.Graphics.FillEllipse(Brushes.Black, p.X, p.Y, 5, 5); } } private void Form1_MouseDown(object sender, MouseEventArgs e) { //将鼠标点击位置加入到点列表中 points.Add(new Point(e.X, e.Y)); //重新绘制窗口 this.Invalidate(); } 这段代码利用一个点列表存储所有的绘图点坐标,并在窗口重新打开时重绘之前的图形。当用户在窗口中点击鼠标时,新的点将被添加到列表中,并且窗口将被重新绘制以显示新的和之前的点。 ### 回答2: 编写一个实现上述功能的示例代码如下: 1. 首先,在WinForm窗口类中添加一个成员变量用于保存之前绘制的图形对象,例如private Graphics previousGraphics;。 2. 在窗口加载时,将当前绘图保存到previousGraphics中。可以在窗口的Load事件处理程序中实现,如下所示: csharp private void Form1_Load(object sender, EventArgs e) { previousGraphics = this.CreateGraphics(); // 在这里进行之前的绘图操作,例如: // previousGraphics.DrawLine(Pens.Red, new Point(0, 0), new Point(100, 100)); // previousGraphics.DrawEllipse(Pens.Blue, new Rectangle(200, 200, 100, 100)); } 3. 当窗口重新打开时,再次绘制之前的图形。可以在窗口的Paint事件处理程序中实现,如下所示: csharp private void Form1_Paint(object sender, PaintEventArgs e) { // 在这里重新绘制之前的图形 if (previousGraphics != null) { e.Graphics.DrawImage(previousGraphics, 0, 0); } } 这样,当窗口重新打开时,之前绘制的图形就会显示在窗口中。您可以根据实际需求在Load事件处理程序中进行之前的绘图操作,然后在Paint事件处理程序中重新绘制图形。 ### 回答3: 要实现让WinForm窗口重新打开后显示之前的绘图,可以使用以下步骤: 1. 在WinForm窗口的代码中添加一个PictureBox控件,用于显示绘图。 2. 在窗口的Load事件中,加载之前保存的绘图数据。可以将绘图数据保存在文件中,或者在程序中使用变量保存。 3. 在加载绘图数据之前,先清空PictureBox控件中的内容,以确保之前的绘图已经清除。 4. 通过绘图数据,重新绘制在PictureBox控件中。 以下是示例代码: csharp using System; using System.Drawing; using System.Windows.Forms; namespace WinFormApp { public partial class MainForm : Form { // 保存绘图数据 private Bitmap previousDrawing; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 加载之前保存的绘图数据 LoadPreviousDrawing(); } private void LoadPreviousDrawing() { // 清空PictureBox控件中的内容 pictureBox.Image = null; // 判断是否存在之前的绘图数据 if (previousDrawing != null) { // 将之前保存的绘图数据绘制到PictureBox控件中 pictureBox.Image = previousDrawing; } } private void SaveCurrentDrawing() { // 获取当前绘图,并保存到previousDrawing变量中 previousDrawing = new Bitmap(pictureBox.ClientSize.Width, pictureBox.ClientSize.Height); using (Graphics graphics = Graphics.FromImage(previousDrawing)) { graphics.Clear(Color.White); // 清空绘图 // 在此处添加绘图逻辑,绘制到graphics中 } } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { // 保存当前绘图数据 SaveCurrentDrawing(); // 可以将previousDrawing保存到文件中,以便下次加载 } } } 以上代码中,当窗口加载后,会自动加载之前保存的绘图数据,并将其绘制到PictureBox控件中。在窗口关闭时,会保存当前的绘图数据,以便下次打开时加载。为了简化示例,绘图的逻辑未在代码中提供,需要根据具体需求自行添加。

最新推荐

在类库或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.总结与经验分享 ......

事件摄像机的异步事件处理方法及快速目标识别

934}{基于图的异步事件处理的快速目标识别Yijin Li,Han Zhou,Bangbang Yang,Ye Zhang,Zhaopeng Cui,Hujun Bao,GuofengZhang*浙江大学CAD CG国家重点实验室†摘要与传统摄像机不同,事件摄像机捕获异步事件流,其中每个事件编码像素位置、触发时间和亮度变化的极性。在本文中,我们介绍了一种新的基于图的框架事件摄像机,即SlideGCN。与最近一些使用事件组作为输入的基于图的方法不同,我们的方法可以有效地逐个事件处理数据,解锁事件数据的低延迟特性,同时仍然在内部保持图的结构。为了快速构建图,我们开发了一个半径搜索算法,该算法更好地利用了事件云的部分正则结构,而不是基于k-d树的通用方法。实验表明,我们的方法降低了计算复杂度高达100倍,相对于当前的基于图的方法,同时保持最先进的性能上的对象识别。此外,我们验证了我们的方�

下半年软件开发工作计划应该分哪几个模块

通常来说,软件开发工作可以分为以下几个模块: 1. 需求分析:确定软件的功能、特性和用户需求,以及开发的目标和约束条件。 2. 设计阶段:根据需求分析的结果,制定软件的架构、模块和接口设计,确定开发所需的技术和工具。 3. 编码实现:根据设计文档和开发计划,实现软件的各项功能和模块,编写测试用例和文档。 4. 测试阶段:对软件进行各种测试,包括单元测试、集成测试、功能测试、性能测试、安全测试等,确保软件的质量和稳定性。 5. 发布和部署:将软件打包发布,并进行部署和安装,确保用户可以方便地使用软件。 6. 维护和更新:对软件进行维护和更新,修复漏洞和Bug,添加新的特性和功能,保证

数据结构1800试题.pdf

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

开集域自适应方法及其在靶点发现中的应用

9322基于开集域自适应的新靶点发现Taotao Jing< $,Hongfu LiuXiang,and Zhengming Ding<$†美国杜兰大学计算机科学系‡美国布兰代斯大学Michtom计算机科学学院网址:tjing@tulane.edu,hongfuliu@brandeis.edu,网址:www.example.com,zding1@tulane.edu摘要开集域自适应算法(OSDA)认为目标域包含了在外部源域中未观察到的新类别的样本不幸的是,现有的OSDA方法总是忽略了看不见的类别的信息的需求,并简单地将它们识别为“未知”集合而没有进一步的这促使我们通过探索底层结构和恢复其不可解释的语义属性来更具体地理解未知类别。在本文中,我们提出了一种新的框架,以准确地识别目标领域中的可见类别,并有效地恢复未见过的类别的语义属性具体而言,结构保持部分对齐开发,通过域不变的特征学习识别看到的基于视觉图的属性传播是为了通过视觉语义映射将可见属�