当您处理Paint
事件(而不是覆盖派生类中的OnPaint
方法)时,基类(默认 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 来绘制按钮的自定义渲染器,这将更接近原生菜单和工具栏的外观。此处提供了一个非常详尽的示例。我已经为 WinForms 开发编写了一些非常相似的东西,我已经完成了这些需要ToolStrip
类的附加功能(例如嵌入组合框)不由
老派提供的MainMenu
以及ToolBar
简单地包装其 Windows API 等效项的控件。通过选择以这种方式做事,您确实可以更好地控制您希望调用的基类渲染器的哪些部分,因为您自己明确地编写了代码。强烈推荐如果你是
完全关心 UI、原生感觉或用户体验的类型。