押して離すと戻るタイプのボタンに使う
MT4にはオブジェクトを使って簡易的なフォームを作ることが可能です。
その中にボタンがあるのですが、MT4のボタンは押して離しても押しっ放しの状態になるタイプのボタンです。
スイッチ型と言えばニュアンス伝わりますでしょうか?
そのボタンがON状態なのかOFF状態なのかを制御しているのがOBJPROP_STATEプロパティです。
trueを設定すればON状態になり、見た目では凹んでいる状態になります。
逆にfalseを設定すればOFF状態になり、見た目では押されていない元の状態になります。
一般的にソフトウェアのボタンって、押している間は凹んでいるけど、離したら元に戻るタイプだと思うんですよね。
その場合、ボタン押下時の処理後にOBJPROP_STATEをfalseに設定することになります。そうしないと凹みっ放しのままになっちゃいます。
ただ、OBJPROP_STATEを即座にfalseに設定しちゃうと、押した感が出ません。
実際には凹んで元に戻るという一連の動きが実行されているのですが、早すぎて見えないわけです。
孫悟空のパンチが早すぎて見えないのと一緒ですね!
そこでSleep関数の登場です。
Sleep関数は「何もしない」ということをしてくれる関数です。
これを使えば元に戻すタイミングをワンテンポ遅らすことが可能です。
そうすることで、押して戻った感を演出でき、ユーザーが戸惑わなくて済むわけです。
非常に地味ですが、神は細部に宿るということです。
余談ですが、違和感を何も覚えないシステムやソフトウェアというのは実は極めて洗練された質の高いものだと思ってください。
最後にサンプルコードを掲載しておきます。
//+------------------------------------------------------------------+ //| Chart Event function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(id == CHARTEVENT_OBJECT_CLICK){ if(sparam == "オブジェクト名"){ // ボタンが押されている状態か? if(ObjectGetInteger(0, sparam, OBJPROP_STATE)){ // ボタン押下時の処理をここに記載 // ボタンを押して離した雰囲気を出すための待機時間 Sleep(100); // 押されていない状態に戻す ObjectSetInteger(0, sparam, OBJPROP_STATE, false); } } } }