如何设计或以某种方式获得自定义的WindowBar和握柄

时间:2018-09-30 18:24:44

标签: c# visual-studio winforms material-design visualdesigner

就像Visual Studio中的工具箱一样,它具有一个蓝色的可拖动WindowBar,如下所示:

ToolBox

或类似的内容:

VerticalGrip

是否有一个DLL可以获取,或者是一种简单的制作方法?

2 个答案:

答案 0 :(得分:2)

要使某些控件看起来像某些系统元素(如手柄),可以使用合适的VisualStyleRenderer

您可以看到数量众多! -这是将VisualStyleElement.Rebar.Gripper添加到Panel的方法:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    // any other drawing before..
    DrawVisualStyleElementRebarGripper1(e);
}

这是调用方法的典型实现:

public void DrawVisualStyleElementRebarGripper1(PaintEventArgs e)
{
    if (VisualStyleRenderer.IsElementDefined(
        VisualStyleElement.Rebar.Gripper.Normal))
    {
        VisualStyleRenderer renderer =
                new VisualStyleRenderer(VisualStyleElement.Rebar.GripperVertical.Normal);
        Rectangle rectangle1 = new Rectangle(0, 0, 
                                            20,  (int)e.Graphics.VisibleClipBounds.Height);
        renderer.DrawBackground(e.Graphics, rectangle1);
    }
    //else
    //    e.Graphics.DrawString("This element is not defined in the current visual style.",
    //            this.Font, Brushes.Black, new Point(10, 10));
}

结果:

enter image description here

确保在任何其他绘画操作之后之后调用渲染方法,以免被绘画

请注意其中有两个 GripperVerticalGripper;在我的系统(W10)上,它们看起来相同,但在其他系统上,可能不一样!

如果您确实想要自定义抓握样式,则可以使用合适的图案填充笔刷进行绘制;在所有系统上看起来都一样,这可能是您想要的。但这也意味着它不会总是与其余的Windows集成在一起。该解决方案将始终使用当前计算机的样式。

更新

如果要允许拖动控件,则可以使用Vanethrane的答案获得基本功能。为了获得更好的用户体验,还请确保考虑以下几点:

  • 使用所有三个事件MouseDown, -Move and -Up
  • CursorDefault更改为HandSizeAll
  • 测试您是否在抓握区域
  • 在移动之前,请先用BringToFront将控件移到z-order的顶部,以避免在任何其他控件下传递
  • MouseDown中存储当前位置两次;一次移动,一次还原,以防最终位置无效
  • 通常您想使用网格来控制最终位置并...
  • ..通常,您希望控件本身与最近的邻居“磁性地”对齐。使用MouseUp来更改最终位置。

我建议将所有功能捆绑到DraggableControl 中。

答案 1 :(得分:0)

超级容易。在这里:

创建所需的控件,将其命名为“抓地力”。将它们分别放在鼠标下移和鼠标移动方法中

 private Point Mouselocation;


    private void grip_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            Mouselocation = e.Location;
        }
    }

    private void grip_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            grip.Left = e.X + grip.Left - Mouselocation.X;
            grip.Top = e.Y + grip.Top - Mouselocation.Y;
        }
    }

请注意,这将移动单个控件。要移动整个表单,您需要在表单本身上实现