c# - 所有者描述的 ToolStripDropDownButton

标签 c# .net winforms ownerdrawn toolstripdropdown

我正在为 ToolStripDropDown 控件编写一些自定义行为。我还想修改 ToolStripDropDownButton 本身以显示彩色形状。

我看到我可以处理 Paint 事件并绘制任何我喜欢的东西。但是,有没有办法让按钮在绘制形状之前绘制默认背景?很难获得完全正确的背景,尤其是对于 future 版本的 .NET 和 Windows。

在普通的 ol' Windows 中,我可以在绘制代码之前或之后调用默认的 proc 处理程序。我没有看到任何方法可以在 .NET 中完成它。或者也许有一种方法可以告诉按钮只绘制背景?

最佳答案

当你处理 Paint event (与覆盖派生类中的 OnPaint method 相反)基类(默认 proc 处理程序)已经被调用。一切都正常绘制,然后您实际上是在 Paint 事件中在上面绘制。你可以在这里清楚地看到:

Lime rectangle drawn over part of the drop-down button, clearly showing the default contents underneath

诀窍是确保您留出足够的控件剪裁矩形以显示您想要的部分。 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 类的附加功能(例如嵌入组合框)
老式的 MainMenuToolBar 控件只是简单地包装了它们的 Windows API 等效项。通过选择以这种方式做事,您确实可以更好地控制您希望调用基类渲染器的哪些部分,因为您已经明确地自己编写了代码。如果你是,强烈推荐
完全关心 UI、原生感觉或用户体验的类型。

关于c# - 所有者描述的 ToolStripDropDownButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5048924/

相关文章:

c# - VB 和 C# 之间的绑定(bind)问题

c# - ASP.NET Core 2.0 中的防伪 cookie

c# - 有没有办法阻止 WinForms 设计器默认控制 Load 事件

c# - 从 OxyPlot 散点图中获取数据点

c# - 更新 PropertyGrid

c# - 错误 CS0019 : Operator '<' cannot be applied to operands of type 'string' and 'int'

c# - 使用 C# 从 PDF 导出 Illustrator 矢量图像

c# - Web Api 和 WCF 的相同实体

c# - 如何使用 ASP.NET 重定向到另一个页面?

.net - .NET 4.5 中 SecurityTokenCache 的替代品