在做美化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. openGauss 列存表PSort索引

    openGauss 列存表 PSort 索引 概述 PSort(Partial sort) Index 是在列存表的列上建的聚簇索引.CUDesc 上有每个 CU 的 min 和 max 值,但如果业 ...

  2. openGauss每日一练第四天

    openGauss 每日一练第四天 本文出处:https://www.modb.pro/db/193083 学习地址 https://www.modb.pro/course/133 学习目标 学习 o ...

  3. Counter 1000

    From a 1000 Hz clock, derive a 1 Hz signal, called OneHertz, that could be used to drive an Enable s ...

  4. CabloyJS 4.22重磅推出弹出式页面交互风格

    升级说明 我们知道CabloyJS提供了pc=mobile+pad自适应布局机制,可以通过一套代码同时适配mobile端和pc端.基本思路就是优先适配mobile端,然后再把mobile端的交互体验带 ...

  5. 实训篇-JavaScript-陶渊明去没去过桃花源

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 接口API用例自动转locust测试用例

    做接口测试是必要的,写完接口测试用例,再写locust压测脚本,其实差异不大: 写个简单的py,把接口测试脚本转为locust压测脚本,本例只是简单的示范: 原接口校验脚本: 1 # -*- codi ...

  7. “让专业的人做专业的事”,畅捷通与阿里云的云原生故事 | 云原生 Talk

    简介: 如何借助阿里云强大的 IaaS 和 PaaS 能力去构建新一代的 SaaS 企业应用,从而给客户提供更好.更强的服务,这是畅捷通一直在思考和实践的方向.最终,畅捷通选定阿里云企业级分布式应用服 ...

  8. dotnet 修复 Uno 中文乱码

    这是一个历史问题,在使用 Uno 展示中文的时候,如果设置 Uno 的底层使用 Skia 系进行渲染,那么将会因为中文字体问题,导致渲染出现乱码.此问题已被我修复,最佳解法是更新到最新版本 在上一篇博 ...

  9. Redisant Toolbox——面向开发者的多合一工具箱

    Redisant Toolbox--面向开发者的多合一工具箱 Redisant Toolbox 拥有超过30种常用的开发工具:精心设计,快速.高效:离线使用,尊重您的隐私.官网地址:http://ww ...

  10. 开发日记:中控PUSH协议

    using System; using System.IO; using System.Net; using System.Text.RegularExpressions; namespace Con ...