这样生成Graphics对象就会导致你说的问题。
你应该重写pictureBox1的onDraw方法或者产生一个bitmap将之赋值给pictureBox1private int pointNums = 0;
private Point start, end;
private int choice = ELLIPSE; //主要修改这个改变两个点生成什么
const int LINE = 100001;
const int CIRCLE = 100002;
const int ELLIPSE = 100003;
Pen p = new Pen(ColorBlack, 1);
Bitmap b;
Graphics g;
public Form1()
{
InitializeComponent();
b = new Bitmap(pictureBox1Width, pictureBox1Height);
g = GraphicsFromImage(b);
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
//点击一下 第一个点
if (pointNums == 0)
{
start = new Point(eX, eY);
//因为没有画点的方法,所以使用填充矩形的方式画点
gFillRectangle(BrushesRed, new Rectangle(start, new Size(1, 1)));
pointNums++;
}
//点击两次 第二个点
else if (pointNums == 1)
{
end = new Point(eX, eY);
gFillRectangle(BrushesRed, new Rectangle(end, new Size(1, 1)));
if (choice == LINE) //画线
{
gDrawLine(p, start, end);
}
else if (choice == CIRCLE) //画圆
{
gDrawEllipse(p, GetRectangle(start, end, true));
}
else if (choice == ELLIPSE) //画椭圆
{
gDrawEllipse(p, GetRectangle(start, end));
}
pointNums = 0; //重置状态
}
pictureBox1Image = b; //图形覆盖,生效
}
//根据两个点,计算形成的左上角座标,以及形成的大小
//isCircle:是否为画圆,不传,默认为 false
private Rectangle GetRectangle(Point p1, Point p2, bool isCircle = false)
{
int x = MathMin(p1X, p2X);
int y = MathMin(p1Y, p2Y);
int w = MathAbs(p1X - p2X);
int h = MathAbs(p1Y - p2Y);
if (isCircle) //如果为画圆,则把长宽都设为,长与宽,小的那个值
{
w = h = MathMin(w, h);
}
//返回一个矩形
return new Rectangle(new Point(x, y), new Size(w, h));
}
精简了你的一些判断,和状态控制
如果需要的话,在这基础上修改吧
有两种方法,方法一:1、thisBackgroundImage
=
ImageFromFile(@"路径")
2、thisBackgroundImage
=
thisimageList1Images[0]
方法二:
imageList设置像素只能是在1-256
C# 窗体背景怎么跟随窗体变化而变化
背景图单独存放在其它位置后,当窗口的OnResize事件发生时,
对缩放后,作为背景。根据此原理,实现如下:
这里借用了一个pictureBox不改变它的其它属性,如改变Image属性后,编写如下代码
private
void
Form2_SizeChanged(object
sender,
SystemEventArgs
e){loadBackImage();}
private
void
loadBackImage(){Bitmap
bit
=
new
Bitmap(thisWidth,thisHeight);
Graphics
g
=
GraphicsFromImage(bit);
gDrawImage(thispictureBox1Image,newRectangle(0,0,bitWidth,bitHeight),0,0,thispictureBox1ImageWidth,thispictureBox1ImageHeight,GraphicsUnitPixel);
thisBackgroundImage
=
bit;
gDispose();}private
void
Form2_Load(object
sender,
SystemEventArgs
e)loadBackImage();}第一个说对了因为Load发生的时候窗体并未显示,等到窗体刷新时就没了
加载的控件能显示,是因为控件不是图像,它们会在各自的Paint过程中绘制(具有系统外观的控件是由系统负责绘制的)
在构造函数或Form_Load过程中thishide会无效,是因为此时窗体并未显示出来,在这之后窗口随时会被重新激活(这中间逻辑蛮复杂的,我也没有研究太懂,主要涉及到SetVisibleCore,啥时候有空了仔细研究下)关于这个,可以考虑采用其它办法用Google搜索一下"SetVisibleCore 启动时不显示"能找到些资料但是这个和Graphics绘制没有关系
首先你得确定你这条线的开始和结束坐标,比如开始(0, 10), 结束( 200, 10),代码如下:
SystemDrawingPen myPen;// 画笔颜色
myPen = new SystemDrawingPen(SystemDrawingColorRed);
SystemDrawingGraphics formGraphics = thisCreateGraphics();
// 画线
formGraphicsDrawLine(myPen, 0, 10, 200, 10);
//释放画笔和画布资源
myPenDispose();
formGraphicsDispose();
建议你看看MSDN上关于DrawLine的介绍, >1Graphics g = thisCreateGraphics();//this可替换成其他的控件名,用this的话将form创建为画布
2在Paint事件中
Graphics g = eGraphics;
3利用 Graphics 类的FromImage静态方法(不常用)
Image img=ImageFromFile("g1jpg");
Graphics g = GraphicsFromImage(img);
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)