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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# winform 关于绘图的问题,如何定义一个Graphics g作为全局变量相关的知识,希望对你有一定的参考价值。

程序中有时候会旋转坐标系,但是在一个方法中旋转坐标系后,在另一个方法中还需要重新旋转,因为在新方法中我Graphics g = picturebox1.CreateGraphics();所以我在程序开头
public partial class Form1 : Form

public SerialPort com;
public Thread _readThread;
public bool _keepReading;
public double X=0;
public double Y = 0;
public Graphics g;
......
......

但是在这个地方我无法Graphics g = picturebox1.CreateGraphics();会出错,所以我就没有定义值,在Load的时候给予赋值,但是当其他方法是用g中的函数是,总说我g没有初始化,怎么解决这个问题。

你这样试试 我的就是这样做的。新建一个Bitmap,bmp为全局变量,然后再画
bmp = new Bitmap(this.Width, this.Height);
using (Graphics g = Graphics.FromImage(bmp))

pictureBox1.Image = bmp;

只要用到g的时候 就 这样写
using (Graphics g = Graphics.FromImage(bmp))

中间是你的代码

就可以了 。
参考技术A   不用这么麻烦定义全局的Graphics,一般也没有这么做的
  你的pictureBox已经是全局变量,可以这样获得Graphics对象
  Graphics g =Graphics .FromHandle(picturebox1.Handle);
参考技术B 你试试把这个定义成个static静态的变量 ,Graphics每次好像在页面稍微一改动,就从新加载了,在Onpaint里面重绘控件 参考技术C 使用单件模式,定义一个属性,在第一次使用的时候创建,之后直接使用这个graphics
Graohics _g; //不要使用_g,使用g绘制
Graphics g

get


lock(this)



if(_g != null)


return _g;


lock(this)


_g = picturebox1.CreateGraphics();
return _g;






C#下MSchart的应用总结

【WinForm】MSChart主要属性

一、绘图区域ChartAreas

在一个Chart控件中可增加多个绘图区域,每个绘图区域包含独立的图表组、数据源,可用于多个图表类型。

1.AlignmentOrientation:图表区对齐方向,定义两个绘图区域间的对齐方式,默认为Vertical。

2.AlignmentStyle:图表区对齐类型,定义图表间用以对其的元素。

3.AlignWithChartArea:参照对齐的绘图区名称。

4.InnerPlotPosition:图表在绘图区内的位置属性。

  a.Auto:是否自动对齐。

  b.Height:图表在绘图区内的高度(百分比,取值在0-100)

  c.Width:图表在绘图区内的宽度(百分比,取值在0-100)

  d.X,Y:图表在绘图区内左上角坐标

5.Position:绘图区位置属性,选项如同InnerPlotPosition。

6.Name:绘图区名称。

7.Axes:坐标轴集合-非常重要的部分,可分别设置X轴(X axis),Y轴(Y axis),第二X轴(SecnondaryX axis)和第二Y轴(Secnondary Y axis),常用的属性包括:

 a.ArrowStyle设置坐标轴是否有箭头

  b.Interval:轴刻度间隔大小

 c.IntervalOffset:轴刻度偏移量大小

 d.LableStyle 设置坐标轴的文字大小等

  e.MajorGrid:主要辅助线

 f.MajorTickMark:主要刻度线

 g.MinorTickMark:次要刻度线

 h.MinorGrid:次要辅助线

  i.Title:坐标轴标题

  j.TitleAlignment:坐标轴标题对齐方式

二、数据系列Series

Series:最重要的属性,图表集合,就是最终看到的饼图、柱状图、线图、点图等构成的合;可以将多种相互兼容的类型放在一个绘图区域内,形成复合图。

1.ChartArea:图表所属的绘图区域名称

2.ChartType:图表类型(柱形、饼形、线形、点形等)

3.IsValueShownAsLabel:是否显示数据点标签,如果为true,在图表中显示每一个数据值

4.Label:数据点标签文本

5.LabelFormat:数据点标签文本格式

6.LabelAngle:标签字体角度

7.Legend:当前数据系列(图表)使用的图例名称

8.Name:数据系列的名称

9.Palette:数据系列(图表)外观定义

10.Points:数据点集合,构成数据系列的点

11.XValueMember:横坐标绑定的数据源

12.XValueType:横坐标轴类型

13.YValueMembers:纵坐标绑定的数据源

14.YValueType:纵坐标轴类型

、图例Legends

MSChart的图例默认不显示,但可进行如下设置:

1.Alignment:对齐方式

2.AutoFitMinFontSize:当IsTextAutoFit为true时,显示的最小字体

3.BackColor:背景颜色,当本身的绘图区域有背景时,将其设置为transparent效果更佳。

4.enabled:是否显示图例

5.IsTextAutoFit:文字大小根据图例区域的大小自动调整

6.Position:图例出现的位置

 

 

 

技术分享

从图中可以看到一个chart可以绘制多个ChartArea,每个ChartArea都可以绘制多条Series。ChartArea就是就是绘图区域,可以有多个ChartArea叠加在一起,series是画在ChartAarea上的,Series英文意思是“序列、连续”,其实就是数据线,它可以是曲线、点、柱形、条形、饼图...可以注意该chart当数据非常多的时候可以通过鼠标选择查看区域,进一步拖拽横纵向滚动条来缩小曲线图查看。

 

一、数据源:

    数据返回方式是DataSet.Tables[0],即DataTable,也是最基本的数据源方式。这里只介绍DataTable绑定数据源,很简单:

                chartData.DataSource = dt;

                chartData.DataBind();

二、Series:

   Series是画在ChartArea上的线、点、柱形、条形、饼图,简单点儿说就是画在上面的数据,直接说属性,

 1. “标记”:就是数据点,某个数据值的点。如下图所示:

技术分享

技术分享

 

3. “Font”:数据标签上的字体和样式

Font                      标签字体设置

     Font.Unit                 个人设置此值为Document,自己体会

     LabelAngle                标签角度,斜多少度,建议就正着

     LabelBackColor            标签背景颜色

     LabelBorderColor          标签边框颜色

      LabelBorderDahStyle       标签边框样式

     LabelBorderWidth          标签边框宽度

     LabelForeColor            标签字体颜色

     其他属性自己试

4、空白点(EmptyPointStyle):就是连续的数据,譬如X轴对应Y轴没数据,或Y轴对应X轴没数据,这样的数据点可以对其设置相应的属性;

 

5、数据源:注意这里是Series的数据源(XValueMember、YValueMembers)

注意:
    第一,这两个属性对应的是DataTable的两个列,也就是一般的X轴对应时间,Y轴对应数据值,但是也要注意对DataTable的每个数据单元的值做判断,尤其是DBNull或空。我这里的数据库的NewDateTime列数据类型是DateTime类型,NewFyj是Double类型。

    第二,Series的数据源和Chart控件的数据源有区别,只有DataTable先绑定了Chart,Series才对应到列,否则无法对应。

6. 图表(ChartArea):也就是Serie画在哪个ChartArea上,ChartType是Serie的图表类型,也就是画何种图,曲线图、直线图、点、柱状图、饼图等...

7. 图例(Legend):也就是每个Serie的名字和样式,只要创建Serie就会自动产生加载在Legend里,里面的属性可以试一下,如果想调整Legend的位置,可以去Legend集合里设置,比较简单,这里不多说

8. 映射区(TooTip):鼠标放在数据点上出现的小提示,建议用代码控制;

9. 杂项:  EmptyPointValue:空数据点的值做平均还是做零处理

         LabelStyle: 对标签硬性的规定显示在数据点旁的哪个位置

10. 轴:也就是X轴和Y轴,X轴有主轴和副轴,Y轴也有主轴和副轴,主轴为Primary,副轴为Secondary。X主轴在下方,Y主轴在右方,X副轴在上方,Y副轴在右方。

 

三、ChartAreas:

Chart控件里最重要的,每个Serie都画在ChartArea上,Chart控件可以有多个ChartArea叠加在一起显示。比如第一个ChartArea绘制的是曲线,第二个画的柱状图或者是别的,这也是上面说过的Serie的ChartType,我们也可以把多个Serie画在一个ChartArea上,但是如果有一个列数据单位范围在500~10000之间的数据浮动最大,有一列数据单位范围在0.1~2.0之间,有一列数据单位范围在50~100之间,那画在同一个ChartArea上显示的话,0.1到2.0的数据会变成一条直线。当只有1、2条这样的数据时,可以在Serie中设置主轴和副轴,但当出现多条数据,多种类型的显示,就需要多个ChartArea来解决了。

 

1.      对齐:ChartArea对齐方式;

AlignmentOrientation水平对齐、垂直对齐、全部对齐

AlignmentStyle  根据哪种方式对齐   AlignmentWithChartArea和哪个对齐

2.      三维(Area3DStyle):自己试试,效果很沉重,不是很好;

3.      外观:可以对ChartArea颜色、边框、位置的设置;

注意:

  第一,InnerPlotPosition和Position一个是大的,一个是内部绘制的,试一下就明白了,这里最重要的是多个ChartArea重叠在一起的时候,两个Position一定要设置相同,否则就重叠不上了。

 第二,多个ChartArea重叠在一起的时候,颜色或图片只能在叠在最底下的ChartArea来设置,上面的ChartArea都设置为透明即可,最底下的ChartArea是ChartAreas[0],所以不要设置错。

4.      游标:CursorX和CursorY,就是横向和纵向滚动条, 首先强调一下,只要想选择区域细看曲线图,就一定要启用游标,游标的设置只能在叠加在最上面的ChartArea进行设置,也就是ChartArea[ChartArea.Count-1],X轴和Y轴上都可以有游标,可以拖动,可以注意看有个按钮上面有个圆圈,就是向后退,滑动用户选择的区域,松开鼠标就会变成该区域的图形;

5.      轴Axes!!:非常重要,一个ChartArea有4个轴:主轴X axis、主轴Y(Value)axis、副轴X axis、副轴Y(Value)axis,每个轴属性均相同;属性:标签、间隔(Interval)、标题、数据视图(ScaleView)、滑动条(ScrollBar),外观、网络刻度线等;

注意:  ScaleView是数据视图,也就是当前绘制出图表的一个区域,如果用鼠标选择某个区域展开显示,新展开的就又是一个ScaleView,只把它想成当前显示的视图就好理解了。ScrollBar就是游标,之前我们说的ChartArea.CursorX或Y是也是游标,这里的ScrollBar是滚动条,仔细看两者的属性不难发现,一个是选择区域,一个是拖拽滚动条查看所有数据。

以上是关于c# winform 关于绘图的问题,如何定义一个Graphics g作为全局变量的主要内容,如果未能解决你的问题,请参考以下文章

C# (winform)如何改变控件形状

C# winform 类似于如下图显示用啥控件绑定并实现分页

请问C# winform如何实现将一个不规则形状的图片弄成按键?

C#下MSchart的应用总结

C# WinForm获得主窗体——如何判断哪个是主窗体

C# SkiaSharp OpenTK Winform - 如何从后台线程中绘制?