MFC 对话框(窗口)透明

2024-05-30 08:38
文章标签 窗口 mfc 透明 对话框

本文主要是介绍MFC 对话框(窗口)透明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序的实现步骤基本就是这样,当然也有其他方法。希望大家能积极开拓,展示更多方法。

    SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);
#ifdef _UNICODEHINSTANCE hInst = LoadLibrary(_T("User32.DLL")); //显式加载DLL
#elseHINSTANCE hInst = LoadLibrary("User32.DLL"); //显式加载DLL
#endif  if (hInst){typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);MYFUNC fun = NULL;//取得SetLayeredWindowAttributes函数指针fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");if (fun)fun(this->GetSafeHwnd(), RGB(255, 255,255), 128, 1);     //通过第三个参数来设置窗体透明程度FreeLibrary(hInst);}
///创建背景刷
CBrush m_bkBrush;HBRUSH CMyProgressCtrl2::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO:  Change any attributes of the DC hereif(nCtlColor == CTLCOLOR_DLG)   // 判断是否是对话框  {return   m_bkBrush; // 返回刚才创建的背景刷子}if (nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID()==IDC_STATIC_Percentage){pDC->SetArcDirection(18);pDC->SetTextColor(RGB(0,0,0));///静态文本框字体颜色
//      return   m_bkBrush; // 返回刚才创建的背景刷子pDC->SetBkColor(RGB(255,255,255));     //静态控件的背景颜色设置和窗口背景一样,也会为透明,方法一        //pDC->SetBkMode(TRANSPARENT);    //静态文本框背景设置为透明,方法二hbr=(HBRUSH)m_bkBrush; }else if (nCtlColor==CTLCOLOR_STATIC && pWnd->GetDlgCtrlID() == IDC_STATIC_Progress2)///也可以指定特定ID对应的控件{pDC->SetArcDirection(18);return   m_StaticBrush; // 返回刚才创建的背景刷子}// TODO:  Return a different brush if the default is not desiredreturn hbr;
}

不过处理后的透明效果都不是太好,控件边界有一些毛刺

对重要一句话解释:fun(this->GetSafeHwnd(), RGB(255, 255,255), 128, 1);
关于参数解释点击原博主内容
下面是我复制过来的

使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。

以下是MSDN上的原内容,我会加以解释。

The SetLayeredWindowAttributes function sets the opacity and transparency color key of a layered window.BOOL SetLayeredWindowAttributes(HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags
);
参数:hwnd
[in] Handle to the layered window. A layered window is created by specifying WS_EX_LAYERED when creating the window with the CreateWindowEx function or by setting WS_EX_LAYERED via SetWindowLong after the window has been created.crKey
[in] COLORREF structure that specifies the transparency color key to be used when composing the layered window. All pixels painted by the window in this color will be transparent. To generate a COLORREF, use the RGB macro.bAlpha
[in] Alpha value used to describe the opacity of the layered window. Similar to the SourceConstantAlpha member of the BLENDFUNCTION structure. When bAlpha is 0, the window is completely transparent. When bAlpha is 255, the window is opaque.dwFlags
[in] Specifies an action to take. This parameter can be one or more of the following values.
LWA_COLORKEY
Use crKey as the transparency color.
LWA_ALPHA
Use bAlpha to determine the opacity of the layered window.Return ValueIf the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.详细解说参数1、主要说的是所要设置的窗体必须是WS_EX_LAYERED格式,设置方法如下://设置窗体为WS_EX_LAYERED格式SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);     //其实0x80000 == WS_EX_LAYERED
参数1:窗口句柄参数2:意思是可以设置指定的颜色为透明色,通过RGB宏设置。参数3:可以简单的理解为窗体透明的程度范围为0~2550为完全透明,255不透明)。需要参数4设置为2,这种情况下的透明是对窗口以及控件都进行处理。这个时候参数2无效。参数4:可以取两个值LWA_COLORKEY (0x1)和 LWA_ALPHA(0x2),如下:取值为LWA_ALPHA即等于2时,参数2无效,通过参数3决定透明度.取值为LWA_COLORKEY即等于1时,参数3无效,参数2指定的颜色为透明色,其他颜色则正常显示,你可以在处理前先设定号窗口的背景颜色把以下代码放OnInitDialog中即可实现半透明窗体SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);HINSTANCE hInst = LoadLibrary("User32.DLL"); //显式加载DLL
if (hInst) 
{            typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);          MYFUNC fun = NULL;//取得SetLayeredWindowAttributes函数指针     fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); if (fun)fun(this->GetSafeHwnd(), 0, 128, 2);     //通过第三个参数来设置窗体透明程度FreeLibrary(hInst); 
}

另外有一点需要注意的是:
要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性。
 函数原型:LONG
GetWindowLong(HWND hWnd;int nlndex);
 参数:
  hWnd:窗口句柄及间接给出的窗口所属的窗口类。
  nlndex:指定要检索的基于0的的偏移量。有效值的范围从0到窗口额外内存空间的字节数,最小为4。例如,若指定了12位或多于12位的窗体类的额外存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,指定下列值之一:
  GWL_EXSTYLE:获得扩展窗口风格。
  GWL_STYLE:获得窗口风格。
  GWL_WNDPROC:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用GWL_WNDPROC函数调用窗口过程。
  GWL_HINSTANCE:获得应用事例的句柄。
  GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。
  GWL_ID:获得窗口标识。
  GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个与这个窗口相关的给用户使用的32位的数据。具体用途自定义。
  在hWnd参数标识了一个对话框时也可用下列值:
  DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。
  DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。
  DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。
 返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。若想获得更多错误信息请调用 GetLastError函数。
 备注:通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbWndExtra单元指定为一个非0值来保留额外类的存储空间。

这篇关于MFC 对话框(窗口)透明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015997

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

专题二_滑动窗口_算法专题详细总结

目录 滑动窗口,引入: 滑动窗口,本质:就是同向双指针; 1.⻓度最⼩的⼦数组(medium) 1.解析:给我们一个数组nums,要我们找出最小子数组的和==target,首先想到的就是暴力解法 1)暴力: 2)优化,滑动窗口: 1.进窗口 2.出窗口 3.更新值 2.⽆重复字符的最⻓⼦串(medium) 1)仍然是暴力解法: 2)优化: 进窗口:hash[s[rig

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if