문제

MFC/비.net 앱의 모달 대화 상자에 라이트박스 스타일 배경 흐리게를 구현한 사람이 있습니까?
제 생각에는 절차가 다음과 같아야 할 것 같습니다.

단계:

  1. 대화 상자 상위 HWND 또는 CWnd* 가져오기

  2. 상위 창의 직사각형을 가져오고 해당 창 위에 반투명도가 있는 오버레이를 그립니다.

  3. 대화 상자가 모달 그리기 루틴(예: DoModal())을 수행하도록 허용합니다.

이를 수행하는 기존 라이브러리/프레임워크가 있습니까? 아니면 MFC에서 반투명 오버레이를 삭제하는 가장 좋은 방법은 무엇입니까?
편집하다 '라이트박스 스타일'이 무엇을 의미하는지 모르는 경우 제가 달성하려는 내용의 모형은 다음과 같습니다.
일부 앱:
alt text

라이트박스 대화상자 포함
alt text

도움이 되었습니까?

해결책

Brian의 링크를 기반으로 내가 한 일은 다음과 같습니다.
먼저 다음 속성을 사용하여 대화 상자 리소스를 만듭니다.

  • 국경 거짓
  • 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에서 인스턴스화하고 Modal 대화 상자처럼 만듭니다.스택(또는 원하는 경우 힙)에서 수동으로 생성을 호출하고 표시한 다음 그 위에 실제 모달 대화 상자를 만듭니다.

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

그리고 이것은 뭔가 결과를 낳는다 정확히 위의 내 모형처럼

*처음부터 대화 상자를 만들지 않고 수행하거나 기타 일반적인 정리 작업을 수행하는 등 아직 개선할 부분이 있습니다.

다른 팁

창을 만들고 투명도를 설정하면 될 것 같아요.MFC가 있습니다 CodeProject의 CGlassDialog 샘플 그게 당신에게 도움이 될 수도 있어요.또한 기사 Win32 API를 사용하여 이를 수행하는 방법에 대해 알아보세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top