MFC 앱의 라이트박스 스타일 대화 상자
-
09-06-2019 - |
문제
MFC/비.net 앱의 모달 대화 상자에 라이트박스 스타일 배경 흐리게를 구현한 사람이 있습니까?
제 생각에는 절차가 다음과 같아야 할 것 같습니다.
단계:
대화 상자 상위 HWND 또는 CWnd* 가져오기
상위 창의 직사각형을 가져오고 해당 창 위에 반투명도가 있는 오버레이를 그립니다.
- 대화 상자가 모달 그리기 루틴(예: DoModal())을 수행하도록 허용합니다.
이를 수행하는 기존 라이브러리/프레임워크가 있습니까? 아니면 MFC에서 반투명 오버레이를 삭제하는 가장 좋은 방법은 무엇입니까?
편집하다 '라이트박스 스타일'이 무엇을 의미하는지 모르는 경우 제가 달성하려는 내용의 모형은 다음과 같습니다.
일부 앱:
라이트박스 대화상자 포함
해결책
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를 사용하여 이를 수행하는 방법에 대해 알아보세요.