2

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

我看到我可以处理这个Paint事件并画出我喜欢的任何东西。但是,在我绘制形状之前,有什么方法可以让按钮绘制默认背景?很难让背景完全正确,尤其是对于 .NET 和 Windows 的未来版本。

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

4

1 回答 1

2

当您处理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、原生感觉或用户体验的类型。

于 2011-02-19T05:38:07.087 回答