如何改变Graphics的坐标系原点

时间:2021-08-17 23:16:33
Graphics默认的坐标系原点在左上角,请问如何设置可以让原点在右上角?

9 个解决方案

#1


up

#2


补充一下:是直接投置到右上角,而不是通过相对左上角的一个变换而实现.
不知道能不能这样.

#3


难道真的没有办法吗,郁闷...

#4


Graphics vGraphics = Graphics.FromHwnd(Handle);
vGraphics.TranslateTransform(ClientSize.Width, 0);
vGraphics.DrawLine(Pens.Black, new Point(-10, 10), new Point(-10, 100));

TranslateTransform()方法可以改变原点RotateTransform()方法可以旋转坐标系

#5


这个方法我知道,其实是我没有把问题表达清楚.在发生Paint事件时,里面的e.Graphics也总是以左上角为原点的,而每次Paint后都用平移和旋转来改到右上角,是画不到想要的图的,这可能是Paint里每次更新图形的方式所造成的.
而我希望实现的效果是,当改变Client(如PictureBox)的大少时,图形是跟随着右上角移动,而不是默认的左上角.
这样表达问题应该比较清晰了,希望指教.

#6


up

#7


//这样可以吗?
private void pictureBox1_Resize(object sender, EventArgs e)
{
    pictureBox1.Padding = new Padding(
        pictureBox1.ClientSize.Width - pictureBox1.Image.Width, 0, 0, 0);
}

#8


private void pictureBox1_ClientSizeChanged(object sender ,EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
g.TranslateTransform(pictureBox1.Width - 1024 ,0);
                           //image为一个Bitmap实例
g.DrawImage(image ,0 ,0);
}
这样可以让图像跟着右上角走,但是由于在改变pictrueBox1大小时开销比较大,造成图像不稳定,不过这也在意料之中,Piant事件中响应所得的图像是只更新了新出来的部分所以会比较稳定,但是它Graphics的默认坐标原点始终在左上角,所以拉宽时图像就是从右边出来,不会从左边出来,要实现很稳定的图像从右边出来,估计要重写PictrueBox里的一些东西和Graphics了.好像很复杂,唯有慢慢研究了.
不知道这种想法合不合理呢.

#9


那个pictureBox1.Width - 1024 应该为pictureBox1.Width - image.Width

#1


up

#2


补充一下:是直接投置到右上角,而不是通过相对左上角的一个变换而实现.
不知道能不能这样.

#3


难道真的没有办法吗,郁闷...

#4


Graphics vGraphics = Graphics.FromHwnd(Handle);
vGraphics.TranslateTransform(ClientSize.Width, 0);
vGraphics.DrawLine(Pens.Black, new Point(-10, 10), new Point(-10, 100));

TranslateTransform()方法可以改变原点RotateTransform()方法可以旋转坐标系

#5


这个方法我知道,其实是我没有把问题表达清楚.在发生Paint事件时,里面的e.Graphics也总是以左上角为原点的,而每次Paint后都用平移和旋转来改到右上角,是画不到想要的图的,这可能是Paint里每次更新图形的方式所造成的.
而我希望实现的效果是,当改变Client(如PictureBox)的大少时,图形是跟随着右上角移动,而不是默认的左上角.
这样表达问题应该比较清晰了,希望指教.

#6


up

#7


//这样可以吗?
private void pictureBox1_Resize(object sender, EventArgs e)
{
    pictureBox1.Padding = new Padding(
        pictureBox1.ClientSize.Width - pictureBox1.Image.Width, 0, 0, 0);
}

#8


private void pictureBox1_ClientSizeChanged(object sender ,EventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
g.TranslateTransform(pictureBox1.Width - 1024 ,0);
                           //image为一个Bitmap实例
g.DrawImage(image ,0 ,0);
}
这样可以让图像跟着右上角走,但是由于在改变pictrueBox1大小时开销比较大,造成图像不稳定,不过这也在意料之中,Piant事件中响应所得的图像是只更新了新出来的部分所以会比较稳定,但是它Graphics的默认坐标原点始终在左上角,所以拉宽时图像就是从右边出来,不会从左边出来,要实现很稳定的图像从右边出来,估计要重写PictrueBox里的一些东西和Graphics了.好像很复杂,唯有慢慢研究了.
不知道这种想法合不合理呢.

#9


那个pictureBox1.Width - 1024 应该为pictureBox1.Width - image.Width