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

相关文章

【Java算法】滑动窗口 下

​ ​    🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🦌一.水果成篮 题目链接:904.水果成篮 ​ 算法原理 算法原理是使用“滑动窗口”(Sliding Window)策略,结合哈希表(Map)来高效地统计窗口内不同水果的种类数量。以下是详细分析: 初始化:创建一个空的哈希表 map 用来存储每种水果的数量,初始化左右指针 left

2_为MFC程序添加菜单

在MFC中添加菜单栏 1,双击资源文件,显示资源视图,点击Menu插入Menu菜单,编辑菜单的ID,自己取名字。 2,点击“请在此处键入”添加菜单选项,输入&E,E的下面就会产生下划线;在产生的弹出菜单中继续编辑,并且可以添加事件处理函数; 在弹出菜单的任意位置,鼠标右键,弹出的菜单中选择“插入分隔符”,即可产生分隔符 3,在你设计的Dialog窗口的属性栏,选择Menu后面的

示例:推荐一个应用Adorner做的表单对话框

一、目的:开发过程中经常会修改和查看一个Model的数据,一般情况下会自定义一个控件或Window去显示Model数据,但这种数据如果比较多会增加很多开发工作,本文介绍一种通用的方式,应用表达Form控件去简化处理,通常下只需在Model的Property属性上增加一些特性即可定制显示的表单信息和验证信息。 二、实现 显示效果如下  三、环境 VS2022 Net7 四、使用方式

怎么优化ArcEngine组件开发mfc程序界面?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述   这种VS2015 + ArcEngine10.2开发的mfc小程序怎么优化界面,使系统看上去更美观 如上问题有来自我自身项目开发,有的收集网站

移植对话框MFC

VC版 MFC程序对话框资源移植 以下均拷贝自上面,仅用来记录 (部分有删除) 法1: Eg:将B工程调试好的对话框移植到A工程中 1.资源移植         1.1  在2017打开B工程,在工作区Resource标签页中选中Dialog文件夹下的资源文件,按Ctrl+C或点击Edit->Copy.         1.2. 关闭当前工程,注意不要关闭VC6,打开B工程(File

用Ps将PSD切片并将切片保存为透明背景的图片

第一步:选择放大镜工具或者Ctrl++将要切片的部分放大。 第二步:选择移动工具单击要切片的部分,在右边的图层栏找到要切片的图层在文字上右键选择转换为智能对象,再右键该图层的文字选择栅格化图层。 第三步:单击选中所要切片的部分,然后Ctrl+A、Ctrl+C、Ctrl+N(背景内容选择透明)、Ctrl+V、Ctrl+S(将文件保存为PNG格式),这样就可以得到透明背景的图片了!

Vue3的Teleport:Teleport是Vue3的一个新功能,它允许我们将子组件渲染到父组件以外的地方,这在处理模态框、弹出窗口等情况时非常有用

I. Teleport 的概述 Teleport 的定义:   在 Vue 3.0 中,Teleport 是一个新的内置组件,它允许我们将任何部分的渲染内容 Teleport(传送)到 Vue 应用范围之外的地方。 换句话说,你可以控制片段,让它们在 DOM 中的任何位置渲染,而不仅仅是在当前组件内部。   Teleport 的效用和应用场景:   Teleport 的主要用途是处理在 UI

leetcode刷题(43)——239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值------------

MFC学习--CListCtrl复选框以及选择

如何展示复选框 //LVS_EX_CHECKBOXES每一行的最前面带个复选框//LVS_EX_FULLROWSELECT整行选中//LVS_EX_GRIDLINES网格线//LVS_EX_HEADERDRAGDROP列表头可以拖动m_listctl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDL

示例:推荐一个应用Adorner做的通知和提示消息对话框

一、目的:在开发过程中,增加一些提示消息可以很好的提高用户体验,下面介绍一个用于增加提示消息的库 二、效果如下 可以看到右侧顶端弹出提示消息,消息间隔3s自动退出 三、环境 VS2022 Net7 四、使用方式 安装nuget包:H.Modules.Messages.Dialog和H.Modules.Messages.Notice  添加如下代码 pri