很多时候我们不希望使用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请看下集。

如何实现一个无边框Form的移动和改变大小(一)的更多相关文章

  1. 如何实现一个无边框Form的移动和改变大小(二)

    接着上文:这里写链接内容 我们来说说一个比较复杂的实现, 效果如图: 注意为了能够凸显没有NC(NotClient)区域,我们额外用了3个panel分别放在窗体的左右和下部.用来模拟客户自己的控件. ...

  2. Qt:无标题栏无边框程序的拖动和改变大小

    From: http://blog.csdn.net/kfbyj/article/details/9284923 最近做项目遇到的问题,总结下. 有时候我们觉得系统的标题栏和按钮太丑太呆板,想做自己的 ...

  3. Qt 无标题无边框程序的拖动和改变大小

    最近做项目遇到的问题,总结下. 有时候我们觉得系统的标题栏和按钮太丑太呆板,想做自己的标题栏以及最大化.最小化.关闭,菜单按钮,我们就需要 setWindowFlags(Qt::FramelessWi ...

  4. WINFROM 无边框窗体的移动和改变大小

    因为去掉了边框  移动和调整大小都用不了了,可以调用WIN32的API来实现 1.定义必须常量 ; ; ; ; ; ; const int Guying_HTBOTTOMLEFT = 0x10; ; ...

  5. Qt无边框MainWindow如何拖动四周改变大小

    原来还有winEvent(), x11Event() and macEvent() 这些东西...不过貌似还需要找更好的办法,否则就无法跨平台了. 你需要重新处理部分窗体事件,以下代码适用于Windo ...

  6. Delphi无边框Form拖动

    用Delphi做登陆窗口,如果使用无边框Form,想要拖动窗口,可以在某个控件的OnMouseDown事件中写下以下代码 ReleaseCapture; Perform(WM_SYSCOMMAND, ...

  7. QT: 如何移动和缩放一个无边框窗口

    一个QT窗口如下可以做到无边框: Window { id: window //Designer 竟然不支持..., 设计模式时要注意 flags: Qt.FramelessWindowHint wid ...

  8. 【CITE】 C#中实现拖动无边框Form窗体

    首先建一个Windows应用程序 将Form1的 FormBorderStyle属性设置为None 主要是在Form1窗体触发三个事件:Form4_MouseDown,Form4_MouseMove, ...

  9. WPF实现无边框窗体拖拽右下角▲ 改变窗体大小【framwork4.0】 谢谢大家关注

    效果图:(右下角拖拽改变窗体大小) 第一步:添加xaml代码: <Border Name="ResizeBottomRight" MouseMove="Resize ...

随机推荐

  1. ASP.Net MVC upload file with record & validation - Step 6

    Uploading file with other model data, validate model & file before uploading by using DataAnnota ...

  2. ZooKeeper学习笔记(一)

    引导 刚开始学习ZooKeepter,看的书是[O'Reilly Media] ZooKeeper.下面的内容基本上是该书的翻译,很多语句也存在问题,大致读还是没问题的,自己在学习中记录. 第一章 Z ...

  3. EasyDarwin开源流媒体服务器如何实现按需推送直播的

    --本文转自EasyDarwin开源团队成员邵帅的博客:http://blog.csdn.net/ss00_2012/article/details/51441753 我们使用EasyDarwin的推 ...

  4. ABAP 实现Excel 粘贴复制

    "设置需要复制的区域 CLEAR gv_range. gs_ole2-row1 = . gs_ole2-col1 = . gs_ole2-row2 = . gs_ole2-col2 = . ...

  5. shapes

    接口 shape package shape; public abstract interface shape { public abstract void Draw(); public abstra ...

  6. wifi方式调试android程序

    1. 通过wifi, 利用adb来连接手机. 在pc的cmd中输入命令: adb connect 192.168.1.100 其中adb就是手机的ip. 如果连接成功, 就可以进入android的sh ...

  7. dhcpcd守护进程分析【转】

    本文转载自;http://blog.csdn.net/lishanmin11/article/details/37930073 最近在调android ethernet功能,android本身不带 e ...

  8. Codeforces Round #394 (Div. 2) D. Dasha and Very Difficult Problem —— 贪心

    题目链接:http://codeforces.com/contest/761/problem/D D. Dasha and Very Difficult Problem time limit per ...

  9. servlet与jsp理论知识讲解

    servlet是java服务器端编程,是运行在服务器上的.不同于以前的java小程序.                                                         ...

  10. 关于RHEL5中yum挂载iso源引起的问题(转)

    今天在虚机上通过yum挂载iso源来安装rpm包,但提示错误,内容见下面.之前也有过这样的操作, mount后,修改repo文件,然后就可以yum install  rpm包了:过程很简单啊.不知道这 ...