Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 09.05.2011, 20:21   #1
tumanovalex
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 79
Вопрос Странные результаты рисования линии

Данные из одной формы в другую передаю через конструктор и рисую вертикальные линии.
В основной форме:
Код:
public struct LineParam
{
  public Int32 numLineSize;
  public Color clrLineColor;
  public Int32 numLineSpace;
  public Color clrLineFon;
  public Int32 numXmax;
  public Int32 numYmax;
}

public LineParam lp;

public void getParamLine()
{
  lp.numLineSize  = (Int32)numLineSize.Value;
  lp.numLineSpace = (Int32)numSpace.Value;
  lp.clrLineColor = lblColor.BackColor;
  lp.clrLineFon   = lblFon.BackColor;
  lp.numXmax      = iXmax;
  lp.numYmax      = iYmax;
}

private void MainForm_Load(object sender, EventArgs e)
{
  iXmax = SystemInformation.PrimaryMonitorSize.Width;
  iYmax = SystemInformation.PrimaryMonitorSize.Height;
  label2.Text = iXmax.ToString() + " x " + iYmax.ToString();
  numLineSize.Value = iXmax / 2;
  numSpace.Value = numLineSize.Value;
}

private void butOK_Click(object sender, EventArgs e)
{
  this.getParamLine();
  Test fm = new Test(lp);
  fm.Owner = this;
  fm.Show();
}
В форме для рисования:
Код:
public MainForm.LineParam lptst; 

public Test(MainForm.LineParam param)
{
  InitializeComponent();
  lptst = param; 
  iXmax = SystemInformation.PrimaryMonitorSize.Width;
  iYmax = SystemInformation.PrimaryMonitorSize.Height;
  p1    = new Point();
  p2    = new Point();
}

private void TestScreen_Load(object sender, EventArgs e)
{
  this.ForeColor = lptst.clrLineFon;
}

private void TestScreen_Paint(object sender, PaintEventArgs e)
{
  Graphics g = e.Graphics;
  Pen pen    = new Pen(lptst.clrLineColor, lptst.numLineSize);
  p1.Y       = 0;
  p2.Y       = lptst.numYmax;
  for (Int32 i = 0; i < lptst.numXmax; i += lptst.numLineSpace + lptst.numLineSize)
  {
    p1.X = i; 
    p2.X = i;
    g.DrawLine(pen, p1, p2);
  }
}
Вертикальные линии небольшого размера рисуются вроде бы правильно, а вот когда на белом экране пытаюсь нарисовать вертикальную линию в полэкрана, то получается черная линия в треть экрана (а не в половину). Подскажите, пожалуйста, почему получается такой странный результат. Прикрепляю проект
Вложения
Тип файла: zip MyQCSharp.zip (14.8 Кб, 13 просмотров)

Последний раз редактировалось tumanovalex; 09.05.2011 в 20:31.
tumanovalex вне форума Ответить с цитированием
Старый 09.05.2011, 22:30   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
а вот когда на белом экране пытаюсь нарисовать вертикальную линию в полэкрана, то получается черная линия в треть экрана (а не в половину). Подскажите, пожалуйста, почему получается такой странный результат.
Это получается потому, что вы рисуете первую линию с координатой X = 0 и половина линии (по толщине) уходит за экран влево.

Код:
...
for (Int32 i = lptst.numLineSize / 2; i < lptst.numXmax; i += lptst.numLineSpace + lptst.numLineSize)
{
    ...
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 10.05.2011, 12:25   #3
tumanovalex
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 79
По умолчанию

Спасибо большое, получилось. Я думал, что рисование происходит с крайней левой позиции линии, а не с середины. А где описано, что для правильного отображения линии на экране (например, как в моем случае) нужно начальную точку брать в ее середине?
tumanovalex вне форума Ответить с цитированием
Старый 10.05.2011, 19:16   #4
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
А где описано, что для правильного отображения линии на экране (например, как в моем случае) нужно начальную точку брать в ее середине?
Мне кажется, что это очевидно.
Вопрос в другом: почему вы решили, что рисование происходит с крайней левой позиции линии?
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 10.05.2011, 19:38   #5
tumanovalex
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 79
По умолчанию

По-моему, что-то аналогичное делал на Visual Basic, что-то не помню, чтобы начинал цикл с середины толщины линии. Может быть, просто перепутал что-то с чем-то.
tumanovalex вне форума Ответить с цитированием
Старый 10.05.2011, 19:42   #6
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Если рисовать тонкую линию, то потери по толщине можно и не заметить, может не обратили внимание.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 10.05.2011, 19:48   #7
tumanovalex
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 79
По умолчанию

Наверное так и было, плохо тестировал
tumanovalex вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать из линии, толщиной в несколько пикселей, линии, толщиной 1 пиксель. ImmortalAlexSan Общие вопросы Delphi 12 25.10.2012 19:05
Алгоритм рисования линии Tronix Паскаль, Turbo Pascal, PascalABC.NET 10 19.08.2010 20:13
странные проблемы с с++ Plastilin Общие вопросы C/C++ 9 21.02.2010 04:50
Странные ошибки. Rio309 Общие вопросы Delphi 2 19.10.2009 19:22