Круглая граница вокруг другого изображения не прорисовывается - PullRequest
0 голосов
/ 25 октября 2018

У меня есть элемент управления графическим блоком , который я сделал круглым, и теперь я пытаюсь нарисовать красный круг вокруг него, используя это:

 Graphics gf = pictureBoxLastLogin1.CreateGraphics();
 gf.DrawEllipse(new Pen(Color.Red, 2), new Rectangle(0, 0, pictureBoxLastLogin1.Width+12, pictureBoxLastLogin1.Height+12));

Но он ничего не рисуетвокруг изображения?Что я делаю не так?Помните, что я преобразовал квадратное изображение в круглое изображение, используя этот фрагмент кода.

System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
gp.AddEllipse(0, 0, pictureBoxLastLogin.Width , pictureBoxLastLogin.Height);
Region rg = new Region(gp);
pictureBoxLastLogin.Region = rg;

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Когда мы рисуем элемент управления и хотим, чтобы рисунок сохранялся, нам нужно подписаться на событие Paint () этого элемента управления.Или, если это пользовательский элемент управления (пользовательский класс, производный от существующего объекта), переопределить его OnPaint () метод.

Контроллер домена перерисовывается довольно часто.Когда другое окно перемещается над ним, когда его контейнер Form свернут / развернут или изменен, если это касается видимой области элемента управления и т. Д.

Когда требуется перерисовка, Paint()событие вызывается.
Чертеж будет сохранен, только если он закодирован внутри обработчика события Paint() (или метода OnPaint()).
Также важно заметить, что большая часть используемого объекта реализует IDisposable().
Все они должны быть Disposed().Здесь объект GraphicsPath и чертеж Pen.
Region, примененный к PicturBox, также должен быть удален.Он может быть объявлен в области видимости класса и ликвидирован после закрытия Form.

Пример, использующий (более или менее) те же настройки, что и в вопросе.


A Form, содержащий PictureBox и 2 Buttons:
При нажатии Button1 будет создан эллиптический Region для PictureBox.
Button2 будет Invalidate() PictureBox, в результате чего перекраска будет запланирована .Событие Paint() будет вызвано.
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

bool PaintBorder = false;
int RegionInSet = 8;

private void button1_Click(object sender, EventArgs e)
{
    using (GraphicsPath path = new GraphicsPath())
    {
        path.AddEllipse(RegionInSet, RegionInSet, pictureBox1.Width - (RegionInSet * 2), 
                        pictureBox1.Height - (RegionInSet * 2));
        Region region = new Region(path);
        pictureBox1.Region = region;
    }
}

private void button2_Click(object sender, EventArgs e)
{
    PaintBorder = true;
    pictureBox1.Invalidate();
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (!PaintBorder) return;
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    e.Graphics.CompositingMode = CompositingMode.SourceOver;
    e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;

    using (Pen penRed = new Pen(Color.Red, 12))
    {
        int PenRedOffset = (int)(penRed.Width / 2) + (penRed.Width % 2 == 0 ? -1 : 0);
        e.Graphics.DrawEllipse(penRed,
            new RectangleF(RegionInSet + PenRedOffset, RegionInSet + PenRedOffset,
                           pictureBox1.Width - (PenRedOffset * 2) - (RegionInSet * 2),
                           pictureBox1.Height - (PenRedOffset * 2) - (RegionInSet * 2)));
    }
}

Визуальный результат:

enter image description here

0 голосов
/ 25 октября 2018

Как только вы сделаете это недействительным, Windows будет перерисовывать его, что, в свою очередь, приведет к удалению любого рисунка, который вы сделали на нем.

Используйте событие Paint, что бы вы ни собиралисьсобытие рисования в краске останется там.

...