如何在图片框中画圆和线?
4 回答
或者:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawLine(
new Pen(Color.Red,2f),
new Point(0,0),
new Point(pictureBox1.Size.Width, pictureBox1.Size.Height ));
e.Graphics.DrawEllipse(
new Pen(Color.Red, 2f),
0,0, pictureBox1.Size.Width, pictureBox1.Size.Height );
}
处理图片框的绘制事件并在那里进行自定义绘图。
最好的方法是不要在图片框中画圆和线!它不是为此目的而设计的。
来自 Bob Powell 的 GDI+ 博客:
这个问题的根源在于windows编程的基本规则被打破了。并且由于图片框被归咎于实际上不是它的错的事情。为了帮助解释原因,下面的四点概述了在这种情况下出了什么问题。
PictureBox 控件用于显示图像。它不是图形表面的方便占位符。
Windows 是一个事件驱动的系统,其中每个事件都必须在正确的上下文中进行服务,并且用于处理按钮单击或鼠标移动事件的事件不得用于在屏幕上进行绘图或其他奇怪的事情。
PictureBox 通过绘制存储在其 Image 属性中的基于 System.Drawing.Image 的对象来刷新自身。如果没有图像,它将显示背景颜色。
窃取和绘制任何控件的 Graphics 对象都不是好的做法,应强烈劝阻,并违反在正确时间正确地点处理事件的规则。基本上,如果你这样做,它会导致你痛苦。当你把头撞在墙上时,你会感到疼痛。这表明你应该停止这样做。PictureBox.CreateGraphics 调用也是如此。
正确的方法。
遵循事件驱动系统的规则很容易,但需要一点先见之明。因此,如果您想绘制一些图形,并在窗口在其前面移动并再次离开时或当您最小化和恢复时保留它,您必须为您希望的任何对象的 Paint 事件提供服务涂上。PictureBox 随身携带这种应用程序不需要的包袱。如果您只想在一个地方绘制一些东西,请通过响应 Form.Paint 事件在表单上绘制它。如果您想要一个方便的占位符,用于在设定范围内工作的图形,请使用 Panel 控件并为其提供 Paint 事件。如果您想为您的企业形象反复复制图形,请创建一个控件并在 OnPaint 覆盖中进行绘图。
来源:https ://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm (原站已失效)。
图片框是一个控件,并且有一个图像作为源 - 所以你必须在图像上绘制并将图像交给控件以显示它
MyImage = new Bitmap(fileToDisplay);
pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = MyImage;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Asssignment
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Blue);
int radius = 200;
int x =Width/2;
int y =Height/2;
int first_point1 = (int)(Math.Cos(0) * radius + x);
int first_point2 = (int)(Math.Sin(0) * radius + y);
Point p1= new Point(first_point1,first_point2);
for(int i=1;i<500; i++)
{
int dx = (int)(Math.Cos(i)*radius+x );
int dy = (int)(Math.Sin(i)*radius+y );
Point p2 = new Point(dx, dy);
g.DrawLine(p, p1, p2);
p1 = p2;
}
}
}
}