ZedGraph中調用GDI+中的DrawArc()方法畫圓弧


各位,我想在ZedGraph中調用GDI+中的DrawArc()方法畫圓弧,現圖形能生成出來,出現幾個問題總結如下,

1:   當點擊圖形顯示區域或縮放時,圖形就會消失,當添加這個代碼后  this.zedGraphControl1.Refresh();,圖形只會在BUTTON點擊時閃下就消失。
2:  當我縮放圖形顯示區域后,再次點擊BUTTON,出現的圖形大小沒有縮小或放大。
3:  同時想問下,在ZedGraph中調用GDI+中的DrawArc()方法畫圓弧后圖形是否支持縮放等功能。
代碼如下:
 public class MyEllipseObj : EllipseObj
    {
        public override void Draw(Graphics g, PaneBase pane, float scaleFactor)
        {
          
            base.Draw(g, pane, scaleFactor);
        }
    }
   private void button2_Click(object sender, EventArgs e)
        {
            var myPane = new MyGraphPane();
            zedGraphControl1.GraphPane = myPane;

           // GraphPane myPane = zedGraphControl1.GraphPane;

            MyEllipseObj ellipse = new MyEllipseObj();
            ellipse.Location.CoordinateFrame = CoordType.AxisXYScale;
            //
            Graphics gra = this.zedGraphControl1.CreateGraphics();
            //畫筆
            Pen mypen = new Pen(Color.Blue, 1);
            //矩形
            Rectangle myrec = new Rectangle(100, 100, 180, 180);
            //畫圓弧的方法
            gra.DrawArc(mypen, myrec, 180, 180);

            ellipse.Draw(gra, myPane, 5);
            
           this.zedGraphControl1.AxisChange();
            //this.zedGraphControl1.Refresh();

        }
大概估計還是我的代碼有點問題,現求助各位,如果有相關代碼或資料請提供下,不盛感謝。

11 个解决方案

#1


繪圖部分應放到Paint事件下,否則窗體發生重繪你的畫面就不見了

#2


引用 1 樓 hwenycocodq520 的回復:
繪圖部分應放到Paint事件下,否則窗體發生重繪你的畫面就不見了


你好,我把上面BUTTON事件里的代碼放到BUTTON 的PAIT 事件中,發現當光標移動BUTTON按鈕上時(還沒點擊)圖形就會出來,當縮放圖形時圖形也會消失。再次請教。

#3


要保持住圖形,繪圖部分的代碼要放到 zedGraphControl1.Paint 事件中。

要讓圖形能夠隨graph chart縮放,要把坐標定義成圖表上的坐標,比如:
var location = new Location(0.5, 0.5, CoordType.AxisXYScale);
然后在畫圖之前轉換成屏幕坐標:
PointF pt = location.TransformRect(pane);
得到pt就是屏幕上的窗口坐標,pane是要參照的圖表窗格,通常就是zedGraphControl.GraphPane

#4


要在ZedGraph基礎上擴展自己的功能,最好要以符合ZedGraph設計框架的方式進行擴展。
比如畫弧線可以擴展成一個ArcObj:

public class ArcObj : GraphObj
{
public ArcObj(RectangleF? rect = null, float startAngle = 0, float sweepAngle = 180, Color? arcColor = null)
{
var rc = rect ?? new RectangleF(0, 0, 1, 1);
base._location = new Location(rc.X, rc.Y, rc.Width, rc.Height, CoordType.AxisXYScale, AlignH.Center, AlignV.Center);
this.Arc = new Border(arcColor?? Color.Black, 1);
this.StartAngle = startAngle;
this.SweepAngle = sweepAngle;
}

public Border Arc { get; set; }
public float StartAngle { get; set; }
public float SweepAngle { get; set; }

public override void Draw(Graphics g, PaneBase pane, float scaleFactor)
{
RectangleF rect = base.Location.TransformRect(pane);
using (var pen = Arc.GetPen(pane, scaleFactor))
g.DrawArc(pen, rect, StartAngle, SweepAngle);
}

public override void GetCoords(PaneBase pane, Graphics g, float scaleFactor, out string shape, out string coords)
{
RectangleF rc = base._location.TransformRect(pane);
shape = "arc";
coords = string.Format("{0:f0},{1:f0},{2:f0},{3:f0},{4:f0}-{5:f0}", 
new object[] { rc.Left, rc.Top, rc.Right, rc.Bottom, StartAngle, SweepAngle});
}
}

然后調用的時候就是這樣:
var arc = new ArcObj(new RectangleF(0, 1, .8f,.5f), 0, -180, Color.Blue);
zedGraphControl1.GraphPane.GraphObjList.Add(arc);
this.zedGraphControl1.Refresh();

#5


引用 4 樓 jshi123 的回復:
要在ZedGraph基礎上擴展自己的功能,最好要以符合ZedGraph設計框架的方式進行擴展。
比如畫弧線可以擴展成一個ArcObj:

public class ArcObj : GraphObj
{
public ArcObj(RectangleF? rect = null, float startAngle = 0, float sweepAngle = 180, Color? arcColor = null)
{
var rc = rect ?? new RectangleF(0, 0, 1, 1);
base._location = new Location(rc.X, rc.Y, rc.Width, rc.Height, CoordType.AxisXYScale, AlignH.Center, AlignV.Center);
this.Arc = new Border(arcColor?? Color.Black, 1);
this.StartAngle = startAngle;
this.SweepAngle = sweepAngle;
}

public Border Arc { get; set; }
public float StartAngle { get; set; }
public float SweepAngle { get; set; }

public override void Draw(Graphics g, PaneBase pane, float scaleFactor)
{
RectangleF rect = base.Location.TransformRect(pane);
using (var pen = Arc.GetPen(pane, scaleFactor))
g.DrawArc(pen, rect, StartAngle, SweepAngle);
}

public override void GetCoords(PaneBase pane, Graphics g, float scaleFactor, out string shape, out string coords)
{
RectangleF rc = base._location.TransformRect(pane);
shape = "arc";
coords = string.Format("{0:f0},{1:f0},{2:f0},{3:f0},{4:f0}-{5:f0}", 
new object[] { rc.Left, rc.Top, rc.Right, rc.Bottom, StartAngle, SweepAngle});
}
}

然后調用的時候就是這樣:
var arc = new ArcObj(new RectangleF(0, 1, .8f,.5f), 0, -180, Color.Blue);
zedGraphControl1.GraphPane.GraphObjList.Add(arc);
this.zedGraphControl1.Refresh();


A:首先,讓我對你說什么好呢,回貼的還是你,答的正確無誤的還是你,回的這么詳細的還是你。讓我怎么感謝你呢,以身相許吧,我是男兒身,沒辦法啊(玩笑)。還是再次感謝。
B: 代碼我測試了下,沒問題,但我擴展了些代碼,想加些功能,但沒成功,現求助
1:我的圖形代碼是寫在BUTTON事件里面的,(因為我需要在每次點擊后才讓它生成,其它情況下就不用生成)我在里
    面加了兩條代碼,如下:
            this.zedGraphControl1.GraphPane.XAxis.Scale.MaxAuto = true;
            this.zedGraphControl1.GraphPane.YAxis.Scale.MaxAuto = true;
   主要是想實現自動跟據生成圖形的尺寸大小,自動調整XY坐標刻度范圍。每次圖形是可以生成出來,但要放大窗 口才能顯示,也就是窗口沒自動縮放,不知為何???????
2:我想在窗口加載后(還沒點擊BUTTON事件,也沒生成圖形)顯示一定刻度范圍內的坐標,也就在窗體的LOAD事件,或ZedGraph的Paint事件中加了兩條代碼如下: (原因是默認窗口刻度線尺寸值太小。)           this.zedGraphControl1.GraphPane.XAxis.Scale.Max = 300;
            this.zedGraphControl1.GraphPane.YAxis.Scale.Max = 300;
但當窗口加載后,XY軸刻度線上附件顯示很粗的線,需滾動鼠標滾輪才會正常顯示,不知這是什么情況???還是我的代碼不能這樣寫。
3:為什么你們都讓我把圖形代碼寫在ZedGraph的Paint事件里呢???(沒有冒犯之意,只是想搞清楚原由)我寫在BUTTON1事件里,也可以,同時當我點擊BUTTON2事件也會在ZedGraph里再生成一個圖形(兩個圖形不一樣,第一次生成的圖形也在)我這樣寫主要是,有時客戶要求再向窗口中添加幾個圖形,同時還要保留原來的圖形。
4:ZedGraph控件是否有包含圖形(指令生成的圖形)旋轉,左右上下移動的指令,如果有的話,請給指令代碼,謝謝。
5:能告訴我你上面給的代碼是你自己寫的,還是查網上的資料(不過我在網上還是沒找到。),給幾個鏈接,問題有點多啊,麻煩了哦。

#6


1。坐標軸范圍、刻度調整后需要加上下面的語句才能刷新:
    zedGraphControl1.AxisChange();
    zedGraphControl1.Refresh();

2。坐標范圍變大后,相應地刻度間隔值也要放大,否則刻度線就會擠在一起。可以把刻度設成自動間隔:
    this.zedGraphControl1.GraphPane.XAxis.Scale.MajorStepAuto = true;
    this.zedGraphControl1.GraphPane.YAxis.Scale.MajorStepAuto = true;
    this.zedGraphControl1.GraphPane.XAxis.Scale.MinorStepAuto = true;
    this.zedGraphControl1.GraphPane.YAxis.Scale.MinorStepAuto = true;

3。ZedGraphControl.Paint事件是當圖表控件窗口需要重畫時觸發,比如控件被遮擋、縮放、在程序間切換等。而ZedGraphControl需要重畫時,並不保證會觸發button.Paint事件。添加圖形的方式請參照ArcObj的做法,這是“標准”的做法。

4。沒有,需要自己實現。參考:
    http://msdn.microsoft.com/en-us/library/a0z3f662.aspx
    http://msdn.microsoft.com/en-us/library/6a1d65f4.aspx
   已經圖形變換的相關基礎知識:
    http://msdn.microsoft.com/en-us/library/3zxbwxch.aspx

5。這個代碼是我自己寫的。ZedGraph是開源的,你可以下載它的源碼,模仿EllipseObj可以很容易做出其它類型的圖形對象。上次給你的wiki鏈接和forum就是比較集中的資源:
    http://sourceforge.net/p/zedgraph/discussion/392232/
   


#7


引用 6 樓 jshi123 的回復:
1。坐標軸范圍、刻度調整后需要加上下面的語句才能刷新:
    zedGraphControl1.AxisChange();
    zedGraphControl1.Refresh();

2。坐標范圍變大后,相應地刻度間隔值也要放大,否則刻度線就會擠在一起。可以把刻度設成自動間隔:
    this.zedGraphControl1.GraphPane.XAxis.Scale.MajorStepAuto = true;
    this.zedGraphControl1.GraphPane.YAxis.Scale.MajorStepAuto = true;
    this.zedGraphControl1.GraphPane.XAxis.Scale.MinorStepAuto = true;
    this.zedGraphControl1.GraphPane.YAxis.Scale.MinorStepAuto = true;

3。ZedGraphControl.Paint事件是當圖表控件窗口需要重畫時觸發,比如控件被遮擋、縮放、在程序間切換等。而ZedGraphControl需要重畫時,並不保證會觸發button.Paint事件。添加圖形的方式請參照ArcObj的做法,這是“標准”的做法。

4。沒有,需要自己實現。參考:
    http://msdn.microsoft.com/en-us/library/a0z3f662.aspx
    http://msdn.microsoft.com/en-us/library/6a1d65f4.aspx
   已經圖形變換的相關基礎知識:
    http://msdn.microsoft.com/en-us/library/3zxbwxch.aspx

5。這個代碼是我自己寫的。ZedGraph是開源的,你可以下載它的源碼,模仿EllipseObj可以很容易做出其它類型的圖形對象。上次給你的wiki鏈接和forum就是比較集中的資源:
    http://sourceforge.net/p/zedgraph/discussion/392232/
   


你好,非常感謝。
但現在第三條有點迷惑,就是:如果我把圖形代碼寫在ZedGraph的Paint事件里,當我想向窗口中額外再添加一個圖形時(原先窗口中已包含有圖形)我怎樣通過一個BUTTON 按鈕來控制。(也就是想通過一個BUTTON按鈕來實現圖形的添加,同時又要保證,當圖形在窗口切換,控件被遮擋時 圖形能夠自動重繪。)
謝謝。

#8


參照ArcObj的做法,在button的click事件中加上:
var arc = new ArcObj(new RectangleF(0, 1, .8f,.5f), 0, -180, Color.Blue);
zedGraphControl1.GraphPane.GraphObjList.Add(arc);
this.zedGraphControl1.Refresh();

#9


引用 8 樓 jshi123 的回復:
參照ArcObj的做法,在button的click事件中加上:
var arc = new ArcObj(new RectangleF(0, 1, .8f,.5f), 0, -180, Color.Blue);
zedGraphControl1.GraphPane.GraphObjList.Add(arc);
this.zedGraphControl1.Refresh();


可能是我沒表達清楚我的意思吧.
我是想通過BUTTON按鈕來控制圖形的生成,同時,當我窗口切換,控件遮擋時,圖形能夠自動重繪恢復(不用再去點擊BUTTON事件來生成),上面你給的代碼需要再次點擊BUTTON按鈕。

#10


不需要再次點擊,一旦用Add方法把圖形加入到圖表中,在需要重畫的時候,ZedGraph會自動調用GraphObj.Draw方法,所以你在Draw方法里寫畫圖的方法就好了。

#11


引用 10 樓 jshi123 的回復:
不需要再次點擊,一旦用Add方法把圖形加入到圖表中,在需要重畫的時候,ZedGraph會自動調用GraphObj.Draw方法,所以你在Draw方法里寫畫圖的方法就好了。


THANKS YOU 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com