MFC 对话框(窗口)透明
2017-03-21 20:36
253 查看
程序的实现步骤基本就是这样,当然也有其他方法。希望大家能积极开拓,展示更多方法。
不过处理后的透明效果都不是太好,控件边界有一些毛刺
对重要一句话解释:fun(this->GetSafeHwnd(), RGB(255, 255,255), 128, 1);
关于参数解释点击原博主内容
下面是我复制过来的
使用SetLayeredWindowAttributes可以方便的制作透明窗体,此函数在w2k以上才支持,而且如果希望直接使用的话,可能需要下载最新的SDK。不过此函数在w2k的user32.dll里有实现,所以如果你不希望下载巨大的sdk的话,可以直接使用GetProcAddress获取该函数的指针。
以下是MSDN上的原内容,我会加以解释。
另外有一点需要注意的是:
要使使窗体拥有透明效果,首先要有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值来保留额外类的存储空间。
SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED); #ifdef _UNICODE HINSTANCE hInst = LoadLibrary(_T("User32.DLL")); //显式加载DLL #else HINSTANCE 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 here if(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 desired return 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 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 参数1:窗口句柄 参数2:意思是可以设置指定的颜色为透明色,通过RGB宏设置。 参数3:可以简单的理解为窗体透明的程度范围为0~255(0为完全透明,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对话框简单实现窗口全透明的方法
- MFC对话框简单实现窗口全透明的方法
- mfc动态改变对话框窗口大小和显示位置
- 去除对话框边框 + 设置窗口可移动和透明+取消主窗口状态栏
- 《MFC&Qt混合编程》 part1 MFC对话框中嵌入Qt窗口控件
- MFC窗口/对话框 expected constant expression 'IDD_INPUT' : undeclared identifier解决方法
- MFC基于对话框上插入MENU菜单栏并点击菜单弹出新窗口
- 《新手入门》 MFC基于对话框的窗口分割
- MFC应用程序中处理消息、窗口和对话框相关的顺序
- MFC透明对话框
- 在MFC单文档对话框实现窗口分拆
- 在MFC对话框中,如何让控件Static和Radio和CheckBox背景透明?
- mfc控件位置随对话框窗口移动
- MFC学习之路(六)在DoModal()之前态设置对话框窗口标题
- 《MFC&Qt混合编程》 part1 MFC对话框中嵌入Qt窗口控件
- 在MFC对话框中,如何让控件Static和Radio和CheckBox背景透明?
- MFC基于对话框 创建工具栏 工具栏提示 窗口同步缩放 拦截主界面Enter按下 窗口过程 菜单工具栏按钮变灰
- MFC学习笔记之Invalidate的用处及对话框数据交换及实现文字背景色为透明
- 在mfc对话框中添加一个显示网页的窗口
- MFC实现父窗口不透明,子窗口半透明效果