您的位置:首页 > 其它

GetActiveView 返回 NULL 为 MDI 框架窗口

2012-10-22 13:41 357 查看

症状

GetActiveView()
函数将返回活动视图(如果有的话)附加到框架窗口(CFrameWnd)。此函数返回 NULL
时为 MDI 主框架窗口 (CMDIFrameWnd)
调用。

原因

在 MDI
应用程序中,MDI 主框架窗口(CMDIFrameWnd)
不具有与其相关联的视图。相反,每个单独的子窗口(CMDIChildWnd)具有与之关联的一个或多个视图。因此,对 MDI
主框架窗口的 GetActiveView() 函数的调用,则返回 NULL。本文的"更多信息"部分提供了在
MDI 应用程序中不同的窗口的布局。

解决方法

若要解决此问题,请查找活动的 MDI
子窗口(如果有的话),然后调用 GetActiveView()函数的子窗口。可以通过调用 MDIGetActive()
或 GetActiveFrame() 函数,找到活动的 MDI
子窗口,此代码中所示:

CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;

// Get the active MDI child window.

CMDIChildWnd *pChild = CMDIChildWnd *)pFrame->GetActiveFrame();

/* or CMDIChildWnd *pChild =

pFrame->MDIGetActive();

*/

// Get the active view attached to theactive MDI child window.

CMyView *pView = (CMyView *)pChild->GetActiveView();

更多信息

MDI 框架窗口的工作区被称为MDICLIENT,也称为工作区中的客户端窗口覆盖。此客户端窗口中又包含零个或更多的子窗口,其中每个可显示的视图,如本图中所示:

---------------------------

| Frame Window | ---> CMDIFrameWnd

| (main application window)|

---------------------------

|

--------------------

| Client Window | ---> MDICLIENT window class

| (no view attached) |

--------------------

|

-----------------------------------------------------------

| |

--------------------- --------------------

| Child Window 1 | | Child Window 2 | ---> CMDIChildWnd

| (one or more views) | | (one or more views |

--------------------- --------------------

在此图中所示,MDI 框架窗口没有直接与之相关联的视图。视图实际上与程序关联的 MDI 子窗口。

因此,为 MDI 主框架窗口调用 GetActiveView() 函数将返回 NULL,意味着没有直接与 MDICLIENT 相关视图。通过先查找活动的 MDI 子窗口,在本文的解决方案一节中所述,为的子窗口查找活动视图,可以获取 MDI 应用程序中的活动视图。

转载自:http://support.microsoft.com/kb/129649
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: