Диалоги стиля лайтбокса в приложении MFC - PullRequest
4 голосов
/ 09 сентября 2008

Кто-нибудь реализовал затемнение в стиле Lightbox в модальном диалоговом окне в приложении MFC / non .net.
Я думаю, что процедура должна быть что-то вроде:

шаги:

  1. Получить родительский диалог HWND или CWnd *

  2. Получите прямоугольник родительского окна и нарисуйте оверлей с прозрачностью над этим окном

  3. позволяет диалогу выполнять свою модальную процедуру рисования, например, DoModal ()

Существуют ли какие-либо библиотеки / фреймворки, чтобы сделать это, или какой лучший способ избавиться от полупрозрачного наложения в MFC? edit Вот макет того, чего я пытаюсь достичь, если вы не знаете, что означает «стиль лайтбокса»
Некоторые приложения :
alt text

с диалоговым окном лайтбокса
alt text

Ответы [ 2 ]

4 голосов
/ 10 сентября 2008

Вот что я сделал * по ссылкам Брайана
Сначала создайте ресурс диалога со свойствами:

  • Граница ЛОЖЬ
  • 3D вид FALSE
  • клиентское преимущество FALSE
  • Стиль всплывающих окон
  • статическое ребро FALSE
  • Прозрачный ИСТИНА
  • Строка заголовка FALSE

и у вас должно получиться диалоговое окно без рамки или чего-либо, только серая коробка. переопределите функцию Create, чтобы она выглядела так:

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 с помощью:

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 нужного диалога, создайте его как модальное диалоговое окно, то есть в стеке (или, если хотите, в куче), вызовите его Create вручную, покажите его, затем создайте свой фактический модальный диалог поверх него: 1039 *

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

и это приводит к чему-то точно как мой макет выше

* есть еще места для улучшения, как, например, сделать это без создания диалогового окна и некоторые другие общие замечания.

2 голосов
/ 09 сентября 2008

Я думаю, вам просто нужно создать окно и установить прозрачность. Есть пример MFC CGlassDialog на CodeProject , который может вам помочь. Также есть статья о том, как это сделать с помощью Win32 API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...