0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

winform设置窗体无边框

修罗 2023-01-13 517 0条评论 c#

首页 / 正文

winform设置窗体无边框

  • 窗体默认外观

image-20230113113106530.png

  • 将Form的属性FormBorderStyle修改为None

image-20230113113228751.png

  • 拖一个panel控件,并将dock属性设为Top,固定在顶部,再设置一下背景颜色

image-20230113113752048.png

  • 拖一个label控件,设置图标字体和Text内容,0是最小化图标,1是最大化,r是关闭图标

image-20230113115617183.png

  • 复制label,设计成如下效果

image-20230113115923114.png

  • 依次给label绑定点击事件

image-20230113120158554.png

  • 事件处理
// 点击关闭
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;
    }
}
  • 缩放时设置图标没有往右靠

image-20230113122226694.png

  • 选中3个按钮,Anchor改为Top,Right

image-20230113122353413.png

  • 设置窗口可拖动

给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;
}

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis