【问题标题】:What is the WindowProc of "MDI Client Window“ in MFCMFC中“MDI客户端窗口”的WindowProc是什么
【发布时间】:2013-11-20 08:47:08
【问题描述】:

伙计们, 我是新手,刚开始学习MFC。 我有一个关于 MDI 应用程序框架的问题。 在 MFC 中。 我从代码中了解到,当我新建一个文件时,MDI 客户端窗口总是创建一个 ChildFrame。 但是我在 MFC 中找不到“MDI 客户端窗口”的 WindowProc 是什么。 实际上,“MDI Client Window”是在我们创建主框架之后创建的。

winmdi.cpp
 // Create MDICLIENT control with special IDC
 if ((m_hWndMDIClient = ::AfxCtxCreateWindowEx(dwExStyle, _T("mdiclient"), NULL,
      dwStyle, 0, 0, 0, 0, m_hWnd, (HMENU)AFX_IDW_PANE_FIRST,
      AfxGetInstanceHandle(), (LPVOID)&ccs)) == NULL)

关于"MDI Client Window“

在创建 ChildFrame 时,我们向“MDI Client Window”发送 WM_MDICREATE 消息,然后我们得到窗口的句柄。

    winmdi.cpp
    BOOL CMDIChildWnd::Create(LPCTSTR lpszClassName,
 LPCTSTR lpszWindowName, DWORD dwStyle,
 const RECT& rect, CMDIFrameWnd* pParentWnd,
 CCreateContext* pContext)

{
//......
 // create the window through the MDICLIENT window
 AfxHookWindowCreate(this);
 HWND hWnd = (HWND)::SendMessage(pParentWnd->m_hWndMDIClient,
      WM_MDICREATE, 0, (LPARAM)&mcs);

关于 WM_MDICREATE ,我从 Microsoft 找到了这个信息。 *应用程序将 WM_MDICREATE 消息发送到多文档界面 (MDI) 客户端窗口以创建 MDI 子窗口。 如果消息成功,则返回值是新子窗口的句柄。 如果消息失败,返回值为NULL。*

我猜,也许是 Windows 的 WindowProc 来自 AfxGetInstanceHandle();但老实说,我真的不知道它是怎么做到的。

AfxGetInstanceHandle http://msdn.microsoft.com/en-us/library/vstudio/36z3tfsb.aspx 此函数允许您检索当前应用程序的实例句柄。

请帮帮我... 真的非常感谢。

【问题讨论】:

    标签: windows visual-c++ mfc


    【解决方案1】:

    在 MFC 中没有特殊的窗口过程。所有窗口都有一个称为 AfxWndProc 的 MFC 内部窗口过程。此过程查看消息映射,最终将窗口消息分派给处理程序。

    在内部,您不会在窗口 proc 中找到任何有关特殊 MDI 处理的信息。一切都在CMDIFrameWnd内部完成

    【讨论】:

    • 感谢您的大力帮助。
    • 在创建 MainFrame 窗口时,我们在 WH_CBT 挂钩中设置了 windowProc。 ==>_AfxCbtFilterHook(...) ,你是对的,它是 AfxWndProc。 codeBOOL CFrameWnd::Create(...) { //... AfxHookWindowCreate(this); HWND hWnd = ::AfxCtxCreateWindowEx(cs.dwExStyle, cs.lpszClass, cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy, cs.hwndParent, cs.hMenu, cs.hInstance , cs.lpCreateParams); }code
    • 我想知道我们什么时候为 ChildFrame 设置 WindowProc。我没有看到任何为该窗口注册类的代码。 Windows 是否从 Instance_Handle 获取 WindowProc?这些窗口是否共享一个类? ::AfxCtxCreateWindowEx(, , , , , , , , , ,AfxGetInstanceHandle(),)
    • 对于所有 MFC Windows,只有一个带有一个 WIndowProc 的中心类。钩子函数创建窗口并将句柄设置为用于确定关联的 CWnd 对象的映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多