在做美化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. 将py文件编译成pyc

    核心代码 import compileall compileall.compile_file("a.py", legacy=True, force=True) 演示步骤 1.新建 ...

  2. 通过 Traefik Hub 暴露家里的网络服务

    Traefik Hub 简介 ️Reference: 你的云原生网络平台 -- 发布和加固你的容器从未如此简单. Traefik Hub 为您在 Kubernetes 或其他容器平台上运行的服务提供一 ...

  3. 抓包整理————wireshark DNS 演练[三]

    前言 简单整理一些wireshark dns 演练. 正文 简单介绍一下什么是dns. 这个其实可以百度一下哈,其实就是将域名转换为ip. 然后查询过程是这样的: 根域名服务器 权威服务器 dns 被 ...

  4. Docker compose 部署 nginx+php

    Docker compose 部署 nginx+php 拉取Docker镜像 docker pull nginx:1.21.6 docker pull php:7.4.28-fpm 创建docker- ...

  5. leetcode:1380. 矩阵中的幸运数

    1380. 矩阵中的幸运数 给你一个 m * n 的矩阵,矩阵中的数字 各不相同 .请你按 任意 顺序返回矩阵中的所有幸运数. 幸运数是指矩阵中满足同时下列两个条件的元素: 在同一行的所有元素中最小 ...

  6. Fatal: (vsim-3381) obsolete library format 解决办法

    有很多软件仿真都是black boxs 黑盒子模式,所以用modelsim提示该错误.错误的原因是在于库用了其他旧的软件版本编译好的. 所以解决的办法如下: 在已经映射好的库选择refresh就可以刷 ...

  7. shell脚本中的运算符和条件判断

    shell脚本中的运算符和条件判断: 一.算术运算符 在Shell脚本中,你可以使用各种运算符来执行数学运算.比较和逻辑操作. 计算方式: $[ ] $(( )) 例: a=$[(9+5)90] 打印 ...

  8. Mac 上fiddler与charles 抓包https 小程序请求 内容

    为什么选择charles 之前讲过<wireshark使用教程及过滤语法总结--血泪史的汇聚>, 很强大,但是很难用. fiddler 很好用,之前mac 上面没有,现在有了 fiddle ...

  9. HarmonyOS NEXT应用开发之深色跑马灯案例

    介绍 本示例介绍了文本宽度过宽时,如何实现文本首尾相接循环滚动并显示在可视区,以及每循环滚动一次之后会停滞一段时间后再滚动. 效果图预览 使用说明: 1.进入页面,检票口文本处,实现文本首尾相接循环滚 ...

  10. 全面提升易用性:OpenClusterManagement 0.7 版本发布

    ​简介:千呼万唤始出来,三月末 OpenClusterManagement 社区正式发布了 v0.7 版本.在新的版本有一系列新的功能特性欢迎感兴趣的读者体验探索,同时在这个版本中社区维护者对目前已有 ...