如何实现一个无边框Form的移动和改变大小(一)
2024-08-30 10:12:38
很多时候我们不希望使用Windows提供的窗体。
我们希望使用一个无边框的窗体,什么border,caption透明就行了。
下面我们来说下一些实现方法。
这个方法要求窗体自定义的border size, 需要使用Form的Padding来实现
例如设置Padding = 5, 则Form的四周有一个5像素的border。如下图:
可以看到内框外面还有5个像素的蓝色窗体。
如果你喜欢这种方式的话,恭喜你,这个实现及其简单。
- 首先我们实现窗体四周的放大缩小
你只需要在你的窗体中重写WndProc,告诉系统哪些位置是HT_TOP,哪些位置是HT_Bottom等就可以了
代码如下:
protected override void WndProc(ref Message m)
{
if(m.Msg == (int)WM.WM_NCHITTEST )
{
Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
pos = this.PointToClient(pos);
if (pos.X < 0 || pos.Y < 0)
{
//非法位置
}
else if (pos.X <= _border)
{
//左侧
if (pos.Y <= _border)
{
//左上侧
m.Result = (IntPtr)HT.HTTOPLEFT;
return;
}
else if (pos.Y >= this.Height - _border)
{
//左下侧
m.Result = (IntPtr)HT.HTBOTTOMLEFT;
return;
}
else
{
//左侧
m.Result = (IntPtr)HT.HTLEFT;
return;
}
}
else if (pos.X >= this.Width - _border)
{
//右侧
if (pos.Y <= _border)
{
//右上侧
m.Result = (IntPtr)HT.HTTOPRIGHT;
return;
}
else if (pos.Y >= this.Height - _border)
{
//右下侧
m.Result = (IntPtr)HT.HTBOTTOMRIGHT;
return;
}
else
{
//右侧
m.Result = (IntPtr)HT.HTRIGHT;
return;
}
}
else
{
//中部
if (pos.Y <= _border)
{
//上中侧
m.Result = (IntPtr)HT.HTTOP;
return;
}
else if (pos.Y >= this.Height - _border)
{
//下中侧
m.Result = (IntPtr)HT.HTBOTTOM;
return;
}
else
{
}
}
return;
}
else
{
base.WndProc(ref m);
}
}
int _border = 5;
其中WM.WM_NCHITTEST是用enum实现, 大家可以用int值来替换。
_border就是边框的长度,应该和WinForm的Padding值保持一致。
- 接下来说下如何实现Caption
创建一个panel, Dock = Top, 创建一个事件
panelCaption.MouseDown += panelCaption_MouseDown;
事件的实现如下:
void panelCaption_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Left)
{
NativeMethods.ReleaseCapture();
NativeMethods.SendMessage(this.Handle, (uint)WM.WM_NCLBUTTONDOWN, (UIntPtr)HT.HTCAPTION, (IntPtr)0);
}
}
其中NativeMethods都是Windows的原生函数,请各位自行书写,这里不再累述。
这样一个无边框(伪)的Form就如此这般诞生了。
如果要实现一个无边框(正)的Form请看下集。
最新文章
- .Net导出pdf文件,C#实现pdf导出
- 1Z0-053 争议题目解析694
- dex文件格式一
- Arctext.js - 基于 CSS3 &; jQuery 的文本弯曲效果
- Git+GitHub 使用小结
- 避免JS全局变量冲突
- SQL Server查看表信息
- string 常用 方法
- Intersection(poj)
- java中的finally用return也挡不住
- angualr高级篇之elem.scope()、elem.isolateScope和$compile(elem)(scope)中scope的区别
- 认识Java WEB应用
- 2>;&;1的意思
- java语句中的重定向函数
- sql server 2000 个人版怎么在win7下安装
- 从零搭建和配置OSX开发环境
- c/c++ int数组初始化/重置为0
- UVa 442 Matrix Chain Multiplication(栈的应用)
- [转]Spring MVC 教程,快速入门,深入分析
- Yii 语言设置 中文提示信息
热门文章
- EasyDarwin开源流媒体云平台之语音对讲功能设计与实现
- go echo studygolang ___go_build_myT_go__1_.exe
- LeetCode(83)Remove Duplicates from Sorted List
- [Java多线程] volatile 关键字正确使用方法
- Android在有存储卡和无存储卡情况下拍照后固定尺寸和压缩大小
- [bzoj 3720] Gty的妹子树 (树上分块)
- ES6 对Math对象的扩展
- 动态注册BroadcastReceiver
- hdu-5768 Lucky7(容斥定理+中国剩余定理)
- 最基本PSO算法的C++实现