0

分割ウィンドウを使用して、データを表示するメイン ビューの横にツリー コントロールを含める MFC sdi アプリがあります。

ユーザーがツリーで何かを選択すると、ユーザーが意図的にメイン データ ウィンドウをクリックするまで、そのビューはフォーカスを維持します。これは、メイン ビューに関連付けられているツールバー ボタンが無効になっていることを意味します。

ユーザーがツリー コントロールをクリックした後、プログラムでフォーカスをメイン ビューに戻す方法はありますか? または、CSplitterWnd と 2 つのビューを使用して何か根本的に間違っていますか?

4

1 に答える 1

2

誰かがツリーをクリックするとすぐにフォーカスを他のビューに戻したくありません。アプリが使用できなくなります。たとえば、ツリーがフォーカスを十分に長く保つことができないため、ユーザーがキーボードを使用してツリー内を移動できなくなります。

ツールバーに2番目のビューの状態を反映させてもらいたいのですが(それが良いアイデアかどうかはわかりません)、いくつかのオプションがあります。あなたの選択をしてください。2頭に浮かぶ:

  1. ツリービューは。であってはなりませんCView。単純なを使用しCTreeCtrlます。doc / viewパラダイムを破るようなものなので、あまり良くありません(たとえば、が呼び出さOnUpdate()れるたびにツリーが呼び出されることはありませんUpdateAllViews())。

  2. ツリーがアクティブビューにならないようにします。そうするために:

    2.a. 表示するとフォーカスが取得されます(OnSetFocus()):

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

    2.b. CMySplitterWndからクラスを派生し、CSplitterWndオーバーライドCMySplitterWnd::SetActivePane()して、ツリービューがアクティブビューとして設定されないようにします。

すべての場合において、ソースコードに飛び込むことが必須のデイリースポーツであるMFC内部の素晴らしい世界へようこそ;-)

于 2008-10-09T18:26:38.467 に答える