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

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

ただいまの
回答率

90.48%

  • VC++

    137questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

  • モーダルダイアログ

    13questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,210

FENREL

score 13

前提・実現したいこと

前提

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

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

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

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

イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

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

sleepなどではできません。

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

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

試したコード

private class OwnerHandle : IWin32Window
{
    public IntPtr Handle {get;}

    public OwnerHandle(IntPtr iHandle)
    {
        this.Handle = iHandle;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    var owner = new OwnerHandle(this.Handle);    // 別スレッドではthis.Handleを呼び出せないのでこうします。
    Task.Run(() =>
    {
        var form3 = new Form3();
        form3.Show(owner);
        Application.Run(form3);
    });
}

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

using namespace System::Threading::Tasks;
// ↑上の方に並んでいるusingにこれを追加してください

private: ref class ShowForm3 : public IWin32Window
{
    IntPtr mHandle;

public:
    virtual property IntPtr Handle
    {
        IntPtr get()
        {
            return this->mHandle;
        }
    }

    ShowForm3(IntPtr iHandle)
        : mHandle(iHandle)
    {}

    void Show()
    {
        MyForm3^ form3 = gcnew MyForm3();
        form3->Show(this);
        Application::Run(form3);
    }
};

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    ShowForm3^ showForm3 = gcnew ShowForm3(this->Handle);
    Task::Run(gcnew Action(showForm3, &ShowForm3::Show));
}

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/10 09: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<>を使ってみたら、使えました。コンパイラもちゃんとアップデートされているんですね。

    キャンセル

  • 2016/05/10 15:20

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

    キャンセル

  • 2016/05/10 17:02

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

    とりあえず、C++/CLI版でも同じことができることが確認できたので、そのコードも載せますね。

    キャンセル

  • 2016/05/10 17:08

    catsforepawさん

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

    キャンセル

  • 2016/05/10 17:11

    FENREL さん

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

    キャンセル

  • 2016/05/10 17:34

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

    キャンセル

  • 2016/05/10 17:46

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

    キャンセル

  • 2016/05/10 17:51

    横から失礼します。

    Taskクラスは、.NET 4.0からの機能で、Visual Studio 2008は.NET 3.5のようです。
    ↓下記記事をみると、Visual Studio 2008で.NET 4.0を使うのは無理っぽい感じです。
    http://stackoverflow.com/questions/1836410/can-i-develop-for-net-framework-4-in-visual-studio-2008

    キャンセル

  • 2016/05/10 18:04

    Chironian さん

    情報ありがとうございます。そうなると、Threadクラスを使うしかないですね。Taskの方が簡単だと思ってそれにしたのですが……。
    Visual Studioのバージョンを上げる方が簡単かもしれません。

    FENREL さん

    もしVisual Studio 2008でないと困るということでなければ、Visual Studioのバージョンを上げることをお勧めします。やはりVisual Studio 2008だと古すぎて情報を提供する側も戸惑ってしまいます。

    キャンセル

  • 2016/05/10 18:18

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

    キャンセル

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    wordpress 投稿一覧にある文章の表示範囲

    初めてwordpressを使いました。HTMLやCSSの基本はわかりますが、それ以外あまりわかりません。 図のように投稿一覧で、各投稿の文章を全て表示させるのではなく最初の2~3

  • 解決済

    Virtual Box上でCent OSを実行するための設定方法がわからない

    Virtual BoxでCent OSを実行するための設定方法を教えてください。 VirtualBox 5.0.10 for Windows hosts CentOS-7-x86

  • 解決済

    Xamarin StudioのAuto Layoutについて

    Xamarin Studioで幅は画面と同じ大きさ、高さが画面の幅に対して50%のViewを作りたいのですが、どのように行ったら良いのでしょうか?

  • 解決済

    cssで指定したfont-sizeの実サイズを知りたい

    例えばfont-size: 5vwと指定した場合、これをpxに換算したら何ピクセルになるのか知りたいのですが、Chromeの開発者ツールか何かで知る方法はないでしょうか?

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 解決済

    主ドメインを設定したサーバー以外のサーバーにサブドメインを設定したい

    お世話になります。 すみません。 今、2つのサーバーで1ドメイン2サイト(サブドメイン含む)を制作するにあたり、 事前調査を行い上司に報告が必要となっております。 サーバーにお詳し

  • 解決済

    unity-chanモーション

    unity-chanをmixamoを使ってモーション数を 増やしたいのですが仕方がいまいちわかりません。 現在したのが、 1mixamoにfbxデータをアップデートする 2mi

  • 解決済

    Game Jam Menu Template での画面遷移

     前提 現在Unityで3Dのすごろく(風)ゲームを作成しています。 Game Jam Menu Template を使ってタイトル画面を作成しています。  実現したいこと タ

同じタグがついた質問を見る

  • VC++

    137questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

  • モーダルダイアログ

    13questions

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