Диалоги в стиле лайтбоксов в приложении MFC

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

шаги:

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

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

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

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

с диалоговым окном лайтбокса Диалоги в стиле лайтбоксов в приложении MFC

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
2 159
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

geocoin 09.09.2008 18:19
Ответ принят как подходящий

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

  • граница ЛОЖНЫЙ
  • 3D вид ЛОЖНЫЙ
  • клиентский край ЛОЖНЫЙ
  • Стиль всплывающего окна
  • статический край ЛОЖНЫЙ
  • Прозрачный ИСТИННЫЙ
  • Строка заголовка ЛОЖНЫЙ

и у вас должно получиться диалоговое окно без рамки или чего-то еще, только серая рамка. переопределите функцию 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 вручную, покажите его, а затем создайте свой фактический модальный диалог поверх него:

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

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

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

Другие вопросы по теме