Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在图形上使用graphics.ScaleTransform_C#_Gdi+_Gdi_Graphics2d - Fatal编程技术网

C# 在图形上使用graphics.ScaleTransform

C# 在图形上使用graphics.ScaleTransform,c#,gdi+,gdi,graphics2d,C#,Gdi+,Gdi,Graphics2d,目前我开发了一个ChartControl,在我看来,它运行得非常好, 但现在我已经到了一个地步,如果能够放大绘制的信号以便更好地分析,那就太好了 此时,我计算所需的点,如下所示: for (int i = 0; i < PointsCount; i++){ xAxisPoint = xAxisOP.X + i * (xAxisWidth / PointsCount); yAxisPoint = yAxisHeight * data[i].Point / Divisor;

目前我开发了一个ChartControl,在我看来,它运行得非常好, 但现在我已经到了一个地步,如果能够放大绘制的信号以便更好地分析,那就太好了

此时,我计算所需的点,如下所示:

for (int i = 0; i < PointsCount; i++){
    xAxisPoint = xAxisOP.X + i * (xAxisWidth / PointsCount);
    yAxisPoint = yAxisHeight * data[i].Point / Divisor;

    if(yAxisPoint > yAxisHeight){
        yAxisPoint = yAxisHeight;  
    }

    if(yAxisPoint < -yAxisHeight){
        yAxisPoint = -yAxisHeight;
    }

    Points[i] = new PointF(xAxisPoint, yAxisOP.Y + yAxisPoint);
}

if(zoom){
    graphics.ScaleTransform(0.2f*ZoomFactor, 0.2f*ZoomFactor);
}

using (Pen plotPen = new Pen(plotColor, 1)){
    graphics.DrawLines(plotPen, Points);
}
for(int i=0;iyAxisHeight){
yAxisPoint=yAxisHeight;
}
如果(yAxisPoint<-yAxisHeight){
yAxisPoint=-yAxisHeight;
}
点[i]=新点F(xAxisPoint,yAxisOP.Y+yAxisPoint);
}
如果(缩放){
graphics.ScaleTransform(0.2f*缩放因子,0.2f*缩放因子);
}
使用(画笔绘图画笔=新画笔(绘图颜色,1)){
图形.绘图线(绘图笔、点);
}
但问题是:当它放大时,缩放太大,超出了我的控制范围

有没有办法指定要缩放的区域?最后一个问题是:有没有办法指定要缩放的区域?你需要一个,和的组合

这里有一个例子

它使用一个

  • 显示缩放图形的目标矩形
    zoomTgtArea
  • 缩放原点所在的鼠标位置
    zoomOrigin
  • 一个浮点
    缩放因子
    ,一个正的
    浮点
初始值:

Rectangle zoomTgtArea = new Rectangle(300, 500, 200, 200);
Point zoomOrigin = Point.Empty;   // updated in MouseMove when button is pressed
float zoomFactor = 2f;
仅放大部分图形的诀窍是将图形显示两次,一次正常显示,一次随
图形对象的变换显示

让我们试试:

private void pictureBox_Paint(object sender, PaintEventArgs e)
{
    // normal drawing
    DrawStuff(e.Graphics);

    // for the movable zoom we want a small correction
    Rectangle cr = pictureBox.ClientRectangle;
    float pcw =  cr.Width / (cr.Width - ZoomTgtArea.Width / 2f) ;
    float pch =  cr.Height / (cr.Height - ZoomTgtArea.Height / 2f) ;

    // now we prepare the graphics object; note: order matters!
    e.Graphics.SetClip(zoomTgtArea );
     // we can either follow the mouse or keep the output area fixed:
    if (cbx_fixed.Checked)
        e.Graphics.TranslateTransform( ZoomTgtArea.X -  zoomCenter.X * zoomFactor,
                                        ZoomTgtArea.Y -  zoomCenter.Y * zoomFactor);
    else
        e.Graphics.TranslateTransform(  - zoomCenter.X * zoomFactor * pcw,
                                        - zoomCenter.Y * zoomFactor * pch);
    // finally zoom
    e.Graphics.ScaleTransform(zoomFactor, zoomFactor);

    // and display zoomed
    DrawStuff(e.Graphics);
}
我使用的
DrawStuff
很简单:

void DrawStuff(Graphics g)
{
    bool isZoomed = g.Transform.Elements[0]!= 1   
                ||  g.Transform.OffsetX != 0 | g.Transform.OffsetY != 0;
    if (isZoomed) g.Clear(Color.Gainsboro);   // pick your back color

    // all your drawing here!
    Rectangle r =  new Rectangle(10, 10, 500, 800);  // some size
    using (Font f = new Font("Tahoma", 11f))
        g.DrawString(text, f, Brushes.DarkSlateBlue, r);
}
它唯一的额外功能是清除背景,这样普通的图形就不会在缩放后的版本中闪烁

让我们看看:


您没有使用MSChart控件?-还有,@TaW我没有使用MSChart,因为我是一名学徒,应该自己学习。还有:什么是ZoomFactor?另外:不,缩放总是覆盖整个区域。但您可以以各种比例组合图形,也可以通过SetClip设置不同的剪裁区域;所以实际上你也可以得到同样的效果。你要求的是TranslateTransform。@HansPassant好的,你能解释一下如何使用它吗?我已经更新了答案,做了一些小的修改,第二个图片框设置为光标位置?没有第二个图片框。我在同一张纸上画的。但是,是的,
MouseMove中的
zoomCenter=e.Location
好的,然后我会根据我的需要调整它,因为我需要一个单独的框来显示,并且我有一条抽绳()但是thx非常复杂,而且也有点混乱,因为您的事件处理程序名为pictureBox_Paint,在事件中,您正在谈论PictureBox2,但您从未提到如何显示矩形r或ZoomArea。