简述

通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标、标题,以及控制窗体最小化、最大化、关闭。

在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左、上、右、下、左上角、左下角、右上角、右下角时候,鼠标变为相应的样式,并且窗体可以随着鼠标拖动而进行放大、缩小。

  • 简述
  • 效果
  • 窗体缩放
    • 实现
    • 接口说明

效果

窗体缩放

实现

包含头文件与需要用到的库

#ifdef Q_OS_WIN
#include <qt_windows.h>
#include <Windowsx.h>
#endif

使用nativeEvent进行窗体缩放

bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{Q_UNUSED(eventType)MSG *param = static_cast<MSG *>(message);switch (param->message){case WM_NCHITTEST:{int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y();// 鼠标区域位于标题栏按钮之上,则不进行处理QList<QPushButton *> buttons = m_pTitleBar->findChildren<QPushButton *>();foreach (QPushButton *pButton, buttons){if (pButton->geometry().contains(QPoint(nX, nY))){*result = HTCLIENT;return true;}}// 鼠标区域位于标题栏中,进行移动if (nX >= m_nBorder && nX <= this->width() - m_nBorder&& nY >= m_nBorder && nY <= m_pTitleBar->height()){*result = HTCAPTION;return true;}// 鼠标区域位于窗体边框,进行缩放if ((nX > 0) && (nX < m_nBorder))*result = HTLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width()))*result = HTRIGHT;if ((nY > 0) && (nY < m_nBorder))*result = HTTOP;if ((nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOM;if ((nX > 0) && (nX < m_nBorder) && (nY > 0)&& (nY < m_nBorder))*result = HTTOPLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width())&& (nY > 0) && (nY < m_nBorder))*result = HTTOPRIGHT;if ((nX > 0) && (nX < m_nBorder)&& (nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOMLEFT;if ((nX > this->width() - m_nBorder) && (nX < this->width())&& (nY > this->height() - m_nBorder) && (nY < this->height()))*result = HTBOTTOMRIGHT;return true;}}return QWidget::nativeEvent(eventType, message, result);
}

接口说明

Qt5与Qt4其中的一个区别就是用nativeEvent代替了winEvent。

nativeEvent主要用于进程间通信-消息传递。在这里我们主要进行窗体缩放,其中还添加了一些限制,比如:

  1. 鼠标区域位于标题栏按钮之上,则不进行处理。
  2. 鼠标区域位于标题栏中,进行移动。

使用这种方式后,窗体就可以随意缩放了,而且可以去掉标题栏中控制界面移动的代码-在mousePressEvent中使用SendMessage来进行移动。

当然,这种实现只能在Windows下使用,因为用的是Win API,如果需要跨平台的话,需要自己处理各种事件,而且得考虑的很全面。

Qt之自定义界面(窗体缩放)相关推荐

  1. Qt中不规则窗体和部件的实现

    Qt中不规则窗体和部件的实现 描述:a.png 窗口背景图 图片: 描述:mask.png 窗口掩码图 图片: 描述:toolbutton.png 按钮背景图 图片: 描述:toolbutton_ma ...

  2. [C#]无边框窗体缩放的虚线框怎么实现

    protected override void WndProc(ref Message m)   {   switch (m.Msg)   {   case 0xA3://拦截鼠标非客户区左键双击消息 ...

  3. WinForm窗体缩放动画

    WinForm自带的窗体大小发生改变的时候,当内存不够的时候,会出现界面停滞的现象,会出现许多的条条纹纹,给人很不好的感觉,这里提供一个WinForm窗体缩放时会有一个渐变的动画效果给大家. 思路是这 ...

  4. Qt Creator创建可缩放的按钮和边框

    Qt Creator创建可缩放的按钮和边框 创建可缩放的按钮和边框 创建按钮类型 构造按钮组件 使用状态更改组件属性值 创建可缩放的按钮和边框 您可以使用"边框图像"类型将图像(例 ...

  5. 【转】QT实现不规则窗体

    看到好文章,收藏一下: 看到网上有很多不规则窗体的实现,效果很酷.于是使用QT也实现了一个,QT的不规则窗体实现非常简单,只需要设置一个mask(遮掩)图片,这个图片的格式可以使用png或bmp格式, ...

  6. [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景

    很棒的文章 原文地址:Qt之自定义界面(二)添加最小化.关闭按钮.添加背景作者:一去丶二三里 在进行自定义界面之后,Qt界面并不像我们想象的那么完美,也许与我们的预期大相径庭,但是不必心烦,这只不过是 ...

  7. [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景_vortex_新浪博客...

    很棒的文章 原文地址:Qt之自定义界面(二)添加最小化.关闭按钮.添加背景作者:一去丶二三里 在进行自定义界面之后,Qt界面并不像我们想象的那么完美,也许与我们的预期大相径庭,但是不必心烦,这只不过是 ...

  8. Qt无边框窗体(Windows)

    Qt无边框窗体Windows篇 去掉标题栏和边框 实现拖拽功能 还原窗体功能 注意点 我们可以做的更好 添加阴影 亚克力面板效果 结语 去掉标题栏和边框 首先第一步我们要通过设置系统绘制的边框消失 s ...

  9. C++,QT多个窗体切换,widget 多个页面切换跳转显示

    C++,QT多个窗体切换,widget,QTimer 3个页面切换跳转,使用wdiget 的方式 源码工程链接 先看效果: onewidget.h #ifndef ONEWIDGET_H #defin ...

最新文章

  1. fegin通信中速度慢等待解决异常
  2. 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim
  3. JVM调优总结(二)
  4. c语言 程序循环,C语言程序设计-循环例子
  5. 一款不错的网站压力测试工具webbench
  6. js触发button的点击事件
  7. 瑞士行-少女峰,峡谷徒步
  8. bzoj 1042: [HAOI2008]硬币购物(dp+容斥)
  9. 10.软件架构设计:大型网站技术架构与业务架构融合之道 --- 事务一致性
  10. [AutoSar]RTE运行逻辑、通信逻辑与接口实现
  11. jetty快速入门与嵌入使用 jetty
  12. html页面加密js,javascript怎么加密?
  13. 针对初学者的 MQL 5 中的自定义指标
  14. php创建透明图片,php imagecreatetruecolor 创建高清和透明图片代码小结
  15. linux dns配置服务器报告,Linux DNS服务实验报告
  16. IPC$局域网入侵详解
  17. 动态电路中的动态元件——电容和电感
  18. 手把手 VM虚拟机安装deepin系统
  19. 模拟人生显示无法连接服务器,模拟人生总是显示无法连接网络
  20. 如何在VSCode配置PHP开发环境(详细版)

热门文章

  1. 用顺序栈实现十进制向二进制转化
  2. 计蒜客(三角形的内点)
  3. (转)事务是什么,以及事务四个特性
  4. 用户操作拦截并作日志记录--自定义注解+AOP拦截
  5. HNOI2017 day1 T3 礼物
  6. SDUT 2860-生日Party(BFS)
  7. FPGA大数据之我认为的明天
  8. 限时分享:产品经理面试高频考题及答案
  9. 大厂没有方法论(上)
  10. 在京东、天猫、淘宝都存在情况下,为什么聚美还能崛起?