gpt4 book ai didi

c++ - MFC 应用程序中的灯箱样式对话框

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:23 28 4
gpt4 key购买 nike

有没有人在 MFC/非 .net 应用程序的模态对话框上实现灯箱样式背景调光。
我认为程序必须是这样的:

步骤:

  1. 获取对话框父 HWND 或 CWnd*

  2. 获取父窗口的矩形并在该窗口上绘制一个半透明的覆盖层

  3. 允许对话框执行模态绘制例程,例如 DoModal()

是否有任何现有的库/框架可以执行此操作,或者在 MFC 中删除半透明覆盖的最佳方法是什么?
编辑如果您不知道“灯箱样式”的含义,这是我正在尝试实现的模型
一些应用:
alt text

带有灯箱对话框
alt text

最佳答案

这是我根据 Brian 的链接所做的*
首先创建一个具有以下属性的对话框资源:

  • 边框
  • 3D 外观
  • 客户端边缘 FALSE
  • 弹出样式
  • 静态边缘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;
}

这导致了一些完全像我上面的模型

*仍有需要改进的地方,比如在不制作对话框的情况下进行操作,以及其他一些常规整理。

关于c++ - MFC 应用程序中的灯箱样式对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51687/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com