Только элемент управления с фокусом будет получать события клавиатуры.Поэтому нет способа переопределить или обработать событие в вашем пользовательском элементе управления, который позволил бы вам определять нажатия клавиш, когда ваш пользовательский элемент управления в данный момент не имеет фокуса.
В любом случае новая информация добавляется в вашВопрос указывает на то, что это не имеет значения.Если все, что вам нужно, это рисовать ускорители клавиатуры в подходящее время, есть гораздо более простое решение.
В обработчике событий Paint
для вашего пользовательского элемента управления (где вы рисуете текст элемента управления), вам следуетпроверьте значение свойства Control.ShowKeyboardCues
.Если значение true
, то вы должны сделать видимыми ускорители клавиатуры;в противном случае вы должны пропустить их рисование.
Аналогично, вы также должны проверить значение свойства Control.ShowFocusCues
.Это говорит вам, следует ли рисовать прямоугольник фокуса вокруг элемента управления.
Используйте метод ControlPaint.DrawFocusRectangle
, чтобы нарисовать указанный прямоугольник фокуса.
Что-то вроде:
(я непередо мной нет компилятора .NET, поэтому в коде могут быть ошибки ...)
// Draw the text
using (StringFormat sf = new StringFormat())
{
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
sf.HotkeyPrefix = this.ShowKeyboardCues ? HotkeyPrefix.Show : HotKeyPrefix.Hide;
if (this.Enabled)
{
using (Brush br = new SolidBrush(this.ForeColor))
{
g.DrawString(this.Text, this.Font, br, this.ClientRectangle, sf);
}
}
else
{
SizeF sz = g.MeasureString(this.Text, this.Font, Point.Empty, sf);
RectangleF rc = new RectangleF(Point.Empty, sz);
ControlPaint.DrawStringDisabled(g, this.Text, this.Font, this.BackColor, rc, sf);
}
}
// Draw the focus rectangle
if (this.ShowFocusCues && this.ContainsFocus)
{
ControlPaint.DrawFocusRectangle(g, this.ClientRectangle);
}