如何在图片框中绘制圆圈和线条?
答案 0 :(得分:28)
或:
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 );
}
处理图片框的绘画事件并在那里进行自定义绘图。
答案 1 :(得分:4)
最好的方法是不在图片框中画圆圈和线条!它不是为此目的而设计的。
来自Bob Powell的GDI +博客:
这个问题的根源是windows的基本规则 编程已被打破。而作为图片框的结果 被指责的事情真的不是它的错。为了帮助解释 为什么,下面的四点概述了在这种情况下出了什么问题。
PictureBox控件用于显示图像。它不是图形界面的便利占位符。
Windows是一个事件驱动的系统,其中每个事件必须在正确的上下文中提供服务,并且不能使用指定处理按钮单击或鼠标移动事件的事件来绘制屏幕或其他奇怪的东西。
PictureBox通过绘制存储在其Image属性中的基于System.Drawing.Image的对象来刷新自身。如果没有图像,则会显示背景颜色。
窃取和绘制任何控件的Graphics对象并不是一种好的做法,应该强烈建议不要在正确的时间打破正确处理事件的规则。基本上如果你这样做会导致你的痛苦。当你把头撞在墙上时会引起疼痛。这表明你应该停止这样做。对于PictureBox.CreateGraphics调用,它是相同的。
正确的方法。
遵循事件驱动系统的规则很简单,但需要一个 很少有人预见到。所以,如果你想画一点点 当一个窗口在它前面移动时,它会保留在那里 再次离开或当你最小化和恢复时,你必须服务 您希望绘制的任何对象的Paint事件。 PictureBox带着不必要的行李 这种应用。如果你只想画一个东西 放置,通过响应Form.Paint事件在表单上绘制它。如果 你想要一个方便的占位符,用于在一组内工作的图形 边界,使用Panel控件并为它的Paint事件提供服务。如果你想 要为您的企业形象反复复制图形,请创建 控件并在OnPaint覆盖中执行绘制。
原始链接(不再有效):http://bobpowell.net/picturebox.htm
注意:Bob Powell博客的原始链接不再有效。我把它留在这里是出于历史目的。截至本帖子编辑之日,页面内容仍可在互联网档案(https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm)上查看。
答案 2 :(得分:0)
图片框是一个控件并且有一个图像作为源 - 所以你必须在图像上绘图并将图像传递给控件以显示它
MyImage = new Bitmap(fileToDisplay);
pictureBox1.ClientSize = new Size(xSize, ySize);
pictureBox1.Image = MyImage;
答案 3 :(得分:0)
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;
}
}
}
}