Wingdingsフォントで表示できない絵文字がある

みなさん、こんにちは。

先日、出版社より「FXメタトレーダー実践プログラミング」の増刷の連絡がありました。あの本もMT4のbuild600以降には対応していないので、修正したかったのですが、修正する時間がないということで、そのまま増刷になりました。紙の本だと、いったん出版してしまうと、なかなか修正は難しいです。今後は電子版も検討したいと思っています。

ところで表題の件ですが、本書147ページにテキストのオブジェクトをチャートの決まった位置に表示させるプログラムがあります。ShowMTF0.mq4というプログラムで、下の図のようにチャートの隅に文字列と矢印の記号が表示されます。

 image1

この矢印の記号も実は文字の一種で、ラベルオブジェクトというテキストを表示させるオブジェクトを作成して、フォントをWingdingsにしたものです。

ObjectCreate(“Label3”, OBJ_LABEL, 0, 0, 0);
ObjectSet(“Label3”, OBJPROP_CORNER, 3);
ObjectSet(“Label3”, OBJPROP_XDISTANCE, 33);
ObjectSet(“Label3”, OBJPROP_YDISTANCE, 1);
ObjectSetText(“Label3”, CharToStr(221), 16, “Wingdings”, Blue);

通常は、ObjectSetText()の2番目の引数に表示させたい文字列を指定するのですが、特定のコードに対応する文字を表示させたい場合、CharToStr()という関数を使って、表示させたいコード番号を入れることもできます。

Wingdingsというフォントは、コードの終わりの方に矢印の記号があるのですが、224番以降のコードを指定すると、対応する絵文字が表示されません。こんな感じになってしまいます。

Image2

先日、読者の方から何とかならないものかという質問をいただいたので、ちょっと調べてみました。

224は16進数でE0なので、当初はE0~FFで始まる文字はユニコードで利用されるから表示できないのかと考えました。しかし、海外のWindows VPS上でMT4を実行した場合、正しく表示されたので、ユニコードの問題でなはく、Windowsの問題ではないかということになりました。

英語版WindowsだとOKで、日本語版WindowsだとNGということなので、こんな感じじゃないかと推測してます。

E0~FFのコードは、欧米ではアルファベットに色々な記号が付いた文字を表すために1バイト単独として利用されています。しかし、日本語では、1バイト単独としては使われておらず、2バイト文字の一部として使われています。そのために、日本語Windowsだと強制的に2バイトに変えられてしまって、違う絵文字が二つ表示されてしまったのではないか、ということです。この辺はあまり詳しくないので違ってるかもしれません。

ちなみにラベルオブジェクトでなく、アローオブジェクトとして作成すれば、224番以降の絵文字も表示可能です。

ObjectCreate(“Label3”, OBJ_ARROW, 0, 0, 0);
ObjectSet(“Label3”,OBJPROP_ARROWCODE, 224);
ObjectSet(“Label3”,OBJPROP_TIME1, Time[1]);
ObjectSet(“Label3”,OBJPROP_PRICE1, Close[1]);

ただし、この場合はチャートの任意の座標ではなく、時刻―価格座標の位置にしか表示できないので、チャート上の決まった場所に表示させるのは難しいかもしれません。

他には、表示させたい絵文字をbmpなどのイメージファイルとして作っておけば、ビットマップラベルというオブジェクトで、チャート上の任意の座標に表示させるということができると思います。ただし、ビットマップラベルはMT4のbuild600以降に導入された機能なので、MQL5の関数を使う必要があります。プログラムについては、別の機会に紹介します。



コメントは受け付けていません