2011-01-27 2 views
3

Мое приложение находится в C# 3.5, Winforms, но это, скорее всего, потребует P/Invoke, так что это не так строго связано с .NET.Как обеспечить анимацию в элементе, нарисованном владельцем?

Я создал нарисованные на заказ элементы меню через ContextMenu и MenuItem классы. Все работает хорошо, но для некоторых элементов я хотел бы создать небольшую анимацию (показывая, что есть процесс, связанный с элементом). К сожалению, вышеупомянутые два класса не предоставляют метод Invalidate() или что-то подобное.

Моя лучшая идея до сих пор заключается в P/Invoke WindowFromDC() на первом OnDraw, сохранить полученный дескриптор, а затем периодически называть InvalidateRect() на ручке, пока меню не будет закрыто.

Это похоже на хакерство, хотя я еще не пробовал, и задаюсь вопросом, есть ли более элегантный способ.

ответ

3

Вместо того, чтобы использовать WindowFromDC, я могу предложить позвонить GetMenuItemRect function, чтобы получить ограничивающий прямоугольник для определенного пункта меню. Затем вы можете передать rectangle structure, заполненный этой функцией, на InvalidateRect function.

Я согласен, что это решение имеет какое-то «хакерское» чувство, но я подозреваю, что это меню, предоставленное Windows API, не предназначено для анимирования. Классы оболочки меню, предоставляемые платформой .NET Framework, не включают функцию Invalidate, потому что это относительно редкий вариант использования. Как правило, достаточно, чтобы элементы меню, созданные владельцем, изменялись каждый раз, когда отображается всплывающее меню (путем обработки WM_INITMENUPOPUP message). Насколько я знаю, вышеуказанное предложение является наиболее «правильным» способом, который должен делать то, что вы хотите.

Если вам действительно нужен такой контроль над меню чертежей, вы можете стать одним из немногих людей, для которых классы cheesy на самом деле лучше. Поскольку они полностью реализованы в управляемом коде, класс ToolStripItem обеспечивает рабочий Invalidate method.

+1

Да, но у них есть проблемы с тем, чтобы быть полностью владельцем. По крайней мере, это то, что люди говорили в сети, и я тоже не мог рисовать все. В моем случае я делаю довольно тяжелую настройку - две строки текста в разных шрифтах; большой анимированный значок; может быть, что-то еще. Элементы меню не имеют одинаковой высоты (некоторые имеют только одну строку текста). –

+0

@Vilx: Хм, это интересно. Честно говоря, я действительно не очень люблю парня. Я сделал много рисунков владельца стандартных меню, чтобы получить значки (стон), но я удалил «MenuStrip» и его приятелей из моего инструментария в целом. То, что я читал в Интернете, похоже, указывает на то, что они обеспечивают * лучшую * настраиваемость/поддержку владельца, чем меню API. Их главная заслуга в том, что они правильно сконструированы и фактически объектно-ориентированы, что означает, что вы можете подклассифицировать «ToolStripItem» и при необходимости делать свой собственный чертеж. Вероятно, вы пытались создать подкласс 'ToolStripMenuItem', который является более ограниченным. –

+1

Ах, может быть. Я действительно пытался подклассифицировать «ToolStripMenuItem». Но может ли 'ContextMenuStrip' содержать элементы, отличные от' ToolStripMenuItem'? –

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