c#用Graphics制图,图形被其他窗体挡住后消失

c#用Graphics制图,图形被其他窗体挡住后消失,第1张

Graphics g = pictureBox1CreateGraphics();
这样生成Graphics对象就会导致你说的问题。
你应该重写pictureBox1的onDraw方法或者产生一个bitmap将之赋值给pictureBox1

private 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);


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13408380.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存