0

我有一个 MFC sdi 应用程序,它使用拆分器窗口在显示数据的主视图旁边包含一个树控件。

当用户在树中选择某些内容时,该视图会保持焦点,直到用户故意单击主数据窗口。这意味着与主视图关联的任何工具栏按钮都被禁用。

用户单击树控件后,有没有办法以编程方式将焦点切换回主视图?还是我使用 CSplitterWnd 和 2 个视图做一些根本错误的事情?

4

1 回答 1

2

您不想在有人单击树后立即将焦点带回另一个视图:这会使您的应用程序无法使用。例如,它会阻止用户使用键盘在树中导航,因为树永远不会让焦点保持足够长的时间。

我真的希望工具栏不断反映您的第二个视图的状态(我不确定这是一个好主意),您有几个选择。做你的选择。2 想到:

  1. 您的树视图不应该是CView. 使用简单的CTreeCtrl. 不是很好,因为它有点打破了文档/视图范式(例如OnUpdate(),每当调用 an 时就不再调用树UpdateAllViews())。

  2. 防止树成为活动视图。为此:

    2.a. 当您查看获得焦点 ( OnSetFocus()) 时:

    STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd())->SetActiveView(pTheOtherView);
    

    2.b。从派生一个CMySplitterWndCSplitterWnd,然后覆盖CMySplitterWnd::SetActivePane()以防止将树视图设置为活动视图。

在所有情况下,欢迎来到 MFC 内部的精彩世界,深入研究源代码是每天的必修课;-)

于 2008-10-09T18:26:38.467 回答