在做美化winform窗体,实现自定义窗体标题栏,圆角边框,并且支持拖拽窗体,最后还要能拖动窗体左、右、下边缘时,改变窗体的宽和高。
一般网上的都有代码,窗体设成无边框,自己加个panel就能实现自定义窗口标题。
圆角边框,绘制窗体Region,网上也有很多代码。
拖拽窗体,采用p/vinvoke操作,直接调win32api,简单又高效。
拖动改变尺寸,也时 pv 操作。简单又不闪屏,前提是不画圆角窗体。
但是要支持前面的圆角,又能鼠标拖动边缘改变尺寸,就有坑了。
采用了Region圆角方法,就无法拖动改变窗体的尺寸,解决办法,OnsizeChange里首先把Region置为null。
我是把画圆角的方法放在SizeChange里的,每次改变窗体大小,就调用。
或者拖动时不调用,等初始化和 最大化最小化,还有拖动尺寸结束了在绘制圆角,也就拖动时不是圆角,这是个方法,
但是采用win32api方式,发送SysComand消息,我不知道什么时候这个拖动尺寸的消息是结束了,不要以为加个鼠标按下或抬起或移动的事件去判断就可以了,不得行,因为拖动尺寸这个是SysComand消息的,即使里在这时候抬起鼠标按键,也是属于SysComand消息,根本不会触发常规的鼠标按键,移动等事件。
不采用win32api,而是写鼠标移动按下抬起那套代码来实现改变尺寸,然后OnsizeChange里首先把Region置为null,拖动完毕再加上圆角,这种方案,我试了,我没有成功,因为就算是不加圆角,就光拖动,这种方式就闪烁的厉害,加了双缓冲也一样吧。网上知乎有篇文章带代码带动图一搜就搜到了,可以看看。https://zhuanlan.zhihu.com/p/505185678
我采用这种方法,窗体上的图片拖动时会闪烁,控件这些不得闪烁。看效果:

 
但是并没又就解决了,改变大小时闪烁,即使加上双缓冲,也是闪烁。
至今我解决不了这个问题。
拖动窗体尺寸改变时,采用win32api的方式,最好要在窗体属性中找到有个MinSize什么的属性,能让窗体拖动最小时维持在这个最小尺寸的样子,否则,窗体会被拖动剩1px宽的像素不到。
 
还有种方法,重绘非客户区,虽然能改改非客户去的颜色,但是我不知道怎么改变非客户区的高度,能支持圆角,也支持改变尺寸,并且不用写任何代码,但是就是标题栏自定义程度太低,就能改改最大化、最小化、放大缩小的按钮 颜色,标题文字。窗体还是很丑,一般自定义非客户区不会这样做吧,个人觉得。做法,就是重写DefaultProc 方法,拦截非客户区绘制消息,然后重绘。
 
因为是个人练习,所以没有继续寻找解决办法了,采用第一种方法,圆角和拖动改变窗体尺寸这两个功能是相互排斥的,去掉其中任何一个功能,程序就会运行的很好。
最终,我没有找到一个好的兼容办法,有感兴趣的不妨自己挑战以下,代码网上都能搜到,我放代码怕误导思路了。

winform 关于无边框和拖动窗体边缘改变尺寸的 踩坑笔记的更多相关文章

  1. WPF无边框可拖动窗体

    下面主要记录下创建无边框窗体,并且可以拖动.这种窗体主要用于弹出小窗体时. <Window x:Class="WpfApplication1.MainWindow" xmln ...

  2. delphi无边框可拖动窗体

    unit UFrmModless; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ...

  3. MFC 无边框窗体实现用鼠标拖动窗体边缘实现窗体大小变化

    无边框窗体如何实现用鼠标拖动窗体边缘实现窗体大小变动呢?下面介绍一种方法,通过以下几个步骤即可实现: 1.实现WM_NCHITTEST消息,实现四条边框的模拟 2.实现WM_NCLBUTTONDOWN ...

  4. winform(无边框窗体与timer)

    一.无边框窗体 1.控制按钮如何制作就是放置可以点击的控件,不局限于使用按钮或是什么别的,只要放置的控件可以点击能触发点击事件就可以了 做的好看一点,就是鼠标移入(pictureBox1_MouseE ...

  5. winform无边框窗口拖动

    无边框的窗口想拖动,只需要在置顶的容器上添加对应的mousedown 和 mousemove 事件就可以实现了.代码如下: //拖动窗口 private Point mPoint = new Poin ...

  6. Winform自定义无边框窗体

    目的: 1.将窗体设置成无边框,如下面效果图 2.该无边框窗体添加了窗体放大.缩小(可以根据需要只能横向放大缩小  或者  竖向放大缩小)的功能 Point vPoint = new Point((i ...

  7. Qt5:无边框窗口拖动

    在窗口程序中,无边框窗口程序一般需要特殊处理才能拖动 Qt中,要实现无边框窗口的拖动,需要重新实现 mousePressEvent 和 mouseMoveEvent 俩虚函数 void Widget: ...

  8. 36.QT-解决无边框界面拖动卡屏问题(附带源码)

    1.简介 看到很多才学QT的人都会问为啥无边框拖动为啥会花屏? 那是因为你每次拖动的过程中都一直在调用move()函数让QT重新绘制界面,如果资源过大,就会导致当前图形还未绘制完,便又重新改变坐标了, ...

  9. Delphi无边框Form拖动

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

  10. CreateWindow创建无边框 可拉伸窗体

    createwindow 定义 HWND WINAPI CreateWindow( _In_opt_ LPCTSTR lpClassName, _In_opt_ LPCTSTR lpWindowNam ...

随机推荐

  1. C#实现文件加密、解密及文件拖拽至程序图标直接打开

    引用:https://www.cnblogs.com/longqi293/archive/2010/07/23/1783672.html 下载源码:http://files.cnblogs.com/l ...

  2. Linux:vscode扩展无法下载,报错:Error while fetching extensions : XHR failed

    在Linux系统上下载安装好vscode以后,发现扩展里面无法下载安装,报错:Error while fetching extensions : XHR failed 解决办法:修改 hosts 文件 ...

  3. echarts X轴类目名太长时隐藏,hover时显示全部

    echarts图表X轴 在柱状图中,X轴类目名如果数据太长: echarts会默认进行隐藏部分字段: 如果我们想让每一个类目名都显示出来,需要进行额外的处理 X轴类目名太长时,默认只显示一部分类目名 ...

  4. Linux 安装 adb环境

    一. 查看系统是否安装有adb adb或者adb version 二.通过apt-get安装adb 1. 安装adb sudo apt-get install android-tools-adb 2. ...

  5. docker安装mysql8.0.20并远程连接

    前言 今天docker安装mysql8.0.20捯饬了半天,主要是挂载问题和连接问题,索性记录一下.网上很多千篇一律,还有很多就是过时了,那还是我自己上场吧.大家看的时候,请睁大眼睛,按步骤来. Do ...

  6. SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践

    简介: 项目最初使用 Arthas 主要有两个目的: 1. 通过 arthas 解决实现测试环境.性能测试环境以及生产环境性能问题分析工具的问题. 2. 通过使用 jad.mc.redefine 功能 ...

  7. 使用云效Codeup10分钟紧急修复Apache Log4j2漏洞

    ​简介:2021年12月10日,国家信息安全漏洞共享平台(CNVD)收录了Apache Log4j2远程代码执行漏洞(CNVD-2021-95914),此漏洞是一个基于Java的日志记录工具,为Log ...

  8. 最佳实践丨云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航

    ​简介: 企业业务上云后,还面临特定可用区购买云上特定计算产品实例失败的困境?云上私有池pick一下 Why 云上业务为什么需要资源确定性.服务连续性 云计算正朝着像水电煤一样的基础设施演进,支持用户 ...

  9. [FAQ] 钉钉 Excel 回车键不能换行 ? 在线编辑如何换行

      Win 端表格换行:AIT+ENTER Mac 端表格换行:AIT OPTION+ENTER Tool:ChatAI Refer:钉钉技巧 Refer:https://www.dingtalk.c ...

  10. WPF 探索任务管理器的进程分组逻辑

    在看到 Win10 或 Win11 的 Task Manager 任务管理器时,不知大家是否有一个疑问,在 进程 标签里的应用进程是如何分组的.为什么有些组能包含很多个不同的进程,有些只能包含一个.本 ...