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

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

ただいまの
回答率

90.53%

  • C

    4386questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4304questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Win32 API

    283questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

複数のウィンドウ間のデータ送受信

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 1,674

BeatStar

score 1221

趣味で C/C++ ( Windows API あり ) でやっています。

一つのプロセス ( 実行ファイル ) で 複数のウィンドウを表示することがありますよね。

あれってどうやればいいのでしょうか。

イメージ的なものでいいますと、

メインウィンドウと コンソールのように結果を次々と表示していくウィンドウ, (色の設定や、出力先のディレクトリ等) 設定を行うウィンドウがあるとします。

まず、メインウィンドウに 処理をする画像か その画像(複数) が入ったディレクトリをD&Dします。

ディレクトリならファイルの列挙で... とできますのでここはスルー。

メインウィンドウに対象をD&Dした後に どのように処理するか ( サイズ変更ならどのぐらい小さく (または大きく) するかとか ) をメインウィンドウのコントロールで

設定し、同じウィンドウ内の "処理開始" ボタンを押すと、

結果表示用ウィンドウ メインウィンドウの左側に表示されて,

リストボックスで コンソールでずらっと並んだように表示していく。

で、このウィンドウの下らへんに、プログレスバーがあり、進行度を示すとします。

メインウィンドウのメニューバーの "設定" を選ぶと "設定"ウィンドウが開くとします。

このウィンドウで設定したら 即座に変更されるとします。

こういう風に一つの実行ファイルにある ( または DLL内にある場合でも ) 複数のウィンドウ間で

データの受け渡し等ができたらいいのですが...

この場合って、グローバル変数 ( グローバルオブジェクト, グローバル配列 etc. ) でしか無理でしょうか?

もしグローバルデータを使用せずにできるなら やり方を教えていただきたいです。

あまり慣れていない分野もあるのでできるだけわかりやすくお願い致します。

対象データは構造体を想定しています。 ( 渡したいデータが複数あるので。 )

[環境等]
言語      : C/C++ ( Windows API あり )
コンパイラ: MinGW

宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

checkベストアンサー

0

こんにちは。

もしグローバルデータを使用せずにできるなら やり方を教えていただきたいです。

普通に必要なローカル変数を次々と引き渡していけばよいですよ。単に面倒なだけです。
GUI開発ツールを特に使わずWindows APIで開発するのであれば、例えばSetWindowLongPtr()を使ってWindow毎に構造体をポイントさせるも可能です。
WinMain()関数で必要な構造体を定義し、CreateWindow()後にSetWindowLongPtr()でそこへのポインタを設定するイメージですね。他のウィンドウを生成する際はそのウィンドウのウィンドウ・プロシージャで行う筈ですので、その際に生成したウィンドウへSetWindowLongPtr()することで他のウィンドウへも構造体を渡せます。

なお、必ずしもこれがベストな設計になるとは限りません。グローバル変数を使わないで済む時に使うのは避けるべきですが、ほとんどの関数が共有したい縁の下的な情報を共有する際にグローバル変数を使わないよう無理するのも同様に避けるべきと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

教科書的に答えるなら 「Observerパターンを適用せよ」 でしょうね。

Model-View(or Document-View) アーキテクチャ あるいは 
MVC(Model-View-Controller)モデル と称されていることもあります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

複数のウィンドウをどのように実現するか

一つのプロセス ( 実行ファイル ) で 複数のウィンドウを表示することがありますよね。
あれってどうやればいいのでしょうか。

WindowsAPIで実現するのか、MFC、WPF等を利用するのかによりますが、単にウィンドウを作成すれば良いだけです。
ウィンドウをタップされた時に、どのようなZオーダーにするのか、zオーダは変わらないのか、それぞれのウィンドウが独立に動作するのかなど動作により作成の仕方や、親ウィンドウの設定の仕方が変わるといった感じです。

ウィンドウから別のウィンドウに情報を伝えたい場合も、多くの方法があります。
イベント、一般的なプロセス間通信(大げさですが)、ウィンドウメッセージ(手軽)、コールバックなどを登録しておいて、なんらかの処理が動く時に、そのコールバックを呼び出すなど。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

プロセス間通信なら、パイプを使うか、共有メモリでやり取りするかでしょうね。
または、どこか共通にアクセスするフォルダーを作成しておいて、そこにファイルを使ってやり取りする手もあります。ただ、ファイルのアクセスにオーバーヘッドが掛かるのと、排他処理をうまくやらないとファイルが壊れてしまいます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/21 18:48

    1つのプロセス(アプリ)内での話だったんですね。別アプリと勘違いしてました。
    それなら他の方が書いている通りです。一つのアプリ内なのでデータの受け渡しは簡単です。
    ただ、Windows APIだけでゴリゴリ書くのはコーディングが大変なので、MFCやWTLやwxWidgetsやWin32++などのフレームワークを使ったほうが簡単です。

    キャンセル

0

おそらく、知りたいことのほとんどはWindowsのプログラミング本に書かれていると思います。よく判らないまま断片的に質問するよりも、書籍等で順を追って体系的に学ぶ方が確実です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C

    4386questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4304questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Win32 API

    283questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。