很多时候我们不希望使用Windows提供的窗体。

我们希望使用一个无边框的窗体,什么border,caption透明就行了。

下面我们来说下一些实现方法。

这个方法要求窗体自定义的border size, 需要使用Form的Padding来实现

例如设置Padding = 5, 则Form的四周有一个5像素的border。如下图:



可以看到内框外面还有5个像素的蓝色窗体。

如果你喜欢这种方式的话,恭喜你,这个实现及其简单。

  1. 首先我们实现窗体四周的放大缩小

    你只需要在你的窗体中重写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值保持一致。

  1. 接下来说下如何实现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请看下集。

最新文章

  1. .Net导出pdf文件,C#实现pdf导出
  2. 1Z0-053 争议题目解析694
  3. dex文件格式一
  4. Arctext.js - 基于 CSS3 &amp; jQuery 的文本弯曲效果
  5. Git+GitHub 使用小结
  6. 避免JS全局变量冲突
  7. SQL Server查看表信息
  8. string 常用 方法
  9. Intersection(poj)
  10. java中的finally用return也挡不住
  11. angualr高级篇之elem.scope()、elem.isolateScope和$compile(elem)(scope)中scope的区别
  12. 认识Java WEB应用
  13. 2&gt;&amp;1的意思
  14. java语句中的重定向函数
  15. sql server 2000 个人版怎么在win7下安装
  16. 从零搭建和配置OSX开发环境
  17. c/c++ int数组初始化/重置为0
  18. UVa 442 Matrix Chain Multiplication(栈的应用)
  19. [转]Spring MVC 教程,快速入门,深入分析
  20. Yii 语言设置 中文提示信息

热门文章

  1. EasyDarwin开源流媒体云平台之语音对讲功能设计与实现
  2. go echo studygolang ___go_build_myT_go__1_.exe
  3. LeetCode(83)Remove Duplicates from Sorted List
  4. [Java多线程] volatile 关键字正确使用方法
  5. Android在有存储卡和无存储卡情况下拍照后固定尺寸和压缩大小
  6. [bzoj 3720] Gty的妹子树 (树上分块)
  7. ES6 对Math对象的扩展
  8. 动态注册BroadcastReceiver
  9. hdu-5768 Lucky7(容斥定理+中国剩余定理)
  10. 最基本PSO算法的C++实现