如何实现一个无边框Form的移动和改变大小(一)
很多时候我们不希望使用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请看下集。
如何实现一个无边框Form的移动和改变大小(一)的更多相关文章
- 如何实现一个无边框Form的移动和改变大小(二)
接着上文:这里写链接内容 我们来说说一个比较复杂的实现, 效果如图: 注意为了能够凸显没有NC(NotClient)区域,我们额外用了3个panel分别放在窗体的左右和下部.用来模拟客户自己的控件. ...
- Qt:无标题栏无边框程序的拖动和改变大小
From: http://blog.csdn.net/kfbyj/article/details/9284923 最近做项目遇到的问题,总结下. 有时候我们觉得系统的标题栏和按钮太丑太呆板,想做自己的 ...
- Qt 无标题无边框程序的拖动和改变大小
最近做项目遇到的问题,总结下. 有时候我们觉得系统的标题栏和按钮太丑太呆板,想做自己的标题栏以及最大化.最小化.关闭,菜单按钮,我们就需要 setWindowFlags(Qt::FramelessWi ...
- WINFROM 无边框窗体的移动和改变大小
因为去掉了边框 移动和调整大小都用不了了,可以调用WIN32的API来实现 1.定义必须常量 ; ; ; ; ; ; const int Guying_HTBOTTOMLEFT = 0x10; ; ...
- Qt无边框MainWindow如何拖动四周改变大小
原来还有winEvent(), x11Event() and macEvent() 这些东西...不过貌似还需要找更好的办法,否则就无法跨平台了. 你需要重新处理部分窗体事件,以下代码适用于Windo ...
- Delphi无边框Form拖动
用Delphi做登陆窗口,如果使用无边框Form,想要拖动窗口,可以在某个控件的OnMouseDown事件中写下以下代码 ReleaseCapture; Perform(WM_SYSCOMMAND, ...
- QT: 如何移动和缩放一个无边框窗口
一个QT窗口如下可以做到无边框: Window { id: window //Designer 竟然不支持..., 设计模式时要注意 flags: Qt.FramelessWindowHint wid ...
- 【CITE】 C#中实现拖动无边框Form窗体
首先建一个Windows应用程序 将Form1的 FormBorderStyle属性设置为None 主要是在Form1窗体触发三个事件:Form4_MouseDown,Form4_MouseMove, ...
- WPF实现无边框窗体拖拽右下角▲ 改变窗体大小【framwork4.0】 谢谢大家关注
效果图:(右下角拖拽改变窗体大小) 第一步:添加xaml代码: <Border Name="ResizeBottomRight" MouseMove="Resize ...
随机推荐
- SAM4E单片机之旅——6、LED闪烁之按钮控制
现在试试用按钮控制LED灯……让LED在一个按钮按下时亮起:弹起时灭掉. 主要目的是学习GPIO的输入及中断. 一. 电路 图中的J39-n是几个跳线插座,位置在开发板LCD附近,往下进行前要先确保跳 ...
- Node 文件上传,ZIP
上传文件: 很多人会使用第三包进行文件的上传,例如formidable. 我也研究过,可是与Express3.x框架一起使用时,发现上传的文件总是找不到.结果原因是下面这句导致: app.use(ex ...
- 我的前端之旅-nodejs 安装静态的文件服务器 (1)
一个最简单的 Web Server 之功能包含下列三个步骤:步骤一 : 接收浏览器所传来的网址:步骤二 : 取出相对应的文件:步骤三 : 将文件内容传回给浏览器.然而.在这个接收与传回的过程中,所有的 ...
- git branch 分支创建时间排序
git branch日期排序 vi ~/.gitconfig [alias]lb = !"for k in `git branch -a|perl -pe s/^..//`;do echo ...
- json Gson
package com.example.volleylearn; import java.util.ArrayList; import java.util.List; import java.util ...
- zsh 的简单介绍
什么是 zsh,要想解释好这个问题,那么得先说明什么是 shell.不负责任的解释说法就是 shell 就是一个壳.这个壳可不是蜗牛的壳,而是计算机的一个壳,当然也不是计算机的外壳啦,这个壳是相对于计 ...
- Bestcoder round 18----B题(一元三次方程确定区间的最大值(包含极值比较))
Math Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- spring mvc提交日期类型参数
如题,spring mvc直接提交Date类型参数会报错,400 bad request的错误.在controller里加上 @InitBinder protected void initBinder ...
- Java 高阶 —— try/catch
// try catch 在 for 循环外 try { for(int i = 0; i < max; i++) { String myString = ...; float myNum = ...
- mysql审计实现方法
Mysql版本: 5.6.24-72.2 一.通过init-connect + binlog 实现MySQL审计功能 基本原理: 由于审计的关键在于DML语句,而所有的DML语句都可以通过binlog ...