DrawBorder не работает при передаче ему собственного прямоугольника - PullRequest
0 голосов
/ 10 января 2012

Я не могу заставить DrawBorder работать при передаче ему нового прямоугольного объекта:

private void answered_choice_1_paint(object sender, PaintEventArgs e)
{
    Size s = new Size(Math.Max(answered_choice_1.Height, icon_correct.Height) + 4,  answered_choice_1.Width + 22 + this.default_margin + 4);
    Point p = new Point(answered_choice_1.Location.X - 22 - this.default_margin - 2, answered_choice_1.Location.Y - 2);
    Rectangle r = new Rectangle(p, s);
    if (icon_correct.Location.Y == answered_choice_1.Location.Y)
    {
        ControlPaint.DrawBorder(e.Graphics, r, Color.Green, ButtonBorderStyle.Solid);
    }
}

Однако передача прямоугольника метки работает:

private void answered_choice_1_paint(object sender, PaintEventArgs e)
{
    if (icon_correct.Location.Y == answered_choice_1.Location.Y)
    {
        ControlPaint.DrawBorder(e.Graphics, answered_choice_1.DisplayRectangle, Color.Green, ButtonBorderStyle.Solid);
    }
}

Как вы можете видеть из кода, я намереваюсь нарисовать прямоугольную границу вокруг метки answered_choice_1 и icon_correct pictureBox, поэтому второй фрагмент кода действительно рисует прямоугольник, но я хочу нарисовать прямоугольник из первого фрагмента.

Редактировать: Я сузил это до:

int x,y;
x = answered_choice_1.Location.X - 22 - this.default_margin - 2;
y = answered_choice_1.Location.Y - 2;
Point p = new Point(x, y);

Используя обнаруженный мной отладчик, answered_choice_1.Location.Y - 2 оценивается как 210 покупка y получает значение 0;Это очень странно, но последовательно: если я вызову другой конструктор для прямоугольника r, я получу тот же результат.

Любая дополнительная помощь будет принята.

Second Edit Редактирование ранее было неверным, хотя это данные, которые я видел в Visual Studio IDE.Комментарий Умберто дал мне окончательный ключ к тому, что происходило, и я одобрил его ответ.

Ответы [ 2 ]

2 голосов
/ 10 января 2012

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

Size s = new Size(Math.Max(answered_choice_1.Height, icon_correct.Height) + 4,
                  answered_choice_1.Width + 22 + this.default_margin + 4);

Поскольку трудно сказать, как выглядит остальная часть кода, я могу только догадываться, что его реверс может работать:

Size s = new Size(answered_choice_1.Width + 22 + this.default_margin + 4,
                  Math.Max(answered_choice_1.Height, icon_correct.Height) + 4)
1 голос
/ 12 января 2012

Я думаю, что вы пытаетесь нарисовать границу вокруг пары элементов управления: значок выровнен по левому краю надписи. Это тот случай?

+------------------------------+
|                              |
| ICON   answered_choice_1     |---> border on a 4px margin around both controls
|                              |
+------------------------------+
^        ^
|  22px  |

Если так, то ваш код рисования имеет проблему. Он пытается использовать «поверхность» (экземпляр Graphics) answered_choice_1 для рисования за пределами своей области. Это не сработает.

Вместо этого вы можете разместить значок и метку внутри панели, а затем закрасить границу панели в любое время. Примерно так, как вы уже сделали, но ссылаясь на panel_1 вместо answered_choice_1:

private void panel_1_paint(object sender, PaintEventArgs e)
{
    if (icon_correct.Location.Y == answered_choice_1.Location.Y)
    {
        ControlPaint.DrawBorder(e.Graphics, panel_1.DisplayRectangle,  Color.Green, ButtonBorderStyle.Solid);
    }
}

Кроме того, вы можете назначить стиль рамки FixedSingle для панели, но AFAIK цвет границы будет определяться системой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...