現在私が使っている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/10 00:55
2016/05/10 06:20
2016/05/10 08:02
2016/05/10 08:08
2016/05/10 08:11
2016/05/10 08:34
2016/05/10 08:46
2016/05/10 08:51
2016/05/10 09:04
2016/05/10 09:18