zoukankan      html  css  js  c++  java
  • C#自定义Winform无边框窗体

    C#自定义Winform无边框窗体

      在实际项目中,WinForm窗体或者控件不能满足要求,所以就需要自己设计窗体等,当然设计界面可以用的东西很多,例如WPF、或者一些第三方的库等。本例中将采用WinForm设计一个扁平美观的窗体。

    上一篇中我们制作了一个button按钮控件,刚好本例可采用    

    需要的可以参考:C#自定义Button按钮控件

    窗体效果:

    接下来就是窗体的设计

    1.添加一个窗体继承原来的窗体Form

    1 public partial class FormEX : Form

    2.添加窗体属性

     1      /// <summary>
     2         /// 是否允许最大化
     3         /// </summary>
     4         private bool maxVisible = true;
     5         [Description("是否允许最大化")]
     6         public bool MaxVisible
     7         {
     8             get { return maxVisible; }
     9             set
    10             {
    11                 maxVisible = value;
    12                 if (!maxVisible)
    13                 {
    14                     this.btnEXMin.Location = new System.Drawing.Point(this.btnEXMax.Location.X, 12);
    15                     this.btnEXMax.Visible = false;
    16                 }
    17                 else
    18                 {
    19                     this.btnEXMin.Location = new System.Drawing.Point(this.btnEXMax.Location.X - 20, 12);
    20                     this.btnEXMax.Visible = true;
    21                 }
    22             }
    23         }
    24 
    25 
    26         /// <summary>
    27         /// 窗体标题
    28         /// </summary>
    29         private string titleText;
    30         [Description("窗体标题")]
    31         public string TitleText
    32         {
    33             get { return titleText; }
    34             set
    35             {
    36                 titleText = value;
    37                 title.Text = titleText;
    38 
    39             }
    40         }
    41         /// <summary>
    42         /// 窗体标题是否显示
    43         /// </summary>
    44         private bool titleVisible = true;
    45         [Description("窗体标题是否显示")]
    46         public bool TitleVisible
    47         {
    48             get { return titleVisible; }
    49             set
    50             {
    51                 titleVisible = value;
    52                 title.Visible = titleVisible;
    53             }
    54         }
    55 
    56         /// <summary>
    57         /// 窗口默认大小
    58         /// FormSize.NORMAL OR FormSize.MAX
    59         /// </summary>
    60         private FormSize defaultFormSize = FormSize.NORMAL;
    61         [Description("窗口默认大小")]
    62         public FormSize DefaultFormSize
    63         {
    64             get { return defaultFormSize; }
    65             set
    66             {
    67                 defaultFormSize = value;
    68                 if (defaultFormSize == FormSize.MAX)
    69                 {
    70                     //防止遮挡任务栏
    71                     this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
    72                     this.WindowState = FormWindowState.Maximized;
    73                     //最大化图标切换
    74                     this.btnEXMax.ImageDefault = global::BenNHControl.Properties.Resources.MaxNormal;
    75                 }
    76             }
    77         }

    3.窗体大小自由更改

    1         const int WM_NCHITTEST = 0x0084;
    2         const int HTLEFT = 10;      //左边界
    3         const int HTRIGHT = 11;     //右边界
    4         const int HTTOP = 12;       //上边界
    5         const int HTTOPLEFT = 13;   //左上角
    6         const int HTTOPRIGHT = 14;  //右上角
    7         const int HTBOTTOM = 15;    //下边界
    8         const int HTBOTTOMLEFT = 0x10;    //左下角
    9         const int HTBOTTOMRIGHT = 17;     //右下角
      protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case WM_NCHITTEST:
                        base.WndProc(ref m);
                        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;
                    default:
                        base.WndProc(ref m);
                        break;
                }
            }

    4.窗体按钮等事件添加

     1  /// <summary>
     2         /// 最小化按钮事件
     3         /// </summary>
     4         /// <param name="sender"></param>
     5         /// <param name="e"></param>
     6         private void btnEXMin_ButtonClick(object sender, EventArgs e)
     7         {
     8             this.WindowState = FormWindowState.Minimized;
     9         }
    10 
    11         /// <summary>
    12         /// 最大化按钮事件
    13         /// </summary>
    14         /// <param name="sender"></param>
    15         /// <param name="e"></param>
    16         private void btnEXMax_ButtonClick(object sender, EventArgs e)
    17         {
    18             this.MaxNormalSwitch();
    19         }
    20 
    21         /// <summary>
    22         /// 关闭按钮事件
    23         /// </summary>
    24         /// <param name="sender"></param>
    25         /// <param name="e"></param>
    26         private void btnEXClose_ButtonClick(object sender, EventArgs e)
    27         {
    28             this.Close();
    29         }
    30 
    31         /// <summary>
    32         /// 鼠标按下标题栏
    33         /// </summary>
    34         /// <param name="sender"></param>
    35         /// <param name="e"></param>
    36         private void titleBar_MouseDown(object sender, MouseEventArgs e)
    37         {
    38             mPoint = new Point(e.X, e.Y);
    39         }
    40 
    41         /// <summary>
    42         /// 鼠标在移动
    43         /// </summary>
    44         /// <param name="sender"></param>
    45         /// <param name="e"></param>
    46         private void titleBar_MouseMove(object sender, MouseEventArgs e)
    47         {
    48             if (e.Button == MouseButtons.Left)
    49             {
    50                 this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
    51             }
    52         }
    53 
    54         private void titleBar_DoubleClick(object sender, EventArgs e)
    55         {
    56             this.MaxNormalSwitch();
    57         }
    58 
    59 
    60         /// <summary>
    61         /// 最大化和正常状态切换
    62         /// </summary>
    63         private void MaxNormalSwitch()
    64         {
    65             if (this.WindowState == FormWindowState.Maximized)//如果当前状态是最大化状态 则窗体需要恢复默认大小
    66             {
    67                 this.WindowState = FormWindowState.Normal;
    68                 //
    69                 this.btnEXMax.ImageDefault = global::BenNHControl.Properties.Resources.Max;
    70             }
    71             else
    72             {
    73                 //防止遮挡任务栏
    74                 this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
    75                 this.WindowState = FormWindowState.Maximized;
    76                 //最大化图标切换
    77                 this.btnEXMax.ImageDefault = global::BenNHControl.Properties.Resources.MaxNormal;
    78             }
    79             this.Invalidate();//使重绘
    80         }
    81 
    82         private void FormEX_Resize(object sender, EventArgs e)
    83         {
    84             this.Invalidate();//使重绘
    85         }

    窗体效果展示

    工程源程序下载 

  • 相关阅读:
    poj 3080 kmp+暴力
    org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse
    log4j:WARN No appenders could be found for logger
    HBase2.0.5 WordCount
    Eclipse连接HBase 报错:org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
    Eclipse Oxygen.2 Release (4.7.2)添加JUnit
    hiveserver2启动成功但无法通过beeline连接
    vi从当前行删除到最后一行
    Hive SemanticException
    Hive启动失败
  • 原文地址:https://www.cnblogs.com/JiYF/p/8686393.html
Copyright © 2011-2022 走看看