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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Win32 API

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

C++

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

Q&A

解決済

5回答

4699閲覧

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

BeatStar

総合スコア4958

C

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

Win32 API

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

C++

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

0グッド

0クリップ

投稿2017/02/17 01:36

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

宜しくお願い致します。

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

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

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

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

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

guest

回答5

0

ベストアンサー

こんにちは。

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

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

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

投稿2017/02/17 12:45

Chironian

総合スコア23272

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

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

0

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

投稿2017/02/17 11:07

catsforepaw

総合スコア5938

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

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

0

プロセス間通信なら、パイプを使うか、共有メモリでやり取りするかでしょうね。

投稿2017/02/17 08:34

PineMatsu

総合スコア3579

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

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

PineMatsu

2017/02/21 09:48

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

0

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

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

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

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

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

投稿2017/02/17 03:17

t_obara

総合スコア5488

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

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

0

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

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

投稿2017/02/17 01:43

編集2017/02/17 01:59
episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問