2013-05-16 3 views
0

Так что я пытаюсь сделать хороший округленный переключатель, который при нажатии будет скользить либо влево, либо вправо, чтобы в принципе что-то включить или выключить (его можно использовать для других вещей). У меня есть версия прямоугольника, работающая несколько нормально (у меня есть несколько настроек в виду, что я хочу сделать для нее), но проблема, с которой я сталкиваюсь, - это использовать закругленные прямоугольники. Я сделал несколько занятий, чтобы помочь себе в этом. У меня один называется RoundRectanglePath. Используя метод Create, я даю ему Rectangle (или x, y, w, h) и радиус для углов, и он возвращает закрытый GraphicsPath, который затем я могу использовать Graphics. [Fill | Draw] Path with. Затем у меня есть класс RoundRectangle, который является просто элементом управления, который очень похож на ярлык. Я обнаружил, что если я переопределяю OnPaintBackground и не отправляю событие на базу, но вместо этого рисую прямоугольник того же цвета, что и Parent.BackColor, чем я получаю иллюзию, что элемент управления действительно круглый. (как связанная сторона, которую я допускаю прозрачно)Пользовательский контроль Windows Forms не окрашивается правильно

Для моего класса RoundMovableSwitch я использую 2 RoundRectanglePaths для разделения элемента управления пополам. Левый - зеленый цвет, а правый - розовый (думая об этом сейчас, я мог бы просто использовать горизонтальную кисть LinearGradient ... ooops oh well) Затем я рисую строку On и Off на противоположных сторонах. Для этого элемента управления я добавляю RoundRectangle. Когда пользователь нажимает на RoundRectangle или MoveableSwitch, Control затем перемещает RoundRectangle влево или вправо 1 пиксель за раз. Движение отлично работает. Проблема, с которой я столкнулась, заключается в следующем. Внешний край RoundRectangle - это правильный прозрачный цвет. Внутренний край - неправильный цвет. См. RoundMovingSwitch 1 и 2 на рисунке ниже. Как только я получу код правильно, я вернусь и реорганизую код немного больше.

Example of problem

Код размещен на GitHub:. Here

ответ

2

«Проблема, которую я имею это Внешний Край RoundRectangle правильный прозрачный цвет Внутренний край неправильный цвет.. "

Не уверен, что я понимаю проблему ...

Вы пытаетесь избавиться от синих углов, которые находятся за пределами закругленных краев?

Если это так, то попробуйте это в RoundRectangle: enter image description here

public RoundRectangle() 
    { 
     this.ResizeRedraw = true; 
     this.VisibleChanged += new EventHandler(RoundRectangle_VisibleChanged); 
    } 

    private bool RegionSet = false; 
    void RoundRectangle_VisibleChanged(object sender, EventArgs e) 
    { 
     if (this.Visible && !RegionSet) 
     { 
      RegionSet = true; 
      var r = new RectangleEx(this.ClientRectangle); 
      var path = RoundRectanglePath.Create(r.ToRectangle(), this.Radius, this.Corners); 
      this.Region = new Region(path); 
     } 
    } 

* Если размер изменения управления, то вы должны сбросить свойство Region() к новому размеру.

Edit: Для того, чтобы сделать его сбросить область при изменении размера:

protected override void OnSizeChanged(EventArgs e) 
    { 
     base.OnSizeChanged(e); 
     var r = new RectangleEx(this.ClientRectangle); 
     var path = RoundRectanglePath.Create(r.ToRectangle(), this.Radius, this.Corners); 
     this.Region = new Region(path); 
    } 
+0

Картину вы показать то, что я пытаюсь добиться. Проблема не в том, что размер RoundRectangle изменяется ... но я попробую что-нибудь :) –

+0

YOU DID IT !!!! СПАСИБО СПАСИБО СПАСИБО –

Смежные вопросы