« モナザイトをNaIの横に置くか上に置くか | トップページ | Cosmo-Z Scope v0.8.3.0をリリース »

2022.03.08

Cosmo-Z Scopeで配色を変えられるようにする

Cosmo-Z Scopeはオシロスコープをイメージしているので黒い背景に波形を描いていきますが、逆に白い背景に描きたいときもあります。例えば、印刷するときとか。

そこで、画面の配色を変えられるようにしようとしているのですが、これがなかなか難しいことに気が付きました。

まず、だいたいのWindowsのアプリは下の図のような構成になっていると思います。

Kouzou1

下の層にはデバイスドライバやラッパ、独自形式のデータファイルを読み書きするライブラリや、数値計算など「窓のないライブラリ」があります。

その上に、メインのアプリとは別に開くフォームや、MDI子ウィンドウのクラス、ダイアログなど「窓を持った部品」や、Windowsで使う独自コンポーネント(ツマミとか)が並列して存在します。

そして、最上位にはメインのアプリがあります。

 

問題はライブラリ間で参照できるかです。

 

アプリの規模が大きくなってくると部品ごとにDLLに分けると思うのですが、そうするとお互いのプログラム間では自由に関数を呼び出すことができなくなります。Visual Studioでは「参照の追加」をしてプロジェクトを追加してあげて初めて他のDLLの中の関数を呼べることになります。

しかし、上から下の関数は呼べるけれども、下から上は呼べません。

Sanshou

メインフォームは最上位に君臨するので、メインフォーム中の関数をライブラリや子フォームの中から呼び出せないことになります。

例えば、

「ダイアログの中で『ボタン』を押すと、メインフォームの挙動が変わる」

ということをするには、MainFormにdelegateを用意してそのdelegateをダイアログに登録して、mainformに何かを通知したいときにはそのdelegateを呼び出します。ただしdelegateは面倒です。delegateの型を作ってからdelegateの変数(?)に値を代入したりとかやらねばならず、名前を付けるのにも困ります。

 

では、アプリの配色のような構造体的なデータをどこに保存すればよいのでしょう。

メインフォームにデータを格納するのは、下位の層から上位の層へはアクセスできないので良くありません。

そこで、考えたのは、最も下位の層にアプリで使うデータを格納したりする構造体を置くということです。

Baselib

こうすればフォームやダイアログ、メインフォームのすべての部分からアクセスすることができます。

色のパレットをこういう最下層に置くことで、すべてのフォームで統一の取れた配色を使えるようになりました。

下の図は暗い背景のオシロ風表示。

Wave_dark

これを明るくすると、

Wave_light_20220313173101

 

放射線のスペクトラムも、暗い背景と

Mca_dark

明るい背景

Mca_light

こういうダイアログで選択できます。

Palette_select

どちらの色がお好みですか?

 

なお、上のダイアログで色の部分を突っつくと色を変更できます。

Color_palette

 

|

« モナザイトをNaIの横に置くか上に置くか | トップページ | Cosmo-Z Scope v0.8.3.0をリリース »

コメント

コメントを書く



(ウェブ上には掲載しません)




« モナザイトをNaIの横に置くか上に置くか | トップページ | Cosmo-Z Scope v0.8.3.0をリリース »