C# Winform 窗体美化(10、自定义窗体)

10、自定义窗体

写在前面

最近在作 winform 应用程序,须要自定义一种窗口的样式,因此就随便搞了一个简单的窗口。web

效果图

有两种样式,界面以下:
无标题:
无标题
有标题:
有标题ide

关键词

一、黑色描边边框

对于窗口去掉原生的边框这个操做很简单【设置FormBorderStyle为None】,可是去掉边框以后略显生硬,因此就考虑如何作一个描边。svg

方案a:用画笔画出来,可是画出来的描边会被控件挡住,因此做废;
方案b:使用4个label,设置长宽和颜色,设置为最顶层,分别摆放在上下左右四个边缘位置,如今来看效果还不错,由于是控件是最顶层的缘由,因此也不会被挡住,【若是你看到此处有什么好主意必定告知一下,先谢过了 ^_^ 】spa

二、拖动窗口移动

因为设置FormBorderStyle为None的缘由,因此原来窗口标题的拖动功能也一并去除了,因此须要从新来手动实现原来标题的移动功能,重写OnMouseMove方法便可,代码以下:.net

protected override void OnMouseMove(MouseEventArgs e)
{
    base.OnMouseMove(e);
    if (e.Button == MouseButtons.Left)
    {
        //这里必定要判断鼠标左键按下状态,不然会出现一个很奇葩的BUG,不信邪能够试一下~~
        ReleaseCapture();
        SendMessage(Handle, 0x00A1, 2, 0);
    }
}

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

三、关于窗口属性的添加

由于我作了描边的功能,因此相对应的,应该会有一个描边粗细的设置,固然放到属性面板里最好,这里贴一下如何在属性面板里添加新项目:code

private int _Border = 1;
[Category("Style")]
[Description("窗体边框粗细")]
[DefaultValue(typeof(int), "1")]
public int Border
{
    get { return _Border; }
    set
    {
        if (_Border != value)
        {
            _Border = value;
            SetBorder();
        }
    }
}

具体解释能够再VS看到,都很详细。orm

源码

下载xml