
・環境
VisualStudio2008SP1+FeaturePack
Windows7 64bit
タブドキュメント形式でMDIアプリを作っているのですが、複数ドキュメントがある際にプログラムから任意のビューを安全にアクティブ化させる方法がわからずに困っております。CMainFrame::SetActiveViewメソッドを使用すると指定したビューがアクティブになり所望の動作になるのですが、この方法だとドキュメントをクローズするときに以下の例外が出て怒られます。SetActiveViewはビューのOnCreate内で実行しています。
アクティブ化を解除しているアクティブ化コンテキストは、最近アクティブ化されたものではありません。
こういった状況に遭遇しない方法を探っているのですが使用するAPIと適切な使用タイミングがつかめず困っております。どなたかにご教授いただければ幸いです。
No.3ベストアンサー
- 回答日時:
この回答への補足
上記リンクは私もGoogleから検索してみておりましたが、そのあたりはクラスのメソッド名から予測していろいろ試し済みのところでもありまして、うまくもいきませんでした。
で、今回のケースではタブによるMDI子ウィンドウの切り替えを行っています。タブを交互にクリックするとCView::OnMDIActivate仮想関数が正しく呼ばれ、そこで所望の処理を記述し、たとえば複数のCView間でどうしても1つのリソースを共有しなければならない場合などに排他処理のフラグを立てたりします。今回問題なのは新規ドキュメント生成直後に「新規ドキュメント以外も」有効化状態のままになってしまうというところでして、新規ドキュメント作成後に新しいタブとともにそれに対応したビューが表示されるのですが、それだけを有効化されたビューにしたいのです。
新規のドキュメントが生成されたときにも既存のビューのOnMDIActivateは呼ばれるようなのですが、どうも既存のドキュメントのOnMDIActivateが「無効化フラグ」付きで実行されないようで、タブをクリックしてドキュメントを切り替えたときのような動作をしてくれません。 つまり上にも書いたとおりタブをクリックしたときは正常に有効化ならびに無効化状態がトグルされるので、その挙動をプログラマティックにやりたいのです。
No.7
- 回答日時:
質問主です。
修正ですが、ドキュメントを閉じるときというよりは、複数のドキュメントを開いている状態で、前記した方法でアクティブ化を行い、「アプリケーション自体」をクローズボタンなどから終了したときに例外が出ます。
MDIアプリのスケルトンをタブドキュメントスタイルで作り、同様にやってみて同じ例外がアプリケーション終了時に出るので、他の実装の影響ではないようです。
ドキュメントが作成された時点でアクティブ化が一度行われるので本質的に必要のない目的のように思われますが、タブをクリックしたときのOnActivateViewの呼び出しタイミングをエミュレートしたいときにはプログラマティックに行えなければやはり不便かなと思います。
No.5
- 回答日時:
質問者です。
とりあえず別の方針で所望の挙動を実装してみました。
1.ドキュメントテンプレートからドキュメントを列挙
2.各ドキュメントから対応するビューを取得
3.ビューに任意の排他制御処理を記述
という感じで回避できました。
もしMFCクラスが持っている関数などで対応できる解があった場合、ご回答いただければ幸いです。
この回答への補足
前記のとおりCMDIFrameWndが持つMDIActivateはビューを有効化するという目的だけは果たすのですが、ドキュメントクローズ時に例外が出てしまうので使うタイミングが難しいという感想です。
タブスタイルドキュメントを用いている場合に限る話ですが、どのタイミングでビューをプログラマティックに有効化すれば安全にドキュメントのクローズが出来るのかは知りたいところなので、もしご存知の方がおられましたら、ご回答いただければ幸いです。
No.1
- 回答日時:
最近開発から離れていて、自宅に開発環境ないので曖昧だけど
SetActiveViewでなくSetFocusを使ってはいかがですか?
SetFocusとSetActiveViewはキー入力する場所になります。
正確にはちょっと違うけどどうでしょうか?
またはMFC使わずAPIを直接呼ぶとか。
あとなぜOnCreateで呼んでいるのかはわかりません。
他にタイミング(メッセージ)はないのですか?
昔OnDrawでアプリケーションかを作ったことがあります。
どういったアプリケーションを作ろうとしていて、どんなどんな
タイミングでアクティブにしたいのか教えてくれるとよりアドバイスしやすいですよ。
この回答への補足
実はOnCreate以外にもいろいろ試しました。そしてタイミングはつかめていません。タブドキュメントになっているので、タブをクリックすると対応するビューがアクティブ化されるので、この挙動と同じ処理をAPIから叩ければいいのかもしれませんがよくわかっておりません。
あとSetFocusも試したのですがアクティブ化がなされませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Windows 10 WindowsUpdateで再起動を阻止したいです 3 2023/03/15 22:41
- Windows 10 windowsでタスクバーのアイコンをクリックするだけですぐアクティブウィンドウに切り替えられるよう 1 2023/06/11 20:42
- その他(OS) エクスプローラのアクティブウィンドウのタイトルバーに色がつかない 3 2023/07/18 18:34
- その他(プログラミング・Web制作) マウスオーバー→ホイール回転でスクロールできない 2 2022/10/31 10:06
- Excel(エクセル) Excelマクロ(VBA)CELL形式とA1形式の使い分け 6 2022/08/27 23:35
- Excel(エクセル) Excelから複数のWordファイルを操作する方法について教えて頂きたい。 やりたいことは、複数のW 2 2022/07/26 20:11
- 外国株 インデックス投資は、実は罠がある、バンガード社が、ウオール街の ランダムウオーカーとか、宣伝活動した 2 2023/01/06 22:08
- ノートパソコン パソコンを、アップグレードした後に出来た、Cドライブの後に出来た、このドライブは? 3 2023/04/03 17:10
- Windows 10 フォルダの新規作成を必ず「ドキュメント」にする方法 1 2023/06/24 09:08
- Windows 10 パソコン使っていたら下記の表示されたのですが、意味を教えてください。 3 2023/02/15 17:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual Studio 有料と無料比較
-
vb.netでのアプリケーションを...
-
COMポートからのデータ取得方法
-
VC++のプロジェクト指定
-
CSocketのOnReceive()
-
画像をGIF形式にするのってライ...
-
VBとVCとDelphiのよいところ、...
-
Windowsデスクトップアプリケー...
-
キー操作 (WSH:コピー&ペー...
-
派遣社員ですビジュアルベーシ...
-
VB6からACCESSのレポートを印...
-
vba 時間の引き算 例えば 15:00...
-
秒数を入力すると○時間○分○秒と...
-
DirectXを使った動画再生プログ...
-
Delphi 閉じてないウインドウを...
-
Lotus Notesのカレンダーに外部...
-
URLを指定して直接印刷って出来...
-
DAOバージョンの変更
-
次のクラスは登録されていませ...
-
アンインストールできません!
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#で作ったWinアプリをタブレッ...
-
MFC:MDIにおけるビューのアク...
-
VBとVCとDelphiのよいところ、...
-
VS2017で出力DLLのサイズが小さ...
-
アプリケーションとコンテンツ...
-
SQL Server Compactはどこへ!?
-
visual studio community2017 ...
-
VBでSQL-serverをプログラムする
-
ディストリビューションウィザ...
-
MacとWinの互換性
-
【VB2005】.NET Frameworkがイ...
-
TomcatとApacheの使い分け
-
Windows Embedded Compact 7で...
-
この場合、MFCかCLRか
-
VC++2005での他のアプリ操...
-
Windowsデスクトップアプリケー...
-
デザイナの表示(Visual Studio...
-
VirtualBoxって何に利用価値が...
-
意味不明の実行時エラーで困っ...
-
Visual Studio 「AnyCpu」について
おすすめ情報