C#自定义Winform无边框窗体
C#自定义Winform无边框窗体
在实际项目中,WinForm窗体或者控件不能满足要求,所以就需要自己设计窗体等,当然设计界面可以用的东西很多,例如WPF、或者一些第三方的库等。本例中将采用WinForm设计一个扁平美观的窗体。
上一篇中我们制作了一个button按钮控件,刚好本例可采用
需要的可以参考:C#自定义Button按钮控件
窗体效果:
接下来就是窗体的设计
1.添加一个窗体继承原来的窗体Form
public partial class FormEX : Form
2.添加窗体属性
/// <summary>
/// 是否允许最大化
/// </summary>
private bool maxVisible = true;
[Description("是否允许最大化")]
public bool MaxVisible
{
get { return maxVisible; }
set
{
maxVisible = value;
if (!maxVisible)
{
this.btnEXMin.Location = new System.Drawing.Point(this.btnEXMax.Location.X, );
this.btnEXMax.Visible = false;
}
else
{
this.btnEXMin.Location = new System.Drawing.Point(this.btnEXMax.Location.X - , );
this.btnEXMax.Visible = true;
}
}
} /// <summary>
/// 窗体标题
/// </summary>
private string titleText;
[Description("窗体标题")]
public string TitleText
{
get { return titleText; }
set
{
titleText = value;
title.Text = titleText; }
}
/// <summary>
/// 窗体标题是否显示
/// </summary>
private bool titleVisible = true;
[Description("窗体标题是否显示")]
public bool TitleVisible
{
get { return titleVisible; }
set
{
titleVisible = value;
title.Visible = titleVisible;
}
} /// <summary>
/// 窗口默认大小
/// FormSize.NORMAL OR FormSize.MAX
/// </summary>
private FormSize defaultFormSize = FormSize.NORMAL;
[Description("窗口默认大小")]
public FormSize DefaultFormSize
{
get { return defaultFormSize; }
set
{
defaultFormSize = value;
if (defaultFormSize == FormSize.MAX)
{
//防止遮挡任务栏
this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
this.WindowState = FormWindowState.Maximized;
//最大化图标切换
this.btnEXMax.ImageDefault = global::BenNHControl.Properties.Resources.MaxNormal;
}
}
}
3.窗体大小自由更改
const int WM_NCHITTEST = 0x0084;
const int HTLEFT = ; //左边界
const int HTRIGHT = ; //右边界
const int HTTOP = ; //上边界
const int HTTOPLEFT = ; //左上角
const int HTTOPRIGHT = ; //右上角
const int HTBOTTOM = ; //下边界
const int HTBOTTOMLEFT = 0x10; //左下角
const int HTBOTTOMRIGHT = ; //右下角
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 >> & 0xFFFF);
vPoint = PointToClient(vPoint);
if (vPoint.X <= )
if (vPoint.Y <= )
m.Result = (IntPtr)HTTOPLEFT;
else if (vPoint.Y >= ClientSize.Height - )
m.Result = (IntPtr)HTBOTTOMLEFT;
else m.Result = (IntPtr)HTLEFT;
else if (vPoint.X >= ClientSize.Width - )
if (vPoint.Y <= )
m.Result = (IntPtr)HTTOPRIGHT;
else if (vPoint.Y >= ClientSize.Height - )
m.Result = (IntPtr)HTBOTTOMRIGHT;
else m.Result = (IntPtr)HTRIGHT;
else if (vPoint.Y <= )
m.Result = (IntPtr)HTTOP;
else if (vPoint.Y >= ClientSize.Height - )
m.Result = (IntPtr)HTBOTTOM;
break;
default:
base.WndProc(ref m);
break;
}
}
4.窗体按钮等事件添加
/// <summary>
/// 最小化按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnEXMin_ButtonClick(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
} /// <summary>
/// 最大化按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnEXMax_ButtonClick(object sender, EventArgs e)
{
this.MaxNormalSwitch();
} /// <summary>
/// 关闭按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnEXClose_ButtonClick(object sender, EventArgs e)
{
this.Close();
} /// <summary>
/// 鼠标按下标题栏
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void titleBar_MouseDown(object sender, MouseEventArgs e)
{
mPoint = new Point(e.X, e.Y);
} /// <summary>
/// 鼠标在移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void titleBar_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
}
} private void titleBar_DoubleClick(object sender, EventArgs e)
{
this.MaxNormalSwitch();
} /// <summary>
/// 最大化和正常状态切换
/// </summary>
private void MaxNormalSwitch()
{
if (this.WindowState == FormWindowState.Maximized)//如果当前状态是最大化状态 则窗体需要恢复默认大小
{
this.WindowState = FormWindowState.Normal;
//
this.btnEXMax.ImageDefault = global::BenNHControl.Properties.Resources.Max;
}
else
{
//防止遮挡任务栏
this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
this.WindowState = FormWindowState.Maximized;
//最大化图标切换
this.btnEXMax.ImageDefault = global::BenNHControl.Properties.Resources.MaxNormal;
}
this.Invalidate();//使重绘
} private void FormEX_Resize(object sender, EventArgs e)
{
this.Invalidate();//使重绘
}
窗体效果展示
工程源程序下载
C#自定义Winform无边框窗体的更多相关文章
- C#自定义按钮、自定义WinForm无边框窗体、自定义MessageBox窗体
C#自定义按钮.自定义WinForm无边框窗体.自定义MessageBox窗体 C#自定义Button按钮控件 效果展示 C#自定义Winform无边框窗体 效果展示 C#自定义无边框MessageB ...
- C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- WinForm无边框窗体移动方法
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- WinForm 无边框窗体和timer控件
一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入,移出,按下三个事件会让按钮改变样式 如何获取图 ...
- WinForm 无边框窗体改变尺寸及移动窗体
#region 无边框窗体移动改变大小 [DllImport("user32.dll")] public static extern bool ReleaseCapture(); ...
- Winform无边框窗体(FormBorderStyle属性设为None)自定义移动
为了界面的好看,有时候需要将窗体FormBorderStyle属性设为None,这样就可以根据自己的喜欢来设计界面.但这样窗体无法进行移动的.而且默认的窗体(FormBorderStyle=Sizab ...
- WinForm - 无边框窗体自定义移动
为了界面的好看,有时候需要将窗体FormBorderStyle属性设为None,这样就可以根据自己的喜欢来设计界面.但这样窗体无法进行移动的.而且默认的窗体(FormBorderStyle=Sizab ...
- Winform无边框窗体的移动和阴影
//窗体移动API [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport ...
随机推荐
- Dll注入经典方法完整版
总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...
- MySql之视图的使用
一:视图是什么 视图相当于一个窗口,一个基于具体数据库表.定义了相关查询规则 的窗口. 建立视图,可以重用一些复杂的查询语句. 建立视图,相当于定义了一系列查询操作:从视图查询数据,相当于在调用 ...
- Linux-文件描述符的本质及与文件指针的区别
文章参考:文件描述符的本质.文件描述符和文件指针的区别.文件描述符fd和文件指针flip的理解 推荐:task_struct 和文件系统的关系 系统中文件相关表 右侧的表称为i节点表,在整个系统中只有 ...
- List stream 对象 属性去重
单值去重不写了,记录对象去重 随手一个对象: @Data @AllArgsConstructor public class Milk { private Integer key; private St ...
- maven打包含有多个main程序的jar包及运行方式
pom.xml <build> <plugins> <plugin> <groupId> ...
- easyui confirm提示框 调整显示位置
方法一: $.messager.confirm("确认对话框","该客户已经存在!确定:查看该客户 ", function(r){ if(r){ alert(& ...
- C++的子类与父类强制转换产生的问题
近日,在项目的一个类中如果碰上想要将子类强制转换成父类,然后再调用其父类版本的virtual虚函数. 就会出现gcc编译错误提示:error: ld returned 1 exit status gc ...
- 爬虫 需要什么样的 CPU,内存 和带宽
所有的需求都看这个图片吧,这个就是我爬取一个网站所用的服务器和服务器资源的消耗情况.
- AJAX技术之DWR框架
DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...
- Windows Media Player 的文件格式支持情况
唔,官方文档:https://support.microsoft.com/zh-cn/help/316992/file-types-supported-by-windows-media-player ...