所有者绘制的ToolStripDropDownButton

时间:2011-02-19 04:50:45

标签: c# .net winforms ownerdrawn toolstripdropdown

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

诀窍是确保将足够的控件剪切矩形暴露给 show 所需的部分。 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版本中,也完全彻底改变了用户界面。 (MenuStrip受到了骚扰 同样的现象,在Windows Vista / 7中,标准API菜单发生了巨大变化,这种差异非常明显。原因是这两个控件都完全是用WinForms实现编写的C#代码绘制的。就个人而言,我认为它看起来很荒谬,并且不会在我的一个申请中用它来赌注。

可以分配一个自定义渲染器,该渲染器使用UxTheme API绘制按钮,这将使更接近于近似本机菜单和工具栏的外观。有一个非常全面的样本here。我已经为WinForms开发编写了一些非常相似的东西,我已经完成了要求ToolStrip类的附加功能(例如嵌入组合框) 老式MainMenuToolBar控件只是简单地包装它们的Windows API等价物。通过选择以这种方式执行操作,您可以更准确地控制要调用的基类渲染器的哪些部分,因为您自己已经明确地编写了代码。强烈推荐,如果你是 关注用户界面,原生感觉或用户体验的类型。