先贴出来源码类和示例工程下载地址:戳我去下载
这个扩展类基于网络中的DForm修改,优化了一些内容,保证可用,可在留言或私信询问疑问。
其中一些选项可以看示例工程的设置,当然首先要把boderstyle设置为None,其他元素Dock位置可要通过窗体padding属性来控制。
关键为继承OnPaint函数,比传统直接派生winproc更加易懂但也无法随意的定制窗体形状,不过用graphicpath应该也可以。
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//draw title back
DrawExTitleBack(e.Graphics);
//draw title logo
DrawExLogo(e.Graphics);
//draw title text
DrawExText(e.Graphics);
//draw controlbox
DrawExControlBox(e.Graphics);
//draw border
DrawExBoder(e.Graphics);
}
还有标题栏按钮的状态监测:
protected override void OnMouseMove(MouseEventArgs e)
{
if (_MinButtonRectangle != Rectangle.Empty && _MinButtonRectangle.Contains(e.Location))
{
_MinButtonHover = true;
this.Invalidate(_MinButtonRectangle);
}
else if (_MinButtonRectangle != Rectangle.Empty && _MinButtonRectangle.Contains(e.Location) == false && _MinButtonHover == true)
{
this.Invalidate(_MinButtonRectangle);
_MinButtonHover = false;
}
if (_MaxButtonRetangle != Rectangle.Empty && _MaxButtonRetangle.Contains(e.Location))
{
_MaxButtonHover = true;
this.Invalidate(_MaxButtonRetangle);
}
else if (_MaxButtonRetangle != Rectangle.Empty && _MaxButtonRetangle.Contains(e.Location) == false && _MaxButtonHover == true)
{
this.Invalidate(_MaxButtonRetangle);
_MaxButtonHover = false;
}
if (_CloseButtonRectangle != Rectangle.Empty && _CloseButtonRectangle.Contains(e.Location))
{
_CloseButtonHover = true;
this.Invalidate(_CloseButtonRectangle);
}
else if (_CloseButtonRectangle != Rectangle.Empty && _CloseButtonRectangle.Contains(e.Location) == false && _CloseButtonHover == true)
{
this.Invalidate(_CloseButtonRectangle);
_CloseButtonHover = false;
}
if(_HelpButtonRectangle != Rectangle.Empty && _HelpButtonRectangle.Contains(e.Location))
{
_HelpButtonHover = true;
this.Invalidate(_HelpButtonRectangle);
}
else if(_HelpButtonRectangle != Rectangle.Empty && _HelpButtonRectangle.Contains(e.Location) == false && _HelpButtonHover == true)
{
this.Invalidate(_HelpButtonRectangle);
_HelpButtonHover = false;
}
if (_MaxButtonHover == true || _CloseButtonHover == true || _MinButtonHover == true || _HelpButtonHover == true)
this.Cursor = Cursors.Hand;
else
{
this.Cursor = Cursors.Default;
}
base.OnMouseMove(e);
}
protected override void OnMouseLeave(EventArgs e)
{
if(_MinButtonHover == true)
{
_MinButtonHover = false;
this.Invalidate(_MinButtonRectangle);
}
if(_MaxButtonHover == true)
{
_MaxButtonHover = false;
this.Invalidate(_MaxButtonRetangle);
}
if(_CloseButtonHover == true)
{
_CloseButtonHover = false;
this.Invalidate(_CloseButtonRectangle);
}
if(_HelpButtonHover == true)
{
_HelpButtonHover = false;
this.Invalidate(_HelpButtonRectangle);
}
base.OnMouseLeave(e);
}
重写windowstate:
public new FormWindowState WindowState
{
get { return this._WindowState; }
set
{
if (!DesignMode)
{
if (value == FormWindowState.Maximized)
{
this._NormalSize = this.Size;
this._NormalLocation = this.Location;
this.Location = new Point(0, 0);
this.Size = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
this.Invalidate();
}
else if (value == FormWindowState.Normal)
{
this.Size = _NormalSize;
this.Location = _NormalLocation;
this.Invalidate();
}
else if (value == FormWindowState.Minimized)
{
base.WindowState = value;
}
}
this._WindowState = value;
}
}
属性面板:
以及设计时可见的效果: