Frage

Hat jemand die Hintergrunddimmung im Lightbox-Stil in einem modalen Dialogfeld in einer MFC-/Nicht-.net-App implementiert?
Ich denke, das Verfahren müsste etwa so aussehen:

Schritte:

  1. Dialog-Parent HWND oder CWnd* abrufen

  2. Holen Sie sich das Rechteck des übergeordneten Fensters und zeichnen Sie eine durchsichtige Überlagerung über dieses Fenster

  3. Lassen Sie den Dialog seine modale Zeichenroutine ausführen, z. B. DoModal()

Gibt es dafür vorhandene Bibliotheken/Frameworks oder wie lässt sich ein durchscheinendes Overlay am besten in MFC einfügen?
bearbeiten Hier ist ein Modell dessen, was ich erreichen möchte, falls Sie nicht wissen, was „Lightbox-Stil“ bedeutet
Einige App:
alt text

mit einem Lightbox-Dialogfeld
alt text

War es hilfreich?

Lösung

Folgendes habe ich getan*, basierend auf Brians Links
Erstellen Sie zunächst eine Dialogressource mit den Eigenschaften:

  • Grenze FALSCH
  • 3D-Look FALSCH
  • Client-Edge FALSCH
  • Popup-Stil
  • statische Kante FALSCH
  • Transparent WAHR
  • Titelleiste FALSCH

und Sie sollten ein Dialogfenster ohne Rahmen oder ähnliches erhalten, nur ein graues Kästchen.Überschreiben Sie die Create-Funktion so, dass sie wie folgt aussieht:

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

Erstellen Sie dann eine kleine schwarze Bitmap in einem Bildeditor (z. B. 48x48) und importieren Sie sie als Bitmap-Ressource (in diesem Beispiel IDB_BITMAP1).
Überschreiben Sie die WM_ERASEBKGND-Nachricht mit:

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

Instanziieren Sie es im DoModal des gewünschten Dialogs, erstellen Sie es wie einen modalen Dialog, d. h.Rufen Sie auf dem Stapel (oder Heap, falls gewünscht) „Manuell erstellen“ auf, zeigen Sie es an und erstellen Sie dann Ihren eigentlichen modalen Dialog darüber:

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

und daraus ergibt sich etwas genau wie mein Mock-up oben

*Es gibt immer noch Verbesserungsmöglichkeiten, z. B. ohne ein Dialogfeld zu erstellen und einige andere allgemeine Aufräumarbeiten.

Andere Tipps

Ich denke, Sie müssen nur ein Fenster erstellen und die Transparenz festlegen.Es gibt einen MFC CGlassDialog-Beispiel auf CodeProject das könnte dir helfen.Es gibt auch eine Artikel erfahren Sie, wie Sie dies mit den Win32-APIs tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top