c ++ MFC窗口(帧)操作

时间:2016-05-31 09:34:09

标签: c++ mfc border titlebar dwm

我正在开发一个Windows应用程序,它必须在MainFrame的左下角显示一个重叠的固定定位窗口(“PopUp”),如果用户错过了某些输入或某些操作已经成功,它将接收一些信息

“PopUp”标题栏标题旁边应有一个图标(例如 - >图标< - “错误”)和标准X - 关闭按钮。 ClientArea将具有已发生消息的描述性文本。

此外,PopUp的标准边框应设置为1px(小于默认的窗口边框)

“PopUp”派生自CWnd,并使用WS_VISLBE |创建WS_CLIPSIBLINGS | WS_CHILD |应用程序MainFrame窗口的OnCreate方法中的WS_CAPTION

现在我需要设置/收缩我的PopUp的默认边框,并将Icon添加到PopUp的Titlebar。

有人可以给我一些示例代码,说明我如何解决我的问题? 我对c ++和MFC很陌生,到目前为止,我的研究把我带到https://msdn.microsoft.com/en-us/library/windows/desktop/bb688195(v=vs.85).aspx 但我不知道在哪里以及如何使用DwmExtendFrameIntoClientArea(),但到目前为止,我已经读过,我认为Dwm是能够解决这两个问题的方法,还是有另一种/完全不同的方式?我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:2)

最后,我可以通过覆盖WM_NCCALCSIZE的处理来缩小默认的Windows边框。

一旦我解决了如何将我的Icon放入标题栏中,我就会更新这个答案。 到目前为止,我将解释如何缩小窗口边框:

将ON_WM_NCCALCSIZE()添加到所需窗口的MessageMap中并实现OnNcCalcSize()(类向导将帮助设置它),如下所示:

void YourCWndClass::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{

   if (bCalcValidRects){   
      CRect rcClient, rcWind;
      GetClientRect(&rcClient);
      GetWindowRect(&rcWind);


      int border = (rcWind.right - rcWind.left - rcClient.right) / 2 - 1;
      //-1: leaves 1px of the Windows Default Border Width erase to have no border

      lpncsp->rgrc->left -= border;
      lpncsp->rgrc->right += border;
      lpncsp->rgrc->bottom += border;
   }

   CWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
}

WM_NCCALCSIZE消息在窗口创建时发送(当您调用Create()/ CreateEx()时),但此时GetClientRect()和GetWindowRect()将不返回正确的值,因此您需要检查Bool参数!!!

在窗口创建后立即触发另一个WM_NCCALCSIZE,以便能够使用正确的Window Rectangles调用SetWindowPos()

if (!m_MessagePopOver->Create(NULL, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CAPTION, rect, this, NULL, NULL)){
      TRACE0("failed to create MessagePopOver");
   }

m_MessagePopOver->SetWindowPos(&wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

这将产生如下窗口:

rounded windowframe illustration