質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
モーダルダイアログ

モーダルダイアログとは、ユーザーに重要な情報を表示するときに用いられる視覚的なダイアログのことを指します。これらのダイアログは他のすべてのコンテンツの上に表示され、ユーザーの入力を受けるまでアプリケーションフローは停止されます。

Q&A

1回答

8495閲覧

モーダルフォーム表示中に他のフォームを操作したい

FENREL

総合スコア19

モーダルダイアログ

モーダルダイアログとは、ユーザーに重要な情報を表示するときに用いられる視覚的なダイアログのことを指します。これらのダイアログは他のすべてのコンテンツの上に表示され、ユーザーの入力を受けるまでアプリケーションフローは停止されます。

0グッド

0クリップ

投稿2016/05/09 09:28

###前提・実現したいこと

前提

VC++ 2008 でフォームを作っています。

Form1がメイン画面
Form2がモーダルフォーム
Form3がモードレスフォーム
という構成でフォーム画面を作っています。

実現したい事
メイン画面からForm3(モードレスフォーム)を表示
その後Form2(モーダルフォーム)を表示
この時にForm3(モードレスフォーム)を操作できるようにしたいです。
(イメージのモードレスフォームの「閉じる」を押せるようにしたいです)

sleepなどを使えばできるのでしょうか?

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

現在私が使っているVisualStudio 2015ではC++でのフォームアプリは廃止されていて、VisualStudio 2008はインストールしていないので試せません。とりあえずC#でフォームアプリを作って同じようなことをやってみたところ、確かに先に作ったモードレスが操作できなくなりますね。おそらく多くの場合はその方が都合が良いので、あえてそうしているのだと思います。

sleepなどを使えばできるのでしょうか?

sleepなどではできません。

いろいろ試してみて、無理矢理ではありますが、モードレスの方を「別スレッド」で開けばモーダルフォームを開いた後でも操作できることが判りました。

C#で試したのでコードもC#ですが、C++/CLIでも同じようにしてできるはずです。

試したコード

C#

1private class OwnerHandle : IWin32Window 2{ 3 public IntPtr Handle {get;} 4 5 public OwnerHandle(IntPtr iHandle) 6 { 7 this.Handle = iHandle; 8 } 9} 10 11private void button1_Click(object sender, EventArgs e) 12{ 13 var owner = new OwnerHandle(this.Handle); // 別スレッドではthis.Handleを呼び出せないのでこうします。 14 Task.Run(() => 15 { 16 var form3 = new Form3(); 17 form3.Show(owner); 18 Application.Run(form3); 19 }); 20}

追記
上記コードのC++/CLI版です。

C++

1using namespace System::Threading::Tasks; 2// ↑上の方に並んでいるusingにこれを追加してください 3 4private: ref class ShowForm3 : public IWin32Window 5{ 6 IntPtr mHandle; 7 8public: 9 virtual property IntPtr Handle 10 { 11 IntPtr get() 12 { 13 return this->mHandle; 14 } 15 } 16 17 ShowForm3(IntPtr iHandle) 18 : mHandle(iHandle) 19 {} 20 21 void Show() 22 { 23 MyForm3^ form3 = gcnew MyForm3(); 24 form3->Show(this); 25 Application::Run(form3); 26 } 27}; 28 29private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) 30{ 31 ShowForm3^ showForm3 = gcnew ShowForm3(this->Handle); 32 Task::Run(gcnew Action(showForm3, &ShowForm3::Show)); 33}

追記
Threadクラス版です。
上記コードのTask::Run~部分を以下のコードに置き換えると動くと思います。usingはSystem::Threadingに変えてください。

C++

1Thread^ thread = gcnew Thread(gcnew ParameterizedThreadStart(showForm3, &ShowForm3::Show)); 2thread->Start();

投稿2016/05/09 14:58

編集2016/05/10 09:20
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/05/10 00:55

catsforepawさん。 Visual studio 2015 update2でもまだC++/CLIのWindows Formアプリ作れますよ。 http://hisaming.blog.fc2.com/blog-entry-7.html また、「ファイル→新規作成→プロジェクト→オンライン→テンプレート→Visual C++→Windows フォーム」と選択していけば、テンプレートも一応存在してます。 試しにstd::unique_ptr<>を使ってみたら、使えました。コンパイラもちゃんとアップデートされているんですね。
catsforepaw

2016/05/10 06:20

Chironian さん。 情報ありがとうございます。知りませんでした。
catsforepaw

2016/05/10 08:02

C++/CLIでフォームアプリを作っていじってみましたが、慣れないせいもあって思うように行きませんね。サンプルコードと同じことをするのにも少々手こずりました。特にラムダ式が使えないのは痛いです。 とりあえず、C++/CLI版でも同じことができることが確認できたので、そのコードも載せますね。
FENREL

2016/05/10 08:08

catsforepawさん 丁寧な回答、ありがとうございます。 この追記コードはForm1に打ち込めばよいのですか?
catsforepaw

2016/05/10 08:11

FENREL さん そうです。Form1のクラス内に書いてください。
FENREL

2016/05/10 08:34

catsforepawさん コードを打ち込んでみたのですが・・・、 using~Task; はメンバではありません とエラーが出ました(-_-;)
catsforepaw

2016/05/10 08:46

おそらくVisual Studio 2008の.NET Frameworkのバージョンが古いのかもしれません。 Taskクラスのリファレンスを見たところ、.NET Framework 4までしかさかのぼれないので、対応しているのはそれ以降ということでしょう。 .NET Frameworkのバージョンを上げることはできませんか?
catsforepaw

2016/05/10 09:04

Chironian さん 情報ありがとうございます。そうなると、Threadクラスを使うしかないですね。Taskの方が簡単だと思ってそれにしたのですが……。 Visual Studioのバージョンを上げる方が簡単かもしれません。 FENREL さん もしVisual Studio 2008でないと困るということでなければ、Visual Studioのバージョンを上げることをお勧めします。やはりVisual Studio 2008だと古すぎて情報を提供する側も戸惑ってしまいます。
catsforepaw

2016/05/10 09:18

Threadクラス版を追記します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問