2012-04-25 3 views
0

я добавил пользовательские границы с метками в одном из моих форм применения следующим образом:Посылка пользовательского метод рисования доступен в течение всего приложения

private void ColorMe(PaintEventArgs e) 
    { 
     Color myColor = Color.FromArgb(104, 195, 198); 
     Pen myPen = new Pen(myColor, 1); 
     e.Graphics.DrawRectangle(myPen, 
     e.ClipRectangle.Left, 
     e.ClipRectangle.Top, 
     e.ClipRectangle.Width - 1, 
     e.ClipRectangle.Height - 1); 
     base.OnPaint(e); 
    } 

    private void lblDisbs_Paint(object sender, PaintEventArgs e) 
    { 
     ColorMe(e); 
    } 

, который работает хорошо. Все, что я должен сделать, это положить ColorMe (e) в событие Paint каждого ярлыка.

Однако я хочу использовать этот метод для всех форм по всему приложению. Я попытался поместить свой метод ColorMe() в класс, чтобы вызвать его из нескольких форм таким образом, но он не работает, говоря, что «база не имеет события OnPaint».

Как я могу сделать этот метод доступным во всем приложении?

+0

Запомнить распоряжаться вашего объекта Pen ... – Pedery

ответ

3

Создать класс LabelWithBorder получить его от Label, переопределить OnPaintmethod.

public class LabelWithBorder : Label { 
    protected override void OnPaint(PaintEventArgs e) { 
    ColorMe(e); 
    } 
} 

Замените все ярлыки WinForms в своем приложении ярлыком.

+0

Просьба пояснить, что вы подразумеваете под «Отменить все метки WinForms в своем приложении с помощью вашей метки». Как это делается? Есть сотни ярлыков. Могу ли я не просто добавить метод рисования к каждому существующему ярлыку. – PJW

+0

Найдите все ссылки на Управление метками и замените их. В чем разница между заменой каждой метки и добавлением одного метода к каждой существующей метке (что бы это ни значило)? –

1

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

Если вы не используете решение Карела Frajtak, который является чистым, вы можете попробовать сделать статический класс, а затем вы можете вызвать его из любой формы:

internal static class LabelBorder { 
    public static void ColorMe(Rectangle r, PaintEventArgs e) { 
    r.Inflate(-1, -1); 

    using (Pen p = new Pen(Color.FromArgb(104, 195, 198), 1)) 
     e.Graphics.DrawRectangle(p, r); 
    } 
} 

Пример:

public Form1() { 
    InitializeComponent(); 
    label1.Paint += label_Painter; 
    label2.Paint += label_Painter; 
} 

void label_Painter(object sender, PaintEventArgs e) { 
    LabelBorder.ColorMe(((Label)sender).ClientRectangle, e); 
} 
Смежные вопросы