Qt窗体引用window自带阴影边框效果
<1>.工程pro文件添加Dwmapi.lib
LIBS += Dwmapi.lib
<2>.窗体控件添加系统函数
#ifdef Q_OS_WIN
#include <Dwmapi.h> // Use system shadow frame
#endif TMainWindow::TMainWindow(QDialog *parent)
: QDialog(parent)
{
#ifdef Q_OS_WIN
BOOL bEnable = false;
::DwmIsCompositionEnabled(&bEnable);
if (bEnable)
{
DWMNCRENDERINGPOLICY ncrp = DWMNCRP_ENABLED;
::DwmSetWindowAttribute((HWND)winId(), DWMWA_NCRENDERING_POLICY, &ncrp, sizeof(ncrp));
MARGINS margins = { - };
::DwmExtendFrameIntoClientArea((HWND)winId(), &margins);
}
#endif
}
<3>.边框拖拽功能
#define MWS_SYS_DRAG_WIDTH 4 //边框响应鼠标间距
#define FRAME_MINI_WIDTH 1024 //窗体默认最小宽度
#define FRAME_MINI_HEIGHT 768 //窗体默认最小高度
bool TMainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN
MSG *msg = reinterpret_cast<MSG*>(message);
switch (msg->message)
{
case WM_NCHITTEST:
{
QPoint p = mapFromGlobal(QCursor::pos());
int xPos = p.x();
int yPos = p.y();
int nHeigh = height();
int nWidth = width(); *result = HTNOWHERE; if (!isFullScreen() && !isMaximized())
{
if (xPos >= && xPos < MWS_SYS_DRAG_WIDTH){
if (yPos >= && yPos < MWS_SYS_DRAG_WIDTH)
{
*result = HTTOPLEFT;
}
else if (yPos >= (nHeigh - MWS_SYS_DRAG_WIDTH) && yPos <= nHeigh)
{
*result = HTBOTTOMLEFT;
}
else
{
*result = HTLEFT;
}
} if (xPos >= nWidth - MWS_SYS_DRAG_WIDTH && xPos <= nWidth)
{
if (yPos >= && yPos <= MWS_SYS_DRAG_WIDTH)
{
*result = HTTOPRIGHT;
}
else if (yPos >= (nHeigh - MWS_SYS_DRAG_WIDTH) && yPos <= nHeigh)
{
*result = HTBOTTOMRIGHT;
}
else
{
*result = HTRIGHT;
}
} if (xPos >= MWS_SYS_DRAG_WIDTH && xPos < nWidth - MWS_SYS_DRAG_WIDTH
&& yPos > && yPos < MWS_SYS_DRAG_WIDTH)
{
*result = HTTOP;
} if (xPos > MWS_SYS_DRAG_WIDTH && xPos < nWidth - MWS_SYS_DRAG_WIDTH
&& yPos >(nHeigh - MWS_SYS_DRAG_WIDTH) && yPos < nHeigh)
{
*result = HTBOTTOM;
}
}
if (HTNOWHERE == *result)
{
return false;
}
return true;
}
break; case WM_GETMINMAXINFO:
{
MINMAXINFO *mmi = (MINMAXINFO*)(msg->lParam); QRect desktop = qApp->desktop()->availableGeometry(this);
QRect desktopRect = qApp->desktop()->screenGeometry(this); mmi->ptMaxSize.x = desktop.width();
mmi->ptMaxSize.y = desktop.height(); int desktopLeft = desktop.left() - desktopRect.left();
int desktopTop = desktop.top() - desktopRect.top(); mmi->ptMaxPosition.x = desktopLeft;
mmi->ptMaxPosition.y = desktopTop; mmi->ptMinTrackSize.x = FRAME_MINI_WIDTH;
mmi->ptMinTrackSize.y = FRAME_MINI_HEIGHT; mmi->ptMaxTrackSize.x = desktop.width();
mmi->ptMaxTrackSize.y = desktop.height(); result = ; return true;
}
break; case WM_SIZE:
switch (msg->wParam)
{
case SIZE_MAXIMIZED:
break;
case SIZE_RESTORED:
break;
}
break;
}
return QWidget::nativeEvent(eventType, message, result);
#else
return QWidget::nativeEvent(eventType, message, result);
#endif
}
Qt窗体引用window自带阴影边框效果的更多相关文章
- android 自定义shape 带阴影边框效果
在drawable 里面 建立一个 xml 直接复制 看效果 自己调试就可以 <?xml version="1.0" encoding="utf-8"?& ...
- QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)
QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg ...
- Qt之阴影边框(转)
原文地址:http://blog.sina.com.cn/s/blog_a6fb6cc90101eoc7.html 阴影边框很常见,诸如360以及其他很多软件都有类似效果,了解CSS3的同学们应该都知 ...
- Qt之圆角阴影边框
Qt的主窗体要做出类似WIN7那种圆角阴影边框,这一直是美工的需求. 这里是有一些门道的,尤其是,这里藏着一个很大的秘密. 这个秘密是一个QT的至少横跨3个版本,存在了2年多的BUG... https ...
- CSS——小三角带边框带阴影
乍一看,很简单,做小三角,首先想到的是利用border的transparent特性,可以制作出小三角的效果.但是注意,这个小三角本身就是边框制作出来的.怎么能在小三角的外边再加一层小边框呢.那就必须再 ...
- 无废话ExtJs 入门教程三[窗体:Window组件]
无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3 ...
- 用CSS画一个带阴影的三角形的示例代码
1. 思路 怎么用CSS3画一个带阴影的三角形呢 ? 有童鞋说, 这还不简单吗 网上有很多解决方案, 但其实大多都是实现不太完美的, 存在一些问题 假设我们做一个向下的三角形箭头 常见的方法大致有两种 ...
- WPF 调用API修改窗体风格实现真正的无边框窗体
原文:WPF 调用API修改窗体风格实现真正的无边框窗体 WPF中设置无边框窗体似乎是要将WindowStyle设置为None,AllowTransparency=true,这样才能达到WinForm ...
- JS框架_(JQuery.js)带阴影贴纸标签按钮
百度云盘 传送门 密码:azo6 纯CSS带阴影贴纸标签按钮效果: <!doctype html> <html> <head> <meta charset=& ...
随机推荐
- C# 中关于接口实现、显示实现接口以及继承
先列出我写的代码: 接口以及抽象类.实现类 public interface IA { void H(); } public interface IB { void H(); } public abs ...
- Elasticsearch学习随笔(一)--原理理解与5.0核心插件部署过程
最近由于要涉及一些安全运维的工作,最近在研究Elasticsearch,为ELK做相关的准备.于是把自己学习的一些随笔分享给大家,进行学习,在部署常用插件的时候由于是5.0版本的Elasticsear ...
- bash远程代码执行漏洞
博客园新闻:http://news.cnblogs.com/n/504506/(如果以下有说错的地方请不吝指出,谢谢~) 详情可围观上面的链接.因为我们的服务器都是私有网环境,即使要修复也得等到下次安 ...
- powershell 统计AD中所有计算机及对应的操作系统信息
要想用powershell管理域,首先先加载activedirectory模块 PS C:\> import-module activedirectory 下面就可以利用get-adcomput ...
- 详细解析 JavaScript 获取元素的坐标
引言 最近突然看到了有关图片懒加载的问题,大致意思就是初始状态下页面只加载浏览器可视区域的图片,剩余图片在当浏览器可视区域滚动到其位置时才开始加载.貌似现在许多大型网站都有实现懒加载,所以我便就此问题 ...
- 使用C#创建SQLite桌面应用程序
本文属于原创,转载请注明出处,谢谢! 一.开发环境 操作系统:Windows 10 X64 开发环境:VS2015 编程语言:C# .NET版本:.NET Framework 4.0 目标平台:X86 ...
- 求从n个数组任意选取一个元素的所有组合
最近做项目碰到这个问题,如题从n个数组任意选取一个元素的所有组合.比如已知数组是[1, 3]; [2, 4]; [5]; 最后组合结果是[1, 2, 5]; [1, 4, 5]; [3, 2, 5] ...
- Linux常见命令语句
查看当前目录: pwd 查看文件具体大小: ls -l 返回上一级: cd.. 返回根目录: cd / 创建一个隐藏文件 vim .test 显示隐藏文件:ls -a 编辑文件: 1.vim 文件名 ...
- Java+Tomcat + Idea + Jrebel 实现热部署
1. 首先安装idea的jrebel插件, jrebel是收费的,所以要在网上下载验证码. 2. 安装好以后再setting 菜单能看到一个jrebel的菜单. 3. 4.其中需要选中frame失去 ...
- ISO18000-6B和ISO18000-6C(EPC C1G2)标准的区别
ISO18000-6B和ISO18000-6C(EPC C1G2)标准的区别 日期:2009-4-2 22:10:26 目前,有两个标准可供选择.一是ISO18000-6B,另一个是已被ISO接纳为I ...