Наличие дочерних элементов управления в качестве реальных элементов управления перед кнопкой (в классе, унаследованном от Button
или от UserControl
) может затруднить правильное функционирование событий, специфичных для кнопки, как вы уже обнаружили. (Редактировать: хотя это сложно, это не невозможно - см. Ответ Ханса Пассанта)
В качестве обходного пути, вместо использования дочерних элементов управления, вы можете нарисовать их на поверхности кнопки,так как вам не нужна большая часть функциональности элементов управления (события, фокусировка и т. д.), только их отображение.
Вы можете сделать дополнительное рисование в методе OnPaint
вашего класса.Что-то вроде:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.DrawString("My fake label", Font,
SystemBrushes.ControlText, new Point(10, 10))
// draw progressbar
}
Чтобы обновить отображение, вам нужно вызвать перерисовку кнопки, используя Invalidate()
.
Взгляните на Пользовательская кнопка растрового изображения с использованием C #на CodeProject для более полного примера.