ライブラリ: イージーキャンバス - ページ 14

 
Mighty7:

ありがとうと言わなければならない。これで完璧だ。最高の仕事だ。

最後の質問に答えていただけますか?左右にシフトするのと、上下にシフトするのと、どちらが速いですか?ありがとうございました。

 
Mighty7:

最後の質問に答えてください。左右にシフトするのと、上下にシフトするのと、どちらが速いですか?ありがとうございました。

上下にシフトする方が、左右にシフトするよりもわずかに速い。標準的なFullHDスクリーンウィンドウの平均的なコンピューターでは、シフト全体で約0.3ミリ秒(1/3000秒)かかります。

上下シフトは左右シフトよりわずかに速い。標準的なFullHDウィンドウの平均的なコンピュータでは、シフト全体に約0.3ミリ秒(1/3000秒)かかります。

 
Nikolai Semko:

シフトダウンとシフトアップは、左右よりもわずかに速い。標準的なFullHDスクリーンウィンドウの平均的なコンピュータでは、シフト全体に約0.3ミリ秒(1/3000秒)かかります。

上下シフトは左右シフトよりわずかに速い。標準的なFullHDウィンドウの平均的なコンピュータでは、シフト全体に約0.3ミリ秒(1/3000秒)かかります。

ありがとうございました。

 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }

ここで何度か0による除算が出たが、ターミナルを再起動すると再現しない )

 
Oleksii Chepurnyi:

ここで何度か0による除算が出たが、ターミナルを再起動すると再現しない )


、とりあえずこのように置き換えてください:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (W.dx_pix==0) return;
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

いや、こっちの方がいい:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
残念ながらQBのバージョンを更新することができない。何かがまた壊れてしまった。
ファイル:
iCanvas.mqh  52 kb
 

4kと8kのモニターを使ったユニバーサル・ソリューションを見るのは興味深い。

例えば、矩形を描き、その上に2つのボタンと2つの入力フィールドを描く。ボタンはそれぞれピクセル単位のオブジェクトです。

ピクセル単位であれば、4k解像度では入力フィールドを除いてすべてが2分の1に縮小される。

しかし、キャンバス全体を自動的に2倍に変換すれば、どのような画面解像度でも、すべてが通常のモニターと同じように表示されます。

もう1つの問題は、Windowsの設定でフォントを拡大する(標準の入力フィールドが拡大される)ユーザーがいることです。

そこで、キャンバス・シートのピクセル化をフォント・サイズに応じた倍率で変更するという、さらに普遍的な解決策があります。


主な条件は、通常のフルHDモニター上で通常のピクセル寸法で描画することです。解決策は

1. シートのスケールを厳密にx2(4Kの場合)、x4(8Kの場合)に変更する。

2. フォントサイズに関連する動的な乗数でシートを拡大縮小する。


何のために。ダッシュボードや取引パネルなど、ピクセル単位でオブジェクトが描画されるもののため。

 
Vitaliy Kuznetsov:

4kと8kのモニターを使ったユニバーサル・ソリューションを見るのは興味深い。

例えば、矩形を描き、その上に2つのボタンと2つの入力フィールドを描く。ボタンはそれぞれピクセル単位のオブジェクトです。

もしピクセル単位であれば、4k解像度では入力フィールド以外はすべて2分の1に縮小される。

しかし、キャンバス全体を自動的に2倍に変換すれば、どのような画面解像度でも、すべてが通常のモニターと同じように見えるようになる。

また、Windowsの設定でフォントを大きくする(標準入力フィールドが大きくなる)ユーザーがいることも問題かもしれません。

そこで、フォント サイズに依存する乗数を使用して、キャンバス シートのピクセル化を変更するという、さらに普遍的な解決策があります。


主な条件は、通常のフル HD モニターで、通常のピクセル寸法で描画することです。解決策を模索中です:

1. シートのスケールを厳密にx2(4K時)、x4(8K時)に変更する。

2. フォントサイズに連動した動的倍率でシートを拡大縮小する。


何に使うか。ダッシュボードや取引パネルなど、ピクセル単位でオブジェクトが描画されるものに。

解決の鍵はTERMINAL_SCREEN_DPI です。
ここに複雑さはない。私は長い間、すべてを実装してきた。
デモをしている暇はない。
処理が理解できない場合は、JSでどのように実装されているかググってください。
 
Nikolai Semko:
解決の鍵はTERMINAL_SCREEN_DPI である。
ここに複雑さはない。私は長い間、すべてを実装してきた
デモの例を見ている暇はない。
もしこのプロセスを理解するのが難しければ、JSでどのように実装されているかググってみてください。

はい、後で検索して見つけました。ありがとう。ここに例があります -https://www.mql5.com/ja/docs/constants/environment_state/terminalstatus

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
  • www.mql5.com
Состояние клиентского терминала - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nikolai Semko #:
最新バージョン1.12

キャンバスをオブジェクトに変換することは可能ですか?例えば、キャンバスの矩形を標準オブジェクトの矩形に変換して管理するといったことです。

 
Facundo Laje # :

キャンバスをオブジェクトに変換することはできますか?例えば、キャンバスの矩形を標準オブジェクトの矩形に変換して管理するとか。

文字通り矩形オブジェクトに変換するのであれば、それはできません。
キャンバスもオブジェクトです。
キャンバス・オブジェクトをプログラムで矩形オブジェクトに「変換」して、その中身が移動したり拡大縮小したりすることができるだけです。
視覚的には、四隅に小さな四角がある矩形オブジェクトのように見えるかもしれません。しかし、これを実装できるプログラマーは、このコミュニティでは私を含めて数人しかいないだろう。

もし矩形の内部コンテンツの変換について話しているのであれば。単純な塗りつぶしや空の矩形のことなら、どんなプログラマーでもできる。