Question

Quelqu'un a-t-il implémenté la gradation d'arrière-plan de style Lightbox sur une boîte de dialogue modale dans une application MFC/non .net.
Je pense que la procédure devrait être quelque chose comme :

pas:

  1. Obtenir la boîte de dialogue parent HWND ou CWnd*

  2. Obtenez le rectangle de la fenêtre parent et dessinez une superposition avec une translucidité sur cette fenêtre

  3. permettre à la boîte de dialogue d'effectuer sa routine de dessin modal, par exemple DoModal()

Existe-t-il des bibliothèques/frameworks existants pour ce faire, ou quelle est la meilleure façon de supprimer une superposition translucide dans MFC ?
modifier Voici une maquette de ce que j'essaie de réaliser si vous ne savez pas ce que signifie « style lightbox »
Une application:
alt text

avec une boîte de dialogue lightbox
alt text

Était-ce utile?

La solution

Voici ce que j'ai fait* sur la base des liens de Brian
Créez d’abord une ressource de dialogue avec les propriétés :

  • frontière FAUX
  • aspect 3D FAUX
  • bord client FAUX
  • Style contextuel
  • bord statique FAUX
  • Transparent VRAI
  • Barre de titre FAUX

et vous devriez vous retrouver avec une fenêtre de dialogue sans cadre ni rien, juste une boîte grise.remplacez la fonction Create pour ressembler à ceci :

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;
}

puis créez un petit bitmap noir dans un éditeur d'images (disons 48x48) et importez-le en tant que ressource bitmap (dans cet exemple IDB_BITMAP1)
remplacez le message WM_ERASEBKGND par :

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;
}

Instanciez-le dans le DoModal de la boîte de dialogue souhaitée, créez-le comme une boîte de dialogue modale, c'est-à-diresur la pile (ou le tas si vous le souhaitez), appelez-le Créer manuellement, affichez-le puis créez votre boîte de dialogue modale par-dessus :

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;
}

et cela donne quelque chose exactement comme ma maquette ci-dessus

*il y a encore des points à améliorer, comme le faire sans créer de boîte de dialogue pour commencer et quelques autres ajustements généraux.

Autres conseils

Je pense qu'il vous suffit de créer une fenêtre et de définir la transparence.Il y a un MFC Exemple CGlassDialog sur CodeProject cela pourrait vous aider.Il y a aussi un article sur la façon de procéder avec les API Win32.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top