C#中,在窗口绘图的时候,添加了一个picturebox,将导入的图片覆盖整个窗口作为背景,然后在

C#中,在窗口绘图的时候,添加了一个picturebox,将导入的图片覆盖整个窗口作为背景,然后在背景的基础上绘制线段,为什么我用g.graphic=e.graphic;可以画出来,但是用 g.graphic=creatgraphic();就不行了,怎么解决啊?

绘图方法当然要在给定的上下文上绘制,你自己创建的Graphics设备当然不行了。

这是“回调函数”的原理。就是说你的绘制方法是给系统调用的,而不是自己调用的。

你按系统要求的标准写一个绘图方法,当系统认为需要重绘一个窗口了(比如刚刚显示,或是被其他窗口遮到又露出了),这时就会调用你写的那个OnPaint方法,把屏幕里那个窗口绘制区与一个绘图设备(Graphics,如同画布)上下文关联起来,然后把这个Graphics做为参数给你(e.Graphics),说:请在这个图形设备上绘制吧!于是你的方法开始在这个画布上画。画好了系统把这个绘出来的内容显示在屏幕上。

如果你自己创建一个自己的Graphics设备,这个设备并不是系统给你的那个,当然不会被显示出来了。你当然可以自己创建一个绘图设备来绘制,但你不把你自己的这个Graphics复制到系统递给你的那个设备(e.graphics)上的话,当然是不会显示的。

怎么解决?用e.Graphics来绘图呗!

但我感觉你可能有别的问题。你为什么非要自己搞Graphics?追问

因为我还加了复选框,通过判断复选框的变化调用相应的函数,但是我把绘图函数加到复选框下面的函数里去,总有错误,函数放外面是没问题的。。直接上图吧。。。

主要就是想通过复选框来控制上面的绘图,该怎么调用。。。

追答

好久没来,回答晚了,不好意思。不知道你这段时间是不是已经解决问题了。

首先,绘图必须在Paint方法里绘制,也必须在e.Graphics上绘制。
那么,怎么让控件来控制绘制呢?
很简单:
1.为form定义一些私有变量,比如 bool _bIsChecked = false;
2.在checkbox1_changed中,根据控件的状态,来设置this._bIsChecked的值为true或false;
3.然后,在form1_paint中,根据this._bIsChecked的值是true或是false,来绘制不同的内容。if语句会写的吧!

注意,在checkbox1_changed中,修改了this._bIsChecked的值之后,并不会引起窗口的重画,因为windows不知道这个窗口该重绘了。windows通常只会在窗口变大变小,被别的窗口遮盖等情况下,才会自动要求重绘,如果程序主动要求重绘,要向windows发出一个消息,说窗口已经失效了,需要全部重绘了!然后windows就会来调用你的form1_paint方法。

怎么发这个窗口失效消息呢?
也很简单: 在checkbox1_changed里,在设置完this._bIsChecked的值之后,加写一句:
this.Invalidate();

温馨提示:内容为网友见解,仅供参考
无其他回答

C#中,在窗口绘图的时候,添加了一个picturebox,将导入的图片覆盖整个窗口...
或是被其他窗口遮到又露出了),这时就会调用你写的那个OnPaint方法,把屏幕里那个窗口绘制区与一个绘图设备(Graphics,如同画布)上下文关联起来,然后把这个Graphics做为参数给你(e.Graphics),说:请在这个图形设备上绘制吧!

在C#中,picturebox中的图片如何让它充满大部分屏幕(除了菜单栏和工具栏...
可以放个panel在窗体里边 panel大小就可以充满你指示的区域 在将你选择的图片作为panel的背景图片就可以了

在C#里面点击一个pictureBox空间后怎么改变它的背景图片? 代码怎么写...
先设置pictureBox的点击事件,然后在事件里写 Image img=new Bitmap("C:\\\\1.jpg");\/\/这里是你要替换的图片。当然你必须事先初始化出来图片,比 如以路径来初始化。picture.Image=img;\/\/设置图片

c#winform编程中 在窗体上画一个大图盖住一个小图 怎么用程序实现选中...
使用2个pictureBox1(小)、pictureBox2(大),先把大图覆盖小图,并记住小图的起始位置(Location+Size)的范围,在大图中写MouseEnter事件,获取当前鼠标的坐标(Cursor.Position.Y.ToString(); Cursor.Position.X.ToString();),当前鼠标坐标在小图的范围内,使用pictureBox1.BringToFront();方法让...

c# drawimage绘制背景图像,并把背景图像放到picturebox中
;\/\/继续用g1画就不会消失 g1.DrawRectangle(new Pen(Color.Blue), 600, 600, 100, 420);\/\/this.BackgroundImage = b;b.Save("f:\\\\t.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); \/\/保存到文件 pictureBox1.Image = b; \/\/显示到pictureBox 不是消失了,是覆盖了 ...

c# form窗体添加背景图片,代码怎么写?
C# 窗体背景图片怎么跟随窗体变化而变化 背景图单独存放在其它位置后,当窗口的OnResize事件发生时,对图片缩放后,作为背景。根据此原理,实现如下:这里借用了一个pictureBox.不改变它的其它属性,如改变Image属性后,编写如下代码 private void Form2_SizeChanged(object sender, System.EventArgs e){load...

我要用c#做一个图像处理的软件,我想在picturebox里显示一张图片然后点...
我要用c#做一个图像处理的软件,我想在picturebox里显示一张图片然后点击图像的位置做局部的模糊化处理,具体怎么实现能不能给我点意见或者有类似的东西把源代码借我参考参考,这些各... 我要用c#做一个图像处理的软件,我想在picturebox里显示一张图片然后点击图像的位置做局部的模糊化处理,具体怎么实现能不能给我点...

c#窗体 设计一个按钮可以导入图片 并在旁边的载体里显示
首先添加一个按钮、一个PictureBox、一个OpenFileDialog,这些都能在工具箱里找到。双击button1并添加代码:openFileDialog1.Filter = "图片文件|*.bmp;*.jpg;*.png|所有文件|*.*";\/\/指定可选择的图片格式 openFileDialog1.Title = "打开图片"; if (openFileDialog1.ShowDialog() == DialogRe...

C#全屏抓图,并在pictureBox中显示
1. 开始截图时,创建一个与屏幕大小一样的位图,然后用Graphics.CopyFromScreen()把屏幕位图拷贝到该位图上。这是很关键的一步,这样所有的操作就都可以在该位图上进行了,而无实际屏幕无关了。int width = Screen.PrimaryScreen.Bounds.Width;int height = Screen.PrimaryScreen.Bounds.Height;Bitmap bmp...

c# picturebox上面再添加一个picturebox。二者的显示问题
解决方案: 1.最佳方案:使用GID重新构造一张新的图片来实现叠加的效果,缺点只能使用一个PictureBox来显示 2.一般方法:设置窗体的的透明色属性为你的png透明色,this.TransparencyKey = Color.Red; 确定,窗体上所有的改颜色均透明

相似回答