MFC 对话框透明效果

网上找的资料自己改了改,在这里记录和分享一下,主要是TransparentWnd函数。

在子类的OnShowWindow函数中调用 ShowWindowAlpha()

#pragma once
template<class T>
class CPopupDlgBaseT
{
    typedef BOOL (WINAPI *LPFNSETLAYEREDWINDOWATTRIBUTES)
        (HWND hwnd,COLORREF crKey,BYTE bAlpha,DWORD dwFlags);

public:
    void ShowWindowAlpha()
    {
        T* pT = static_cast<T*>(this);
        CWnd* pParentWnd = pT->GetParent();
        CRect rc;
        pParentWnd->GetClientRect(&rc);
        pParentWnd->ClientToScreen(&rc);
        pT->MoveWindow(&rc);
        TransparentWnd(pT->m_hWnd, 150);
    }

private:
    BOOL TransparentWnd(HWND hwnd, BYTE byAlpha)
    {
        long lStyle;
        HMODULE hModule;
        BOOL bRet;
        LPFNSETLAYEREDWINDOWATTRIBUTES lpSetLayeredWindowAttributes;
        if(FALSE == IsWindow(hwnd))
        {
            MessageBox(hwnd, TEXT("窗口句柄无效!"), NULL, 0);
            return FALSE;
        }
        hModule = (HMODULE)LoadLibrary(TEXT("user32.dll"));
        if(hModule)
        {
            lpSetLayeredWindowAttributes = (LPFNSETLAYEREDWINDOWATTRIBUTES)
                GetProcAddress(hModule, "SetLayeredWindowAttributes");
            if(!lpSetLayeredWindowAttributes)
            {
                MessageBox(hwnd, TEXT("未找到API SetLayeredWindowAttributes的地址!"),
                    NULL, MB_OK);
                return FALSE;
            }
        }
        lStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
        if(!lStyle)
        {
            MessageBox(hwnd, TEXT("获取窗口扩展样式失败!"), NULL, MB_OK);
            return FALSE;
        }
        lStyle = lStyle | WS_EX_LAYERED;
        bRet = SetWindowLong(hwnd, GWL_EXSTYLE, lStyle);
        if(!bRet)
        {
            MessageBox(hwnd, TEXT("设置窗口扩展样式失败!"), NULL, MB_OK);
            return FALSE;
        }
        bRet = lpSetLayeredWindowAttributes(hwnd, 0, byAlpha, LWA_ALPHA);
        if(!bRet)
        {
            MessageBox(hwnd, TEXT("设置窗口透明度失败!"), NULL, MB_OK);
            return FALSE;
        }
        ::RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);
        FreeLibrary(hModule);
        return TRUE;
    }
};
时间: 2024-10-15 22:51:02

MFC 对话框透明效果的相关文章

在MFC对话框程序中使用加速键

新建一个基于对话框的工程,添加一个按钮,修改按钮ID,这里为ID_BTN_OPENFILE,为按钮添加消息响应事件,这里我打开文件保存对话框: void CAccelDlg::OnBtnOpenfile() { // TODO: Add your control notification handler code here CFileDialog dlg (TRUE); dlg.DoModal (); } 为工程添加一个加速键资源,添加一条,注意ID要和按钮的ID相同,只有这样才能产生关联 为主

VC++实现位图显示透明效果--实现原理

我们在进行程序的界面设计时,常常希望将位图的关键部分,也既是图像的前景显示在界面上,而将位图的背景隐藏起来,将位图与界面很自然的融合在一起,本文介绍了透明位图的制作知识,并将透明位图在一个对话框中显示了出来.本文所使用的原始位图及程序编译运行后的界面效果如下图所示: 图一.原始位图 图二.对话框界面上透明显示位图 一.实现方法 绘制"透明"位图是指绘制某一位图中除指定颜色外的其余部分,我们称这种颜色为"透明色".通过将位图的背景色指定为"透明色"

[转]Android有趣的全透明效果--Activity及Dialog的全透明(附android系统自带图标大全

原文:http://blog.csdn.net/sodino/article/details/5822147 1.Activity全透明 同学zzm给了这个有趣的代码,现在公布出来. 先在res/values下建colors.xml文件,写入: <? xml   version = "1.0"   encoding = "UTF-8" ?>    < resources >        < color   name = "t

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法. ~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾水. 一.静态显示bmp图片

C++MFC编程笔记day08 MFC对话框的使用

一 MFC对话框 1 分类 模式和非模式 2 相关类 CDialog类-父类是CWnd,本质上是一个窗口,对话框类的父类. CCommonDialog类以及子类-通用对话框,颜色对话框.文件对话框. 查找替换对话框.字体设置对话框.打印设置对话框和 打印对话框. CPropertyPage类-属性页对话框. 3 在Win32向导中,使用MFC的类创建对话框程序 3.1 模式对话框 3.1.1 创建和显示对话框 CDialog::DoModal() 3.1.2 对话框的关闭(无需用户处理) CDi

Unity3D ShaderLab 使用alpha参数创建透明效果

Unity3D ShaderLab 使用alpha参数创建透明效果 其实Unity为了方便我们的工作,为我们内置了很多参数.比如马上用到的透明功能. 准备场景新建Shader Material ,一张红绿蓝的贴图. 实现代码及其简单,直接看完成的: Shader "91YGame/AlphaTransparency" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _TransVal

QT下的几种透明效果

1.窗口整体透明,但是窗体上的控件不透明. 通过设置窗体的背景色来实现,将背景色设置为全透. QPalette pal = palette(); pal.setColor(QPalette::Background, QColor(0x00,0xff,0x00,0x00)); setPalette(pal); 试验效果: 窗体标题栏不透明: 窗体客户区上的控件不透明,QLabel控件只是字显示,控件背景色透明: 窗体客户区完全透明. 另外从网上看到的方法: setAttribute(Qt::WA_

C# 透明背景Panel, 透明图像, PitureBox透明效果

1.自定义透明 背景Panel控件:在项目中添加类TransparentPanel.cs using System.Windows.Forms; using System.Drawing; public class TransparentPanel : Control { public TransparentPanel(){} protected override void OnPaintBackground(PaintEventArgs e) { //不进行背景的绘制 } protected

Android开发实例透明效果设置方法

没什么android开发经验的朋友来说,实现透明效果是有一定难度的,我看见麦子学院android开发视频上面讲了三种方法来实现透明效果,这三种方法非常不错,嘿嘿,就抄下来分享给大家. 1.设置alpha View v = findViewById(R.id.content);/到你要设透明背景的layout 的id  v.getBackground().setAlpha(100);//0~255透明度值  2.用ARGB来控制 半透明<Button android:background="