・環境
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も見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
MFC ポップアップメニューのチェック表示について
C言語・C++・C#
-
-
4
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
5
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
6
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual Studio 有料と無料比較
-
アプリケーションとコンテンツ...
-
VBとVCとDelphiのよいところ、...
-
vba 時間の引き算 例えば 15:00...
-
アウトルックが起動しているか...
-
「読み込み違反」が起きたとき...
-
Designer.vbは直接コードをいじ...
-
VBAでOutlookを終了させたい Ex...
-
スプレッド(Spread 6) で縮小...
-
意味不明の実行時エラーで困っ...
-
VBSでExcelのUserFormをエクス...
-
う~ん…。
-
印刷ダイアログを表示させない方法
-
VBAでArrayListを使う為の「msc...
-
Visual Studio 「AnyCpu」について
-
64bitで作ったEXEを32bitで起動...
-
C#VB、exeに埋め込んだexeの実行
-
excel vbaから実行するexe実行...
-
VBで実行中のEXEファイルの情報...
-
AppActivateについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Visual Studio 有料と無料比較
-
visual studio community2017 ...
-
VS2017で出力DLLのサイズが小さ...
-
vb.net2019 でFORMが出ない
-
VBとVCとDelphiのよいところ、...
-
ダイアログボックスのタブコン...
-
MFC:MDIにおけるビューのアク...
-
C#で作ったWinアプリをタブレッ...
-
SQL Server Compactはどこへ!?
-
Windowsデスクトップアプリケー...
-
vb.netでのアプリケーションを...
-
アプリケーションとコンテンツ...
-
VC++6.0 で 16bit アプリケーシ...
-
Opera12のCSSハック
-
vba 時間の引き算 例えば 15:00...
-
Designer.vbは直接コードをいじ...
-
Visual Studio 「AnyCpu」について
-
アウトルックが起動しているか...
-
「読み込み違反」が起きたとき...
-
意味不明の実行時エラーで困っ...
おすすめ情報