MFC中ActiveWindow的类名

时间:2011-07-29 10:40:19

标签: visual-c++ mfc

在我的MDI应用程序中,我在mainframe中加载一个DialogBar。但是我想在调用一些子窗口时显示DialogBar(GroupView,TrendView)。对于其他窗口,它应该被隐藏(GraphView)。所以所有函数都是用于从CMainFrame调用子窗口的方法是隐藏DialogBar。

void CMainFrame::OnGroupview()
{
.
.
.
m_RecentAlarms.ShowWindow(SW_HIDE);
} 

对于某些观点

void CMainFrame::OnGroupview()
{
.
.
.m_RecentAlarms.ShowWindow(SW_SHOW);
}

所以,当我点击TrendView时,我得到DialogBar,当我点击GraphView时,DialogBar会被隐藏。但是当我点击TrendView时,我没有得到Dialogbar。因为应用程序是多个窗口。之前的TrendView是GraphView的后面,当我调用它时,它就显示在前面。

所以我的想法是我在Mainframe中有一个线程,这个函数更新所有视图中的一些值。在那里我将检查Active View是否是TrendView,如果是,那么DialogBar将被显示为其他方面它将被隐藏

我用过这个..

CMDIChildWnd* pChild = ((CMainFrame*)AfxGetMainWnd())->MDIGetActive();

但我不知道如何让活动视图只是TrendView ....

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

在这里,您有pChild中的活动窗口。 希望你有一个对应于每个视图的成员变量(GraphView,TrendView等) 我想它会像:m_GraphViewm_TrendView等。 现在你需要做的是比较两个窗口的句柄。

试试这段代码:

if( pChild->GetSafeHWND() == m_GraphView.GetSafeHWND() )
{
   m_RecentAlarms.ShowWindow(SW_HIDE);
}
else
{
  m_RecentAlarms.ShowWindow(SW_SHOW); 
}

比较窗口的句柄是最好的方法。

答案 1 :(得分:1)

首先, CMDIFrameWnd :: MDIGetActive 获取活动的MDI子框架。
接下来,您可以通过调用 CFrameWnd :: GetActiveView 来获取其活动视图。
最后,调用 CObject :: IsKindOf

示例:

   CMDIChildWnd* pFrame = ((CMDIFrameWnd*)AfxGetMainWnd())->MDIGetActive();
   if(NULL != pFrame)
   {
      CView* pView = pFrame->GetActiveView();
      if(NULL != pView)
      {
         if(pView->IsKindOf(RUNTIME_CLASS(TrendView)))
         {
            // The active view is of type 'TrendView'
         }
         else if(pView->IsKindOf(RUNTIME_CLASS(GraphView)))
         {
            // The active view is of type 'GraphView'
         }
      }
   }

注意:

  1. 确保视图类已定义DECLARE_DYNCREATE和 IMPLEMENT_DYNCREATE以便使用 IsKindOf(RUNTIME_CLASS ...
  2. 我发布了有关查找活动视图的here相关示例代码 在SDI / MDI MFC应用程序中。