C# 一个关于Graphics类的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 一个关于Graphics类的问题相关的知识,希望对你有一定的参考价值。

一个小窗口程序,在按钮的事件里写了以下代码,想通过按键画一个红色的方块:
private void button2_Click(object sender, EventArgs e)

this.bitmap = new Bitmap(500, 500);
Graphics vGraphics = Graphics.FromImage(bitmap);
vGraphics.FillRectangle(new SolidBrush(Color.Red), vGraphics.ClipBounds);

运行后点击按钮没有反应,要在后面加上Invalidate()函数,并重写了OnPaint方法才能达到目的。
Onpaint方法是这样写的:
protected override void OnPaint(PaintEventArgs e)

base.OnPaint(e);
if (bitmap != null) e.Graphics.DrawImage(bitmap, 0, 0);



求高手指教,为什么不加上Invalidate方法和重写Onpaint方法不能画出一个图案?

Graphics相当于可视控件的呈现表面。
如果是从PaintEventArgs绘图事件中的e.Graphics而来,你取到的正是系统准备在上面绘画的Graphics对象;
如果你自己创建了一个,它仅仅是在内存中而已,无法显示出来。

在进行重绘工作时,通常使用两种方式来获取合适的Graphics,
一是在各类绘图事件中写,要求该事件提供PaintEventArgs;
二是直接获取某控件的Graphics。比如你可以在button2_click事件中写:
Graphics btnGraph=button2.CreateGraphics();
btnGraph.FillRectangle(new SolidBrush(Color.Red), vGraphics.ClipBounds);

要注意一点,不写在合适重绘事件中,你的“画布”很可能只画了一次然后就被抹的乱七八糟。比如窗体缩放、窗体拖动、窗体隐藏等等,都会导致OnPaint事件,结果就是系统又给你画回来了。

至于Invalidate,是要求控件立刻重绘区域,会触发控件的OnPaint事件的,所以你写在OnPaint事件中的绘图语句也被正确的执行了。
参考技术A 你把 e.Graphics.DrawImage(bitmap, 0, 0); 这句话拿到button2_Click事件方法里试试

如何在c#中创建指针类型类的指针

【中文标题】如何在c#中创建指针类型类的指针【英文标题】:how to create a pointer of pointer type class in c# 【发布时间】:2016-02-10 12:04:33 【问题描述】:

我有一个关于这个问题的例子:

我有一个类“q_bit”,我想在 c++ 中创建一个指针 m_q_bit,就像这段代码一样

q_bit **m_q_bit 

我如何通过 c# 来创建它

【问题讨论】:

异议,C#中有指针dreamincode.net/forums/topic/355774-pointers-in-c%23 您真正想要实现的目标是什么?是的,有指针,但是为什么你需要一个? 我想在 c# 中这样做 for(int i=0; i 中创建一个指针 我不知道你为什么要这样做而不是使用托管代码,但如果你真的想要,你需要编写一个不使用托管类型的不安全结构 q_bit 和实现一个不安全的 qbit[] 隐式转换(假设您使用的是 q_bit[]),它返回指向托管数组的第一个元素的指针。问题是我不知道如何做最后一步。 【参考方案1】:

像这样?

q_bit* m_q_bit = new q_bit(/*Enter constructor values as needed/*);

【讨论】:

以上是关于C# 一个关于Graphics类的问题的主要内容,如果未能解决你的问题,请参考以下文章

c# winform 关于绘图的问题,如何定义一个Graphics g作为全局变量

C#画图——Graphics

java_关于Graphics类

如何将 SkiaSharp.SkBitmap 转换为 Android.Graphics.Bitmap?

SurfaceView的简单使用

C#中基于GDI+(Graphics)图像处理系列之前言