resourceを使ってMQL4でデフォルト以外の音楽や画像を使う方法

新年明けましておめでとうございます。 fx-on.comエンジニアの岩淵です。 年末年始で乱れた生活リズムが治らず、 苦しい思いをしながら出社しております。 さて、EAやインジケーターのUIをこだわってくると、 オリジナルの音楽や画像を表示したくなる時があるかと思います。 今日はそんなときに使える方法をご紹介いたします。 音楽ファイルはSoundsフォルダへ保存することでプログラムからPlaySounds関数で実行する方法が一般的です。 しかしこの方法ですとex4ファイルとは別で音楽ファイルも配布する必要があり、 利用者の設定の手間が増えるという欠点があります。 今回紹介する#resourceを使う方法ですと配布するファイルはex4だけで済み、 尚且つオリジナルのファイルを使用することが可能です。

画像ファイルを使う方法

準備

まずは使用したい画像を用意します。 画像はビットマップ形式(拡張子.bmp)で用意して下さい。 この時に1つ注意点があります。 ビットマップには幾つか種類がありますが、24ビット ビットマップ形式で画像を用意する必要があります。 画像が用意出来たらMT4でデータフォルダを開き、Imagesフォルダへ保存します。 今回はArrowUp.bmpとArrowDown.bmpを用意しましたのでこちらを使用した例を紹介していきます。

コード

まずはソースコードの上部(propertyの下あたり)に以下のコードを書きましょう。
#resource "\\Images\\ArrowUp.bmp"
このように書くことでコンパイル時にImagesフォルダ内のArrowUp.bmpファイルがex4内に取り込まれます。 次に取り込んだファイルの呼び出し方です。 画像ファイル名を呼び出したいタイミングで、
"::Images\\ArrowUp.bmp"
のように書きます。 #resourceで指定したファイル名の最初の2文字を、 コロン2つに変えるだけでOKです。 今回はデフォルトのBmpButton.mqhからCBmpButtonクラスを呼び出し、 用意した2つの画像を使ったボタンを作成します。
#include <Controls\BmpButton.mqh>
CBmpButton btn;

int OnInit(){
   btn.Create(0, "btn", 0, 38, 280, 90, 332);
   btn.BmpNames("::Images\\ArrowUp.bmp",
                "::Images\\ArrowDown.bmp");

   return(INIT_SUCCEEDED);
}

音楽ファイルを使う方法

準備

音楽ファイルは拡張子が.wav形式で用意して下さい。 用意出来たらMT4のデータフォルダを開き、 MQLフォルダ内にSoundsフォルダを作成してこの中に保存します。 画像ファイルと同様にImagesフォルダに保存しても大丈夫ですが、 今回の例ではファイル形式ごとにフォルダを分けることにしました。 btn_click.wavというファイル名で用意しました。

コード

画像ファイルと同様に読み込みます。
#resource "\\Sounds\\btn_click.wav"
音楽を再生する場合には、PlaySound関数の引数に読み込んだファイル名を指定します。 ファイル名は画像ファイルの場合と同様にコロン2個から始めます。
PlaySound("::Sounds\\btn_click.wav");
BmpButtonがクリックされた際に音を鳴らすようにしてみました。
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam){
   if(id == CHARTEVENT_OBJECT_CLICK){
      if(sparam == "btn"){
         PlaySound("::Sounds\\btn_click.wav");
      }
   }
}

まとめ

最終的には以下のコードとなります。
#property strict
#property indicator_chart_window

#resource "\\Images\\ArrowUp.bmp"
#resource "\\Images\\ArrowDown.bmp"
#resource "\\Sounds\\btn_click.wav"

#include <Controls\BmpButton.mqh>
CBmpButton btn;

int OnInit(){
   btn.Create(0, "btn", 0, 38, 280, 90, 332);
   btn.BmpNames("::Images\\ArrowUp.bmp",
                "::Images\\ArrowDown.bmp");

   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason){
   btn.Destroy(reason);
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]){
   
   return(rates_total);
}

void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam){
   if(id == CHARTEVENT_OBJECT_CLICK){
      if(sparam == "btn"){
         PlaySound("::Sounds\\btn_click.wav");
      }
   }
}
チャートに表示してみると以下のようになります。 記事ではお伝えできませんが、ボタンをクリックすると音楽も再生されております。 作成したex4ファイルは是非別のMT4へ移してみてください。 bmpファイルやwavファイルを保存してないMT4でも、 ex4ファイル1つで表示・再生ができているのが分かるかと思います。
商号 株式会社ゴゴジャン
金融商品取引業の登録番号 関東財務局長(金商)第1960号
加入協会 一般社団法人 日本投資顧問業協会
商号 株式会社ゴゴジャン
金融商品取引業の登録番号
関東財務局長(金商)第1960号
加入協会 一般社団法人
日本投資顧問業協会
金融庁日本投資顧問業協会証券・金融商品あっせん相談センター証券取引等監視委員会

Copyright © 2024 GogoJungle Inc. All Rights Reserved.