MFC窗口显隐

使用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
);
Parameters

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 Value

If 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

参数2、意思是可以设置指定的颜色为透明色,通过RGB宏设置。

参数3、可以简单的理解为窗体透明的程度范围为0~255(0为完全透明,255不透明)。

参数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);
}

其实只需要三句代码就行

 SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE,
 GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE) ^ WS_EX_LAYERED);
 SetLayeredWindowAttributes(0,0,2)//第三个参数设置透明度,第四个参数设置透明样式

效果:

原文地址:https://www.cnblogs.com/ye-ming/p/8392405.html

时间: 2024-10-13 12:28:52

MFC窗口显隐的相关文章

mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别

mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别 1.理解窗口之间的关系   2.   如何设置(创建)不同的窗口 一. parent:创建者,owner:所有者 小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner 二. 1.Pop-up窗口: 一个弹出窗口是必须具有WS_POPUP属性的窗口,弹出窗口只能是一个Top-Level窗口,不能是子窗口,弹出窗口多用于对话框和消              息框,也可以用于应用程序的

控制同一窗体的显隐(Toggle和Button)

公共变量的脚本 using UnityEngine; using System.Collections; using UnityEngine.UI; public class CommonValues : MonoBehaviour { public GameObject AnswerShowWin;//答案显示窗口 public Button CloseBtn; public GameObject SubmitTog;//提交答案 void Start () { } void Update (

盒子的显隐

# 一.浮动布局的总结# 1.同意结构下,如果采用浮动布局,所有的同级别兄弟标签采用浮动布局# 2.浮动布局的盒子宽度在没有设定时会自适应内容宽度 # 二.盒子的显隐# display:none;# 该隐藏方式在页面中不占位,显隐都不会影响其他标签布局,不需要用动画处理时## opactiy:0;# 通过控制盒子的同名度来隐藏盒子,该隐藏方式在页面中占位,一般显隐操作的盒子都是采用定位布局;# 显隐都不会影响其他标签布局,需要用动画处理时 # 三.定位布局# 什么是定位布局:可以通过上下左右四个

关于界面的按钮的显隐 还有jsp页面数据的传递 把页面的标签变成只读

//界面按钮的显示隐藏 界面input的锁定    function change(){       document.getElementById('first1').style.display="inline";       document.getElementById('first2').style.display="inline";       document.getElementById('first3').style.display="in

在MFC 窗口中运行 cocos2d-x 3.2

在MFC 窗口中运行 cocos2d-x 3.2 (一) 基本配置 在MFC 窗口中运行 cocos2d-x 3.2 (二) 让其在MFC picture控件中运行

WPF MVVM模式中,通过命令实现窗体拖动、跳转以及显隐控制

在WPF中使用MVVM模式,可以让我们的程序实现界面与功能的分离,方便开发,易于维护.但是,很多初学者会在使用MVVM的过程中遇到一个显而易见且无法回避的问题,那就是不同的窗体之间如何跳转?很多人在介绍MVVM的使用时,都没有明显提到该如何解决这一问题,不知是因为觉得太简单了还是其他原因. 博主根据自己的开发经验,写了一个简单的示例程序,介绍MVVM模式中,如何通过命令来控制窗体的跳转.拖动与显隐控制. 先看效果: 主窗体中只有一个按钮,点击该按钮后,可以打开新的窗. 新窗体可以为自定义样式窗体

MFC窗口重绘

Invalidate()与 UpdateAllViews()有什么分别 Invalidate()是让程序重画窗口. UpdateAllViews()是在DOC/VIEW结构中, 当一个视图的数据改变后, 通知所有视图作相应的改变, 和重画毫无关系. Invalidate()是使窗口无效,使系统向其发WM_PAINT消息,使的程序的OnPaint被调用重画客户区. 而UpdateAllViews()是文档与视之间的联系,调用从它会使程序与此文档相关的所有视的UpdateView被调用至于是否重画以

MFC 窗口居中显示 VS2010

MFC 窗口居中显示  VS2010 (2011-09-11 19:52:05) 转载▼ 标签: 窗口居中显示 it 分类: MFC MFC窗口居中显示   VS2010   工程名为:MFC22_6 目的:点击居中按钮,窗口将在文档的中央显示思路:使窗口居中显示可以调用CWnd::CenterWindow函数.void CenterWindow(CWnd* pAlternateOwner=NULL):步骤: 1.   用创建一个单文档应用程序 2.   添加一个对话框资源//(类视图 右键—添

MFC窗口分割以及各窗口间的通讯

一个偶然的机会又重新接触了MFC窗口的分割,自己结合资料重新写了一个窗口分割的程序,现将具体流程跟大家分享一下: 1.我们先创建一个MFC单文档类的程序,具体分割方式先将单文档整个客户区分成两行一列,首先我们在MFC的CMainFrame类中定义一个CSplitterWnd类的对像m_wndSplitter,在主窗口类中我们可以通过对象m_wndSplitter,调用CSplitterWnd类的所有成员函数,为了将窗口分割成两行一列,我们在CMainFrame类中重载OnCreateClient