C# 无需滚动即可缩放图形

C# 无需滚动即可缩放图形,c#,.net,winforms,graphics,C#,.net,Winforms,Graphics,我有一个用户控件,正在使用ScaleTransform()实现缩放 但是,为了在缩放后将中心内容保持在中心位置,还需要滚动。例如,如果我放大(使物体变大),X和Y原点应该增加,以便大部分内容不会向下和向右移动。(也就是说,当我放大时,一些内容应该会从左侧和顶部消失。) 有没有人计算出随着缩放在X和Y方向上滚动多少 例如: e.Graphics.ScaleTransform(2.0F, 2.0F); e.Graphics.TranslateTransform(?, ?); 我的Translate

我有一个用户控件,正在使用
ScaleTransform()
实现缩放

但是,为了在缩放后将中心内容保持在中心位置,还需要滚动。例如,如果我放大(使物体变大),X和Y原点应该增加,以便大部分内容不会向下和向右移动。(也就是说,当我放大时,一些内容应该会从左侧和顶部消失。)

有没有人计算出随着缩放在X和Y方向上滚动多少

例如:

e.Graphics.ScaleTransform(2.0F, 2.0F);
e.Graphics.TranslateTransform(?, ?);
我的
TranslateTransform()
的参数是什么,以便内容的中心部分保持在中心位置

注意:我没有显示图像。我正在将图形内容绘制到用户控件的表面


或者有更简单的方法?

我猜您使用的是不同的界面,但在我的情况下,这就是完成工作的原因(在鼠标滚轮事件后将鼠标保留在绘图上的原始位置):


我猜您正在使用一些不同的界面,但在我的例子中,这就是完成工作的原因(在鼠标滚轮事件后将鼠标保留在绘图上的原始位置):


这应该行得通,我想不出更容易的办法;它假设您已决定缩放的中心。我选择以面板为中心绘制:

float zoom = 1f;

private void drawPanel1_Paint(object sender, PaintEventArgs e)
{
    Point c = new Point(drawPanel1.ClientSize.Width / 2, drawPanel1.ClientSize.Height / 2);

    // a blue sanity check for testing
    e.Graphics.FillEllipse(Brushes.DodgerBlue, c.X - 3, c.Y - 3, 6, 6);

    // the offsets you were looking for:
    float ox = c.X * ( zoom - 1f);
    float oy = c.Y * ( zoom - 1f);

    // first move and then scale
    e.Graphics.TranslateTransform(-ox, -oy);
    e.Graphics.ScaleTransform(zoom, zoom);

     // now we can draw centered around our point c
    Size sz = new Size(300, 400);
    int count = 10;
    int wx = sz.Width  / count;
    int wy = sz.Height / count;

    for (int i = 0; i < count; i++)
    {
        Rectangle r = new Rectangle(c.X - i * wx / 2 , c.Y - i * wy / 2, i * wx, i * wy );
        e.Graphics.DrawRectangle(Pens.Red, r );
    }
}
float zoom=1f;
私有void drawpanel 1_Paint(对象发送器,PaintEventArgs e)
{
点c=新点(drawPanel1.ClientSize.Width/2,drawPanel1.ClientSize.Height/2);
//用于测试的蓝色健康检查
e、 图形.圆角椭圆(画笔.减淡蓝色,c.X-3,c.Y-3,6,6);
//您要查找的偏移量:
浮动ox=c.X*(缩放-1f);
浮动Y=c.Y*(缩放-1f);
//先移动然后缩放
e、 图形.平移变换(-ox,-oy);
e、 Graphics.ScaleTransform(缩放、缩放);
//现在我们可以以c点为中心画
尺寸sz=新尺寸(300400);
整数计数=10;
int wx=深宽/计数;
int wy=深浅高度/计数;
for(int i=0;i


注意移动和缩放的顺序

这应该行得通,我想不出更容易的办法;它假设您已决定缩放的中心。我选择以面板为中心绘制:

float zoom = 1f;

private void drawPanel1_Paint(object sender, PaintEventArgs e)
{
    Point c = new Point(drawPanel1.ClientSize.Width / 2, drawPanel1.ClientSize.Height / 2);

    // a blue sanity check for testing
    e.Graphics.FillEllipse(Brushes.DodgerBlue, c.X - 3, c.Y - 3, 6, 6);

    // the offsets you were looking for:
    float ox = c.X * ( zoom - 1f);
    float oy = c.Y * ( zoom - 1f);

    // first move and then scale
    e.Graphics.TranslateTransform(-ox, -oy);
    e.Graphics.ScaleTransform(zoom, zoom);

     // now we can draw centered around our point c
    Size sz = new Size(300, 400);
    int count = 10;
    int wx = sz.Width  / count;
    int wy = sz.Height / count;

    for (int i = 0; i < count; i++)
    {
        Rectangle r = new Rectangle(c.X - i * wx / 2 , c.Y - i * wy / 2, i * wx, i * wy );
        e.Graphics.DrawRectangle(Pens.Red, r );
    }
}
float zoom=1f;
私有void drawpanel 1_Paint(对象发送器,PaintEventArgs e)
{
点c=新点(drawPanel1.ClientSize.Width/2,drawPanel1.ClientSize.Height/2);
//用于测试的蓝色健康检查
e、 图形.圆角椭圆(画笔.减淡蓝色,c.X-3,c.Y-3,6,6);
//您要查找的偏移量:
浮动ox=c.X*(缩放-1f);
浮动Y=c.Y*(缩放-1f);
//先移动然后缩放
e、 图形.平移变换(-ox,-oy);
e、 Graphics.ScaleTransform(缩放、缩放);
//现在我们可以以c点为中心画
尺寸sz=新尺寸(300400);
整数计数=10;
int wx=深宽/计数;
int wy=深浅高度/计数;
for(int i=0;i


注意移动和缩放的顺序

AddOffset
TranslateTransform
相同吗?
AddOffset
是我写的一种方法,它只需将图形上的每个点移动(x,y)给定为
offset
。我不知道
TranslateTransform
,我只是在分享将事物保持在相对当前位置的计算。如果你只使用它来保持事物的中心,你应该将
e.X
e.Y
替换为绘图的中心点(
newX=center.X-center.X/factor;
)。
AddOffset
translateransform
相同吗?
AddOffset
是我写的方法,它只是简单地将图形上的每个点移动(x,y)给定为
offset
。我不知道
TranslateTransform
,我只是在分享将事物保持在相对当前位置的计算。如果你只应该用它来保持事物的中心,你应该替换
e.X
e.Y
作为你画的中心点(
newX=center.X-center.X/factor;
)。是的,这就是我要找的。只需要将它与其他一些滚动代码进行协调。谢谢是的,这就是我要找的。只需要将它与其他一些滚动代码进行协调。谢谢