我正在为 ToolStripDropDown
控件编写一些自定义行为。我还想修改 ToolStripDropDownButton
本身以显示彩色形状。
我看到我可以处理 Paint
事件并绘制任何我喜欢的东西。但是,有没有办法让按钮在绘制形状之前绘制默认背景?很难获得完全正确的背景,尤其是对于 future 版本的 .NET 和 Windows。
在普通的 ol' Windows 中,我可以在绘制代码之前或之后调用默认的 proc 处理程序。我没有看到任何方法可以在 .NET 中完成它。或者也许有一种方法可以告诉按钮只绘制背景?
最佳答案
当你处理 Paint
event (与覆盖派生类中的 OnPaint
method 相反)基类(默认 proc 处理程序)已经被调用。一切都正常绘制,然后您实际上是在 Paint
事件中在上面绘制。你可以在这里清楚地看到:
诀窍是确保您留出足够的控件剪裁矩形以显示您想要的部分。 e.ClipRectangle
属性检索整个按钮的客户区,所以如果您只是
用色板填充它,您也将掩盖下拉箭头和默认背景。上面的演示是使用以下丑陋的示例代码创建的:
private void ToolStripDropDownButton1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Chartreuse,
e.ClipRectangle.X + 3, e.ClipRectangle.Y + 3,
e.ClipRectangle.Width - 12,
e.ClipRectangle.Height - 12);
}
除此之外,我不认为有一种方法可以自定义基类究竟绘制什么。所有者绘图(至少在 WinForms 中)往往是一个孤注一掷的事情。您可以完全控制,
但这是以必须自己实现一切为代价的。
当然,如果您还没有注意到,ToolStrip
控件已经 看起来不像本地 Windows 控件。更糟糕的是,它总是看起来和现在一模一样,
即使在未来的 Windows 版本中,也会彻底改变 UI。 (MenuStrip
被
同样的现象,在标准 API 菜单发生巨大变化的 Windows Vista/7 中差异非常明显)。原因是这两个控件完全是用在其 WinForms 实现中编写的 C# 代码绘制的。就个人而言,我认为它看起来很俗气,不会在我的一个应用程序中使用它来打赌。
您可以分配一个使用 UxTheme API 来绘制按钮的自定义呈现器,这将使非常更接近原生菜单和工具栏的外观。提供了一个非常详尽的示例 here .我已经为 WinForms 开发编写了一些非常相似的东西,我已经完成了它,需要 ToolStrip
类的附加功能(例如嵌入组合框)
老式的 MainMenu
和 ToolBar
控件只是简单地包装了它们的 Windows API 等效项。通过选择以这种方式做事,您确实可以更好地控制您希望调用基类渲染器的哪些部分,因为您已经明确地自己编写了代码。如果你是,强烈推荐
完全关心 UI、原生感觉或用户体验的类型。
关于c# - 所有者描述的 ToolStripDropDownButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048924/