複数のウィンドウ間のデータ送受信
解決済
回答 5
投稿
- 評価
- クリップ 0
- VIEW 3,428
趣味で C/C++ ( Windows API あり ) でやっています。
一つのプロセス ( 実行ファイル ) で 複数のウィンドウを表示することがありますよね。
あれってどうやればいいのでしょうか。
イメージ的なものでいいますと、
メインウィンドウと コンソールのように結果を次々と表示していくウィンドウ, (色の設定や、出力先のディレクトリ等) 設定を行うウィンドウがあるとします。
まず、メインウィンドウに 処理をする画像か その画像(複数) が入ったディレクトリをD&Dします。
ディレクトリならファイルの列挙で... とできますのでここはスルー。
メインウィンドウに対象をD&Dした後に どのように処理するか ( サイズ変更ならどのぐらい小さく (または大きく) するかとか ) をメインウィンドウのコントロールで
設定し、同じウィンドウ内の "処理開始" ボタンを押すと、
結果表示用ウィンドウ メインウィンドウの左側に表示されて,
リストボックスで コンソールでずらっと並んだように表示していく。
で、このウィンドウの下らへんに、プログレスバーがあり、進行度を示すとします。
メインウィンドウのメニューバーの "設定" を選ぶと "設定"ウィンドウが開くとします。
このウィンドウで設定したら 即座に変更されるとします。
こういう風に一つの実行ファイルにある ( または DLL内にある場合でも ) 複数のウィンドウ間で
データの受け渡し等ができたらいいのですが...
この場合って、グローバル変数 ( グローバルオブジェクト, グローバル配列 etc. ) でしか無理でしょうか?
もしグローバルデータを使用せずにできるなら やり方を教えていただきたいです。
あまり慣れていない分野もあるのでできるだけわかりやすくお願い致します。
対象データは構造体を想定しています。 ( 渡したいデータが複数あるので。 )
[環境等]
言語 : C/C++ ( Windows API あり )
コンパイラ: MinGW
宜しくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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
プロセス間通信なら、パイプを使うか、共有メモリでやり取りするかでしょうね。
または、どこか共通にアクセスするフォルダーを作成しておいて、そこにファイルを使ってやり取りする手もあります。ただ、ファイルのアクセスにオーバーヘッドが掛かるのと、排他処理をうまくやらないとファイルが壊れてしまいます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
おそらく、知りたいことのほとんどはWindowsのプログラミング本に書かれていると思います。よく判らないまま断片的に質問するよりも、書籍等で順を追って体系的に学ぶ方が確実です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる