2008-09-09 3 views
4

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

шагов:

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

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

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

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

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

ответ

4

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

  • границы FALSE
  • 3D выглядеть FALSE
  • клиента край FALSE
  • Popup style
  • статический край 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 нужного диалога, создайте его как модальный диалог, т.е.в стеке (или кучи, если желательно), называем это создать вручную, показать его затем создать фактический ваш диалог модальный поверх него:

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

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

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

2

Думаю, вам просто нужно создать окно и установить прозрачность. Существует MFC CGlassDialog sample on CodeProject, который может вам помочь. Существует также article о том, как это сделать с помощью API Win32.

+0

это похоже на то, что я ищу. Я попробую и отправлю отчет :) – geocoin