在MFC中创建子窗口的真正方法是什么?

时间:2015-12-25 19:38:47

标签: c++ mfc

我使用文档/视图架构为SDI MFC应用程序创建了项目。

现在,我想将主窗口和主板分开(我试着写一个棋盘游戏)。我想把电路板放到子窗口,为了进一步轻量级,它们取决于父(主)窗口的大小。

实际上我已经这样做了,但现在我遇到了问题 - 我也想等待鼠标的消息。

class CGameView {
  // ...
  CGameView()
  {
    childWnd = new CWnd;
  }

  ~CGameView()
  {
    delete childWnd;
  }

  void CGameView::OnSize(UINT nType, int cx, int cy) {
    CGameDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if(!pDoc)
      return;
    // I bind the height of child window with height of parent
    RECT rcClient;
    GetClientRect(&rcClient);
    rcClient.left = 0;
    rcClient.right = pDoc->getWidth();
    childWnd->MoveWindow(&rcClient);

    childWnd->CenterWindow();

    return;
  }

  int CGameView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
    if (CView::OnCreate(lpCreateStruct) == -1)
      return -1;

    CGameDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if(!pDoc)
      return -1;

    childWnd->Create(NULL, NULL, WS_CHILD | WS_VISIBLE,
       CRect(0, 0, pDoc->getWidth(), pDoc->getHeight()), this, 0);

    return 0;
  }

  void CGameView::OnDraw(CDC* pDC)
  {
    CGameDoc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    CRect rcClient;
    GetClientRect(&rcClient);
    CClientDC cdc(childWnd);
  // The pOffScreen contains the bitmap that I just copy to specified CDC
    pOffScreen->print(&cdc, &rcClient);

  }
}

?我非常关心我做孩子窗户的方式的正确性。 ?现在,我不知道如何通过我的孩子窗口美妙地收听鼠标消息?

1 个答案:

答案 0 :(得分:3)

一般来说,您不应直接创建CWnd类型的对象。

相反,创建CWnd的子升级并创建该类型的对象。然后,您可以使用该类的成员函数管理鼠标,绘图和任何其他事件。

class CBoardWnd : public CWnd
{
    DECLARE_MESSAGE_MAP()
    //...
};
BEGIN_MESSAGE_MAP(CBoardWnd, CWnd)
    ON_WM_MOUSEMOVE(...)
    //...
END_MESSAGE_MAP()