duilib设置透明窗口_c++imgui绘制透明菜单

duilib设置透明窗⼝_c++imgui绘制透明菜单主要使⽤imgui创建⼀个透明窗⼝显⽰菜单,透明菜单绘制主要使⽤以下⽅法
//在扩展样式中加⼊WS_EX_LAYERED
HWND hwnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TOOLWINDOW,
ImGuiWClass.lpszClassName,
_T("Draw ImGui"),
WS_POPUP,
CW_USEDEFAULT,
CW_USEDEFAULT,
IMGUI_WIDTH,
IMGUI_HIGH,
NULL,
NULL,
GetModuleHandle(NULL),
NULL);
//设置颜⾊过滤,使⽤改关键⾊刷新屏幕后颜⾊被过滤实现透明
SetLayeredWindowAttributes(hwnd, RGB(255, 255, 255),NULL,LWA_COLORKEY);
//设置dx11屏幕刷新颜⾊注意这⾥的颜⾊要和设置透明关键⾊设置⼀样
倒立摆ImVec4 clear_color = ImGui::ColorConvertU32ToFloat4(IM_COL32(255, 255, 255));
效果图:
感觉效果还可以 ,但是遇到⾃⼰绘制字体或者线条的时候就出现问题了
绘制⽂字和斜线
绘制⽂字
防裂霜
绘制线条
⼤概是因为d3d在绘制这些东西的时候为了处理锯齿,和背景颜⾊进⾏计算后导致部分减淡的颜⾊出现问题
还是可以看到的,在⾮⿊⾊背景下有⿊边
如何解决:
//加⼊以下代码
MARGINS margins = { -1, -1, -1, -1 };
DWM_BLURBEHIND bb = { 0 };
DwmExtendFrameIntoClientArea(hwnd, &margins);
bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
bb.fEnable = true;
模拟社区bb.hRgnBlur = NULL;
DwmEnableBlurBehindWindow(hwnd, &bb);
处理后菜单和线条演⽰
处理后绘制⽂字演⽰
完整代码就不贴了,写的东西不是太好,⽤的ImGui改的透明
ImGui下载地址:
------------------------------------------------
2020年11⽉19⽇更新
处理以上的⿊边透明的⽅法不是d3d的问题还是在dwm,要实现好的效果需要更改Area特效删除以上代码,还是使⽤颜⾊过滤做透明
//关键⾊过滤
SetLayeredWindowAttributes(m_hwnd, RGB(0, 0, 0), 255, LWA_ALPHA);
//dwm透明特效
DWM_BLURBEHIND bb = { 0 };
HRGN hRgn = CreateRectRgn(0, 0, -1, -1);
bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
bb.hRgnBlur = hRgn;
bb.fEnable = TRUE;
DwmEnableBlurBehindWindow(m_hwnd, &bb);
CerateWindow完整代码:
WNDCLASSW wndclass;//这义⼀个窗体类实例
//设置窗体参数
wndclass.style = CS_HREDRAW | CS_VREDRAW; //样式
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
钢结硬质合金wndclass.hInstance = m_instance;//窗体实例名,由windows⾃动分发
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//显⽰上⾯的图标titlte
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//窗⼝光标
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景刷
wndclass.lpszMenuName = NULL;玻璃瓶网
//MakeObjectInstance为代理函数,旨在调⽤类中的回调函数,回调函数懒得设置全局函数就好wndclass.lpfnWndProc = MakeObjectInstance(this, &DxBase::WndProc);//设置窗体接收windws消息函数wndclass.lpszClassName = m_class_name;//窗体类名
if (!RegisterClassW(&wndclass))//注册窗体类
{
MessageBoxW(NULL, L"This program requires Windows NT!", m_class_name, MB_ICONERROR);
return false;
};
//创建⼀个窗体。已分配内存。返回⼀个窗体句柄
m_hwnd = CreateWindowExW(
/*WS_EX_TOPMOST |*/ WS_EX_LAYERED /*| WS_EX_TRANSPARENT*/,
m_class_name,      // window class name
m_window_name,  // window caption
/*WS_POPUP*/WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT,// initial x position
CW_USEDEFAULT,// initial y position
m_width, // initial x size
m_height, // initial y size
NULL, // parent window handle
NULL, // window menu handle
m_instance, // program instance handle
NULL);
SetLayeredWindowAttributes(m_hwnd, RGB(0, 0, 0), 255, LWA_ALPHA);
DWM_BLURBEHIND bb = { 0 };
HRGN hRgn = CreateRectRgn(0, 0, -1, -1);
bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
bb.hRgnBlur = hRgn;
投票机bb.fEnable = TRUE;
DwmEnableBlurBehindWindow(m_hwnd, &bb);
ShowWindow(m_hwnd, SW_SHOW);//显⽰窗⼝
UpdateWindow(m_hwnd);//更新窗体
加⼊以下代码后效果图:
可以看到现在效果是挺不错了
不过dx9以后要绘制这些个线条反⽽⽐较⿇烦了
我使⽤dx11这抗锯齿效果
微软删除了dx9的⼀些管线操作,只能是靠顶点去绘制
当然这篇⽂章只说透明.....
注: 使⽤DwmEnableBlurBehindWindow进⾏透明后⿏标⽆法穿透透明部分有兴趣加Q⼀起搞

本文发布于:2024-09-22 21:30:00,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/214875.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:设置   窗体   函数   透明   绘制   效果
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议