对于我正在开发的小程序,我决定最好实现快速访问工具栏(就像Ribbon控件附带的那些(office 2007,2010?))。 现在我的问题是我找不到winforms的任何免费功能区控件,我可以从中提取工具栏。
我目前有一个伪QAC,但标准工具栏存在渲染问题。
那么有人能告诉我这个控件的一个很好的实现吗?它必须与操作系统无关。 (没有DWM的非客户端正在删除。)
对于其他人来说,这是我的结果:
在新表单中,我添加以下代码:
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams; // Retrieve the normal parameters.
cp.Style = 0x40000000 | 0x4000000; // WS_CHILD | WS_CLIPSIBLINGS
cp.ExStyle &= 0x00080000; // WS_EX_LAYERED
cp.Parent = GetDesktopWindow(); // Make "GetDesktopWindow()" from your own namespace.
return cp;
}
}
然后放置一个工具箱,其中包含Cody Gray提供的样式,我总是将它与它的所有者一起移动,现在我有一个快速访问工具栏! :d
答案 0 :(得分:2)
从我收集的阅读评论中,您正在寻找一个简单的工具栏控件,为用户提供执行常见任务/操作的快捷方式。但是,与Microsoft Office样式功能区中包含的快速访问工具栏不同,您不需要需要在非客户端区域绘图的解决方案,因为此解决方案不可移植。在非客户区域中绘图需要完全自定义窗口镶边,这不能在所有版本的Windows中无缝工作(因为DWM和其他一些原因)。
我建议使用框架中提供的标准ToolStrip
control,但您表示担心它会在其下方绘制一条白线,并表示当您尝试通过将此白线放置在面板内时隐藏此白线,边框(你想要的)也被覆盖。
因此,我提出了几种可能的解决方案:
1。 ToolStrip
的底部白色边框只有在RenderMode
property设置为“系统”时才会被绘制。您可以将其设置为“专业”,并永远消除白线,同时保留黑暗的悬停边框效果。
2。如果你不喜欢“专业”渲染风格并且想要坚持使用“系统”,你可以简单地继承现有的ToolStripSystemRenderer
并阻止其绘制底部白色边框:
public class CorrectedToolStripRenderer : ToolStripSystemRenderer
{
protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
//do nothing here
}
}
然后只需设置ToolStrip
控件即可使用自定义渲染器,如下所示:
myToolStrip.Renderer = new CorrectedToolStripRenderer();
3。您可以为ToolStrip
实现完全自定义渲染器,直接从基础ToolStripRenderer
class派生,并为您自己定义您想要的方式它看起来。
例如,因为我讨厌看起来不像标准Windows UI元素的控件,所以我使用了一个自定义渲染器来确保所有WinForms应用程序中的菜单和工具栏都像操作系统中那样绘制。 (“系统”在Vista / 7中没有接近它的任何位置。)我的是this sample的经过大量修改的版本。
其他人(这里看着你,Office团队)非常喜欢自定义用户界面,这种方式让你真正全力以赴,与你的应用程序的外观相匹配。例如,以下是自定义渲染器,它们看起来像Visual Studio 2010或Office 2007,可以帮助您入门。谷歌搜索将会增加更多。