首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用graphics.ScaleTransform绘图

用graphics.ScaleTransform绘图
EN

Stack Overflow用户
提问于 2018-06-14 07:11:48
回答 1查看 3K关注 0票数 2

目前,我开发了一个ChartControl,在我看来,它运行得很好,但是现在我已经到了能够放大绘制信号以进行更好分析的时候了。

现在,我计算出所需的点如下:

代码语言:javascript
复制
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);
}

但问题是:当它放大时,变焦太大了,超出了我的控制范围。

是否有一种方法来指定应该缩放的区域(缩放)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-14 10:18:11

对于最后一个问题:是否有一种方法来指定应该缩放的区域?您需要SetClipTranslateTransformScaleTransform的组合。

下面是一个例子。

它使用的是

  • 显示缩放图形的目标矩形zoomTgtArea
  • 鼠标位置zoomOrigin,其中变焦原点是,
  • 浮子zoomFactor,正float

初始值:

代码语言:javascript
复制
Rectangle zoomTgtArea = new Rectangle(300, 500, 200, 200);
Point zoomOrigin = Point.Empty;   // updated in MouseMove when button is pressed
float zoomFactor = 2f;

只放大部分图形的诀窍是将图形显示两次,一次是正常的,一次是使用Graphics对象的转换。

让我们试试:

代码语言:javascript
复制
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很简单:

代码语言:javascript
复制
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);
}

唯一的额外措施是清除背景,这样普通的绘图就不会在放大版中发光。

让我们看看:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50851597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档