如何实现一个无边框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 ...
随机推荐
- 有趣的Ruby-学习笔记3
Ruby方法 方法名要以小写字母开头.假设用大写字母开头会被作为常量 (这点非常奇怪) 定义一个无參的方法 def method_name expr.. end 定义一个有參的方法 def metho ...
- PostgreSQL与MySQL比較
特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例. 一个实例能够管理一个或多个数据库.一台server能够执行多个 mysqld 实例.一个实例管理器能 ...
- session.use_cookies有什么作用,
session.use_cookies有什么作用, @ini_set('session.use_cookies', 1);什么意思 若session.use_cookies = 1 sessionid ...
- 九度OJ 1085:求root(N, k) (迭代)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1407 解决:523 题目描述: N<k时,root(N,k) = N,否则,root(N,k) = root(N',k).N'为N的 ...
- openjdk源码目录结构
1 openjdk源码 http://hg.openjdk.java.net 选择jdk8u这个project, 然后选择jdk8u20这个repository. 2 目录结构 corba: comm ...
- 区块链+AI将给区块链带来怎样的改变?
区块链和人工智能技术都是互联网时代最新.最热的技术,不仅可以改变我们生活,还能产生巨大的财富,为此国家大力支持发展,科技巨头们也纷纷布局.那区块链与人工智能结合,对区块链技术而言会产生什么样的化学反应 ...
- 【LeetCode】Search in Rotated Sorted Array II(转)
原文链接 http://oj.leetcode.com/problems/search-in-rotated-sorted-array-ii/ http://blog.csdn.net/linhuan ...
- 解决 eclipse出现 Address already in use: bind
今天开发遇到下面问题,贴出部分异常信息,如下: [WARNING] failed SelectChannelConnector@ java.net.BindException: Address alr ...
- Bestcoder BestCoder Round #28 A Missing number(查找缺失的合法数字)
Problem Description There is a permutation without two numbers in it, and now you know what numbers ...
- JavaScript中浮点数的保留小数位数的问题
方法一 简介:如题! 繁琐版... 代码如下: var significantFigure= function(value,figure){ var arr=(valu ...