この記事で扱っていること
- フロントパネルの透明度をショートカットキーで調整する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWのフロントパネルは、プロパティノードを使用することでその透明度を変更することができます。
通常の状態、つまり完全な不透明状態を0として、完全に透明になるのが100という指標があり、その間の数で段階的な調整ができます。
プログラムを組めば自在に操作できますが、ショートカットメニューやメニューバーの項目としてこのフロントパネルの薄さ調整を行うための方法を紹介しています。
なお、ランタイムショートカットメニューの扱いについてようわからんという方はこちらの記事も参考にしてみて下さい。
どんな結果になるか
フロントパネル上の具体的なプログラムは今回特に用意はしていません。あくまで透明にさせる方法に着目するので、フロントパネルにはとりあえずプログラムを終了させるためのブールボタンのみおいています。
指定したショートカットキー(今回は例としてF2を押すとどんどん透明に、F3を押すとどんどん不透明に変えるようにしています)あるいはランタイムのメニューを押して調整できます。
ランタイムショートカットメニューの設定次第で、どのショートカットキーを押せば変えられるかは変更できるのでF2やF3である必要は全くありません。
プログラムの構造
Viの中身に入る前に、カスタマイズしたラインタイムメニューを紹介します。
今回は以下のようにしました。
もしランタイムメニューのカスタマイズの方法を知らないという場合には冒頭で紹介した記事を参考にしてみてください。
そしてこのランタイムメニューを踏まえ、イベントストラクチャでユーザに依るメニュー操作を検出して処理します。
イベントの数は必要に応じて増やせばいいですが、今回は一番シンプルに、停止ボタンを押された場合とランタイムのショートカットメニューが選択された場合のイベント2つだけとします。
停止ボタンを押された場合のイベントは、単にWhileループを止めるだけなので難しくありません。
ショートカットメニューが選択された場合の「メニュー選択(ユーザ)」イベントで、項目タグから文字列を拾い、ケースストラクチャの条件とします。
透明度を上げる場合には+1、下げる場合には-1をして範囲内と強制の関数に渡してからフロントパネルの透明度プロパティに渡します。
なお、このプロパティは本来U8データなのですが、I8にしておくと、値のループ(「0」の状態から-1すると255になる状態)を防ぐことができます。
現在の透明度を表示
上記の方法でも十分目的は達成できるのですが、せっかくなら透明度を変えた際に現在の透明度を表示することで目安としたいですよね。
ただし、メインのVIのフロントパネルにそんな透明度を表す表示器を置くのは何か違う気もするので、別ウィンドウとして表示させることになるのですが、かといってずっと別ウィンドウ(つまりサブVI)として表示させ続けるのも変だなと思います。
こういった設定は、設定が変更されたときには表示されるものの、そのまま変更操作が行われずに一定時間経過すると消えるものがよくあります(Windowsの画面の明るさとか音量調整など)。
なので、現在の透明度を表示させるためのサブVIも「操作されなければ一定時間後に勝手に消える」ようにします。
このような表現としたい場合、簡単に実装できそうに思うかもしれませんが、結構複雑になります。
なぜなら、イベントストラクチャ内にサブVIを置くと一定時間経過で消えるようなことが実現できなくなるため、QMH的な考えで別ループとして機能を設ける必要があるからです。(QMHなんて知らない、という方は別にこの用語のことはひとまず無視しても問題ありません)
プログラムの一例を以下に示しています。が、作りが思ったより複雑になってしまったので、別に透明度を表示させる必要なんてない、という場合には最初に紹介したプログラムで十分だと思います。
とりあえず、透明度を変える仕組み自体は上で紹介したものと変わりません。
ただし、透明度を表示するサブviであるtrans_level.viに命令を出すために「先頭に要素をエンキュー」を使用します。
表示をさせ続けるかどうかというのはサブVIであるtrans_level.viで行っており、ステートマシンのように動作させています。
trans_level.viのフロントパネルには文字列表示器を置いていますが、この表示器の表示サイズはあらかじめ大きくしておいてください。
では、trans_level.viのブロックダイアグラムに移ります。
ステートが4つあるステートマシンの構造をしており、各ステートはキューで移り変わります。このキューには、メインのviからエンキューしていきます。
今回は列挙体を使用しておらず、文字列によってステートを指定しています。
initializeステートでは、このサブVI自体の透明度を指定しています。最初は透明度を100として、完全に表示されない状態としています。
また、このサブVI内のみで使用する、時間を測るためのtimer counterを初期化しています。
次にchangeステートです。このステートはメインviの方から「先頭に要素をエンキュー」された場合にのみ実行されます。
このステートでは、それ以前にどんな値が入っていようとまずはキューを空にして次のcountステートに進みます。
初めてchangeステートが呼び出され場合のみフロントパネルを表示させるようにしています。また表示させる際には透明度を「0」つまり完全に不透明にしています。
また、timer counterを3000としています。これは、3000ミリ秒の間changeステートが実行されない場合にはこのサブviの表示を消すという指示としています。
つまり、何も操作が行われなければ3000ミリ秒でこのサブviは透明になる、という指定をしています。もちろん、3000である必要はありません。
countステートでは、このサブviを表示させておく時間を測っています。
timer counterの値から定数(下の例では100)を引いて、その値が正であればまたcountを繰り返すようにし、負の数になったら次のtransステートに移ります。
待機関数で指定する値と、引き算の引く数は同じにします。
transステートでは、このサブviのフロントパネル透明度を「100」つまり完全に透明にします。
最後にエラーステートです。
この状態は、メインviにて、キュー解放が実行されると実行され、サブviを終了させるべくWhileループを止めます。
メインviからの「割り込み」でchangeステートを実行させたり、自分自身でcountステートを回すような仕組みを設けるのは慣れが必要だと思いますが、まずは紹介したブロックダイアグラムで実装を試してみてください。
なお、このプログラム、最初にキーボードのショートカットキーを押して透明度を変更した場合に、次にまたキーボードで透明度を変更しようとしてもなぜか動きません。その後、ショートカットメニューから透明度を変更したら、後はまたキーボード操作が自由に効くのですが、なぜ動かなくなる時があるのか、わかる方いましたらコメントください・・・。
本記事では、フロントパネルの薄さをショートカットキーで指定する方法を紹介しました。ランタイムショートカットメニューの編集によりデフォルトのメニューでできない様々な操作も(プログラムさえ組めば)可能になるのでそうした一例として参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント