如何使用CDockablePane中的新CMCPCPropertyGridCtrl替换CMFCPropertyGridCtrl

时间:2016-04-10 11:59:29

标签: c++ mfc

我在CDockablePane中创建了CMFCPropertyGridCtrl,我想用新的CMFCPropertyGridCtrl替换它,然后我重写OnEraseBkgnd。 OnEraseBkgnd仅在应用程序启动时调用,当我想通过Invalidate或InvalidateRect调用它时它没有触发。 我怎样才能调用OnEraseBkgnd? 提前谢谢。

void CCL2PropertiesPane::HostPropertyGridControl(CMFCPropertyGridCtrl* pPropertyGridControl)
{
  if(NULL == pPropertyGridControl)
    return;

  if(m_pPropertyGridControl)
    RemoveCurrentPropertyGridControl();

  m_pPropertyGridControl = pPropertyGridControl;
  SetWindowText(m_pPropertyGridControl->GetName());

  CRect clientRectangle;
  GetClientRect(&clientRectangle);
  m_pPropertyGridControl->Create(WS_CHILD | WS_VISIBLE, clientRectangle, this, PROPERTIES_DOCKABLE_PANE_ID);
}
//--------------------------------------------------------------------------------
void CCL2PropertiesPane::RemoveCurrentPropertyGridControl()
{

  m_pPropertyGridControl = NULL;
  SetWindowText(GetPaneName());

  CRect clientRectangle;
  GetClientRect(&clientRectangle);

  //here i want to call OnEraseBkgnd
  InvalidateRect(clientRectangle);
  //Invalidate();
}
//--------------------------------------------------------------------------------
BOOL CCL2PropertiesPane::OnEraseBkgnd(CDC* pDC)
{
  CRect clientRectangle;
  GetClientRect(&clientRectangle);

  CBrush whiteBrush(RGB(250, 250, 250));
  pDC->FillRect(clientRectangle, &whiteBrush);

  return TRUE;
}

1 个答案:

答案 0 :(得分:0)

ON_WM_ERASEBKGND添加到CCL2PropertiesPane的消息地图以正确删除背景。或者将FillRect功能移至OnPaint

关于:

void CCL2PropertiesPane::RemoveCurrentPropertyGridControl()
{
    m_pPropertyGridControl = NULL;
    ...
}

上面的代码适用于初始化,但它不会删除或破坏任何内容。控件仍在那里,它只会使程序忘记如何找到控件。隐藏控件使用:

m_pPropertyGridControl->ShowWindow(SW_HIDE);

要销毁控件使用DestroyWindow(),但不建议使用上述设置。