Эквивалент .Net для ScaleHeight и Scalewidth - PullRequest
2 голосов
/ 17 февраля 2009

По сути, я пытаюсь сделать свою работу по рисованию проще.

Еще во времена VB6 существовало нечто, называемое Scalewidth и Scaleheight, и я мог установить для них пользовательские значения. Ex. 100.

Тогда, когда мне нужно было нарисовать точку в центре доступного пространства, я бы просто нарисовал ее на 50,50.

Есть ли способ .Net, что я могу получить аналогичную функциональность?

Так что независимо от того, какого размера я получу холст, я могу рисовать на нем, используя абсолютные координаты.

Ответы [ 3 ]

1 голос
/ 18 февраля 2009

Во-первых, почему бы вам не использовать Graphics.ScaleTransform вместо того, чтобы обрабатывать все масштабирование самостоятельно? Что-то вроде:

e.Graphics.ScaleTransform( 
  100.0 / this.ClientSize.Width, 
  100.0 / this.ClientSize.Height );

Ваш код станет намного понятнее, и я бы поспорил, что пиво будет немного быстрее.

Во-вторых, если вы придерживаетесь своих функций cnvX / rcnvX, обязательно используйте this.ClientSize.Width (и то же самое для высоты) вместо «this.Width».

1 голос
/ 17 февраля 2009

Я не знаю, есть ли способ добиться этого в .NET, но вы могли бы легко реализовать это самостоятельно:

// Unscaled coordinates = x, y; canvas size = w, h;
// Scaled coordinates = sx, sy; Scalewidth, Scaleheight = sw, sh;
x = (sx / sw) * w;
y = (sy / sh) * h;

// Or the other way round
sx = (x / w) * sw;
sy = (y / h) * sh;
0 голосов
/ 18 февраля 2009

У Schnaader была правильная идея ... В итоге я реализовал четыре функции для этого. Функции ниже

private float cnvX(double x)
{
    return (float)((Width / 100.00) * x);
}

private float rcnvX(double x)
{
    return (float)(x / Width) * 100;
}

private float rcnvY(double y)
{
    return (float)((y / Height) * 100);
}

private float cnvY(double y)
{
    return (float)((Height / 100.00) * y);
}
...