关于MFC App中的c ++:Lightbox样式对话框

Lightbox style dialogs in MFC App

是否有人在MFC / non .net应用程序的模式对话框中实现了Lightbox样式的背景变暗。
我认为程序必须是这样的:

脚步:

  • 获取对话框父级HWND或CWnd *

  • 获取父窗口的矩形并在该窗口上绘制一个具有半透明性的覆盖层

  • 允许对话框执行模态绘制例程,例如DoModal()
  • 是否有任何现有的库/框架可以执行此操作,或者在MFC中删除半透明叠加层的最佳方法是什么?
    编辑如果您不知道"灯箱样式"的含义,这是我要实现的目标的模型
    一些应用程序:
    alt text

    带有灯箱对话框
    alt text


    这是我根据Brian的链接所做的*
    首先使用以下属性创建对话框资源:

    • 边境假
    • 3D外观为FALSE
    • 客户端FALSE
    • 弹出式
    • 静态边缘FALSE
    • 透明TRUE
    • 标题栏FALSE

    并且您应该最终得到一个没有框架或任何东西的对话框窗口,只是一个灰色框。
    覆盖Create函数,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    BOOL LightBoxDlg::Create(UINT nIDTemplate, CWnd* pParentWnd)
    {

        if(!CDialog::Create(nIDTemplate, pParentWnd))
            return false;
        RECT rect;
        RECT size;

        GetParent()->GetWindowRect(&rect);
        size.top = 0;
        size.left = 0;
        size.right = rect.right - rect.left;
        size.bottom = rect.bottom - rect.top;
        SetWindowPos(m_pParentWnd,rect.left,rect.top,size.right,size.bottom,NULL);

        HWND hWnd=m_hWnd;  
        SetWindowLong (hWnd , GWL_EXSTYLE ,GetWindowLong (hWnd , GWL_EXSTYLE ) | WS_EX_LAYERED ) ;
        typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD);
        PSLWA pSetLayeredWindowAttributes;
        HMODULE hDLL = LoadLibrary (_T("user32"));
        pSetLayeredWindowAttributes =
            (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes");
        if (pSetLayeredWindowAttributes != NULL)
        {
            /*
            * Second parameter RGB(255,255,255) sets the colorkey
            * to white LWA_COLORKEY flag indicates that color key
            * is valid LWA_ALPHA indicates that ALphablend parameter
            * is valid - here 100 is used
            */

            pSetLayeredWindowAttributes (hWnd,
                RGB(255,255,255), 100, LWA_COLORKEY|LWA_ALPHA);
        }


        return true;
    }

    然后在图像编辑器中创建一个小的黑色位图(例如48x48),并将其作为位图资源导入(在本示例中为IDB_BITMAP1)
    使用以下命令覆盖WM_ERASEBKGND消息:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    BOOL LightBoxDlg::OnEraseBkgnd(CDC* pDC)
    {

        BOOL bRet = CDialog::OnEraseBkgnd(pDC);

        RECT rect;
        RECT size;
        m_pParentWnd->GetWindowRect(&rect);
        size.top = 0;
        size.left = 0;
        size.right = rect.right - rect.left;
        size.bottom = rect.bottom - rect.top;

        CBitmap cbmp;
        cbmp.LoadBitmapW(IDB_BITMAP1);
        BITMAP bmp;
        cbmp.GetBitmap(&bmp);
        CDC memDc;
        memDc.CreateCompatibleDC(pDC);
        memDc.SelectObject(&cbmp);
        pDC->StretchBlt(0,0,size.right,size.bottom,&memDc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

        return bRet;
    }

    在所需对话框的DoModal中实例化它,像模态对话框一样创建它,即在堆栈上(如果需要的话在堆上),将其称为手动创建,显示它,然后在其顶部创建实际的模态对话框:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INT_PTR CAboutDlg::DoModal()
    {
        LightBoxDlg Dlg(m_pParentWnd);//make sure to pass in the parent of the new dialog
        Dlg.Create(LightBoxDlg::IDD);
        Dlg.ShowWindow(SW_SHOW);

        BOOL ret = CDialog::DoModal();

        Dlg.ShowWindow(SW_HIDE);
        return ret;
    }

    这会导致完全像我上面的模拟

    *仍有改进的地方,例如不做任何对话框就开始做,以及其他一些常规的整理工作。


    我认为您只需要创建一个窗口并设置透明度。 CodeProject上有一个MFC CGlassDialog示例,可能会对您有所帮助。还有一篇有关如何使用Win32 API进行此操作的文章。


    推荐阅读

      linux启用命令模式?

      linux启用命令模式?,系统,密码,数字,首页,电脑,情况,终端,界面,模式,命令,安

      linux回到命令行模式?

      linux回到命令行模式?,系统,密码,状态,工具,电脑,终端,界面,环境,地方,命令,

      linux命令模式联网?

      linux命令模式联网?,网络,系统,工具,软件,密码,地址,最新,信息,工作,数据,lin

      linux命令模式全屏?

      linux命令模式全屏?,系统,工具,电脑,数据,位置,命令,虚拟机,分辨率,字符串,

      linux中回到命令模式?

      linux中回到命令模式?,系统,密码,情况,状态,终端,环境,信息,首页,界面,命令,

      linux命令行模式6?

      linux命令行模式6?,系统,设计,信息,工作,终端,首页,庞大,服务,地方,环境,linu

      linux怎么用命令模式?

      linux怎么用命令模式?,工作,地址,系统,信息,管理,命令,目录,情况,图形界面,

      linux插入命令模式?

      linux插入命令模式?,工作,系统,地址,管理,信息,时间,命令,目录,平均,项目,Lin

      命令行模式登陆linux?

      命令行模式登陆linux?,密码,系统,工作,信息,终端,环境,状态,地址,工具,服务,l

      linux打开命令模式?

      linux打开命令模式?,系统,密码,管理,情况,终端,命令,工具,信息,地方,电脑,LIN

      linux拷贝覆盖命令?

      linux拷贝覆盖命令?,系统,文件,信息,命令,目录,时间,基本知识,项目,数据,源

      linux纯命令模式切换?

      linux纯命令模式切换?,系统,密码,状态,电脑,网络,信息,模式,命令,情况,地方,L

      linux命令底行模式?

      linux命令底行模式?,系统,地址,工作,命令,管理,时间,信息,模式,控制台,图形

      linux中进入命令模式?

      linux中进入命令模式?,系统,服务,信息,命令,终端,情况,地址,模式,数据库,选

      linux纯命令行模式?

      linux纯命令行模式?,系统,软件,手机,分析,设计,代码,工具,地方,密码,网络,网

      linux改为命令行模式?

      linux改为命令行模式?,系统,电脑,密码,网络,工作,状态,模式,命令,信息,工具,l

      linux默认命令行模式?

      linux默认命令行模式?,系统,密码,工具,地方,设计,设备,服务,网络,终端,界面,l

      linux底线命令模式?

      linux底线命令模式?,系统,地址,工作,基础,管理,网络,软件,信息,上会,电脑,试

      linux命令模式查找?

      linux命令模式查找?,信息,工作,系统,地址,命令,管理,文件,目录,字符串,模式,l

      linux命令模式卡住?

      linux命令模式卡住?,系统,数据,密码,软件,分析,管理,信息,时间,基础,环境,Lin