winform设置窗体无边框
- 窗体默认外观
- 将Form的属性FormBorderStyle修改为None
- 拖一个panel控件,并将dock属性设为Top,固定在顶部,再设置一下背景颜色
- 拖一个label控件,设置图标字体和Text内容,0是最小化图标,1是最大化,r是关闭图标
- 复制label,设计成如下效果
- 依次给label绑定点击事件
- 事件处理
// 点击关闭
private void close_Click(object sender, EventArgs e)
{
this.Close();
}
// 点击最小化
private void min_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
// 点击最大化
private void maxOrNor_Click(object sender, EventArgs e)
{
if (WindowState != FormWindowState.Maximized)
{
// 设置窗口最大化不遮盖底部任务栏
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
WindowState = FormWindowState.Maximized;
// 更改为折叠窗口图标,maxOrNor为关闭label的名字
maxOrNor.Text = "2";
}
else
{
WindowState = FormWindowState.Normal;
// 更改为最大化图标
maxOrNor.Text = "1";
}
}
- 设置鼠标进入事件,鼠标进入图标区域修改颜色
// 鼠标进入
private void Control_MouseEnter(object sender, EventArgs e)
{
Label lb = sender as Label;
lb.BackColor = Color.White;
lb.ForeColor = Color.LightBlue;
}
// 鼠标按下
private void Control_MouseDown(object sender, EventArgs e)
{
Label lb = sender as Label;
lb.BackColor = Color.Blue;
lb.ForeColor = Color.White;
}
// 鼠标离开
private void Control_MouseLeave(object sender, EventArgs e)
{
Label lb = sender as Label;
lb.BackColor = Color.Transparent;
lb.ForeColor = Color.Black;
}
- 在onLoad方法中给label绑定3个事件,
private void Form1_Load(object sender, EventArgs e)
{
// ControlPanel是panel的Name属性
foreach (Control c in this.ControlPanel.Controls)
{
if (c is Label)
{
c.MouseEnter += Control_MouseEnter;
c.MouseLeave += Control_MouseLeave;
c.MouseDown += Control_MouseDown;
}
}
}
- 是否显示由窗体的ControlBox属性控制
private void Form1_Load(object sender, EventArgs e)
{
// 是否显示由窗体的ControlBox属性控制
close.Visible = this.ControlBox;
maxOrNor.Visible = this.ControlBox;
min.Visible = this.ControlBox;
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
foreach (Control c in this.ControlPanel.Controls)
{
if (c is Label)
{
c.MouseEnter += Control_MouseEnter;
c.MouseLeave += Control_MouseLeave;
c.MouseDown += Control_MouseDown;
}
}
}
- 设置窗口可缩放
const int WM_NCHITTEST = 0x0084;// 移动鼠标
const int HTLEFT = 10; //左边界
const int HTRIGHT = 11; //右边界
const int HTTOP = 12; //上边界
const int HTTOPLEFT = 13; //左上角
const int HTTOPRIGHT = 14; //右上角
const int HTBOTTOM = 15; //下边界
const int HTBOTTOMLEFT = 0x10; //左下角
const int HTBOTTOMRIGHT = 17; //右下角
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_NCHITTEST:
if ((this.MaximizeBox == true && this.WindowState == FormWindowState.Normal))
{
Point vPoint = new Point((int)m.LParam & 0xFFFF,
(int)m.LParam >> 16 & 0xFFFF);
vPoint = PointToClient(vPoint);
if (vPoint.X <= 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPLEFT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMLEFT;
else m.Result = (IntPtr)HTLEFT;
else if (vPoint.X >= ClientSize.Width - 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPRIGHT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMRIGHT;
else m.Result = (IntPtr)HTRIGHT;
else if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOP;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOM;
}
break;
}
}
- 缩放时设置图标没有往右靠
- 选中3个按钮,Anchor改为Top,Right
- 设置窗口可拖动
给panel绑定MouseDown/MouseMove/MouseUp事件
// 鼠标拖动前按下位置
Point p;
// 标识是否拖动
bool isMoving = false;
private void panelTop_MouseDown(object sender, MouseEventArgs e)
{
// 鼠标按下的点
p = e.Location;
isMoving = true;
}
private void panelTop_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && isMoving == true)
{
// 拖动距离
Point pNew = new Point(e.Location.X - p.X, e.Location.Y - p.Y);
// 当前位置+拖动距离
this.Location += new Size(pNew);
}
}
private void panelTop_MouseUp(object sender, MouseEventArgs e)
{
isMoving = false;
}
1
1
1
1
1
1
1
1
1
1