MFC SDI框架程序,拆分成两个view, 其中一个是 CFormView, 在这个view中我 建了个 toolbar, 
我的问题是,当鼠标点击 另一个view时, 这个FormView中 toolbar 的按钮 变灰了,我再在 这个FormView上点击鼠标,按钮又恢复为正常状态。现在我想不管焦点在哪,都让toolbar按钮一直有效,该怎么办?

解决方案 »

  1.   

    重载如下函数
    //=============================================================================
    // 一个经典的函数, 让工具按钮/菜单在所有的多视/分割视图都可用(而不是灰化),可以响应
    BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
    {
    if ( CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo) )
    return TRUE;

    CSkillBookDoc * pDoc = ( CSkillBookDoc* ) GetActiveDocument ();
    POSITION pos=NULL;
    if ( pDoc != NULL )
    pos = pDoc->GetFirstViewPosition ();

    while ( pos != NULL )
    {
    CView* pNextView = pDoc->GetNextView ( pos );
    if ( pNextView != GetActiveView() )
    {
    if ( pNextView->OnCmdMsg ( nID, nCode, pExtra, pHandlerInfo ) )
    return TRUE;
    }
    }

    return FALSE;
    // return CNewFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
    }
      

  2.   

    响应函数不要放在view,放在CMainframe就行了
      

  3.   

    程序空闲时间内会进行UI的更新,就是判断菜单/工具按钮是否应该灰化.
    有个前提,如果程序在消息处理列表内没有找到对应的消息响应函数,菜单/工具按钮肯定是灰化的.
    在默认的情况下,消息处理顺序大致为VIEW/DOC/FRAME/APP/系统(可能不是很准确),但有一点可以确认,就是这里的VIEW是当前激活的VIEW,没有激活的VIEW是不会进入消息处理链表的,这样有些消息虽然处理了,但程序在运行的时候没有检测到,所以是灰化的.上述代码把没有激活的VIEW也加到了消息处理列表中,这样你的以前灰化的消息处理顺序如下:
    激活的VIEW(没有处理)/DOC(没有处理)/然后交给FRAME(也没有对应的响应函数,也不处理),但是此时FRAME做了重要的决定,就是代码实现了把没有处理的消息交给所有没有激活的视图,看看这些视图有没有做对应的消息响应,有(因为你做了)则不会灰化,没有那就可能是灰化了.以上为个人的理解,错误之处在所难免.但楼主问了,尽个人能力,我是这么理解的.另外,利用这个函数,还可以把一些其它的如停靠栏等其它的UI工具也处理消息,只要把窗口按照上述方法加入到消息处理链表即可.