Мое приложение находится в C# 3.5, Winforms, но это, скорее всего, потребует P/Invoke, так что это не так строго связано с .NET.Как обеспечить анимацию в элементе, нарисованном владельцем?
Я создал нарисованные на заказ элементы меню через ContextMenu
и MenuItem
классы. Все работает хорошо, но для некоторых элементов я хотел бы создать небольшую анимацию (показывая, что есть процесс, связанный с элементом). К сожалению, вышеупомянутые два класса не предоставляют метод Invalidate()
или что-то подобное.
Моя лучшая идея до сих пор заключается в P/Invoke WindowFromDC()
на первом OnDraw, сохранить полученный дескриптор, а затем периодически называть InvalidateRect()
на ручке, пока меню не будет закрыто.
Это похоже на хакерство, хотя я еще не пробовал, и задаюсь вопросом, есть ли более элегантный способ.
Да, но у них есть проблемы с тем, чтобы быть полностью владельцем. По крайней мере, это то, что люди говорили в сети, и я тоже не мог рисовать все. В моем случае я делаю довольно тяжелую настройку - две строки текста в разных шрифтах; большой анимированный значок; может быть, что-то еще. Элементы меню не имеют одинаковой высоты (некоторые имеют только одну строку текста). –
@Vilx: Хм, это интересно. Честно говоря, я действительно не очень люблю парня. Я сделал много рисунков владельца стандартных меню, чтобы получить значки (стон), но я удалил «MenuStrip» и его приятелей из моего инструментария в целом. То, что я читал в Интернете, похоже, указывает на то, что они обеспечивают * лучшую * настраиваемость/поддержку владельца, чем меню API. Их главная заслуга в том, что они правильно сконструированы и фактически объектно-ориентированы, что означает, что вы можете подклассифицировать «ToolStripItem» и при необходимости делать свой собственный чертеж. Вероятно, вы пытались создать подкласс 'ToolStripMenuItem', который является более ограниченным. –
Ах, может быть. Я действительно пытался подклассифицировать «ToolStripMenuItem». Но может ли 'ContextMenuStrip' содержать элементы, отличные от' ToolStripMenuItem'? –