当前位置 : 主页 > 编程语言 > 其它开发 >

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

来源:互联网 收集:自由互联 发布时间:2022-06-03
C# winform 踩坑笔记 在做美化winform窗体,实现自定义窗体标题栏,圆角边框,并且支持拖拽窗体,最后还要能拖动窗体左、右、下边缘时,改变窗体的宽和高。一般网上的都有代码,窗体
C# winform 踩坑笔记 在做美化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 方法,拦截非客户区绘制消息,然后重绘。   因为是个人练习,所以没有继续寻找解决办法了,采用第一种方法,圆角和拖动改变窗体尺寸这两个功能是相互排斥的,去掉其中任何一个功能,程序就会运行的很好。 最终,我没有找到一个好的兼容办法,有感兴趣的不妨自己挑战以下,代码网上都能搜到,我放代码怕误导思路了。
网友评论