是否有人在MFC /非.net应用程序的模式对话框中实现了灯箱样式背景调光。
我认为程序必须是这样的:
步骤进行:
获取对话框父HWND或CWnd *
获取父窗口的矩形并在该窗口上绘制具有半透明度的叠加层
是否有任何现有的库/框架可以执行此操作,或者在MFC中删除半透明叠加层的最佳方法是什么?
编辑如果您不知道'灯箱样式'的含义,这是我想要实现的模型
部分应用:
带灯箱对话框
答案 0 :(得分:4)
这是我做的*基于Brian的链接
首先使用属性
你应该得到一个没有框架或任何东西的对话窗口,只是一个灰色框。 覆盖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中实例化它,像模态对话框一样创建它,即在堆栈(或堆,如果需要),调用它的手动创建,显示它然后在它顶部创建实际的模态对话框:< / p>
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;
}
这会导致完全,就像我上面的模拟
*仍有改进的地方,比如没有开始制作对话框和其他一般的整理。
答案 1 :(得分:2)
我认为您只需要创建一个窗口并设置透明度。有一个MFC CGlassDialog sample on CodeProject可能会帮助你。关于如何使用Win32 API执行此操作还有一个article。