gpt4 book ai didi

c++ - MFC中创建子窗口的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 02:34:34 39 4
gpt4 key购买 nike

我已经为具有文档/ View 架构的 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);

}
}

?我非常关心我做我的 child 窗口的方式的正确性。?现在,我不知道如何通过我的子窗口漂亮地监听鼠标消息?

最佳答案

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

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

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

关于c++ - MFC中创建子窗口的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465809/

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