記事"グラフィカルインターフェイスXI:レンダリングされたコントロール(ビルド14.2)"についてのディスカッション - ページ 2

 
Artyom Trishkin:

また、同時に別の質問もあります。透明度のあるウィンドウの背景にテキストラベル(CTextLabel)を描画すると、ラベルは不透明な背景に描画され、Alpha()メソッドに反応せず、見栄えがよくありません.ラベルの背景も透明にすることは可能でしょうか?

記事より

「このバージョンでの透明化は背景の塗りつぶしとフレームにのみ適用されます。テキストや画像は、設定されたアルファチャンネル値では完全に不透明でシャープなままです。"

 
Artyom Trishkin:

こんにちは。Tolさん、ウインドウに区切り線を引く方法が例題にありませんでした。

indexとは どういう意味ですか?

どのようなindexパラメータ、何のindexを渡せばいいのでしょうか?

そして同時にもう一つ質問です。透明度のあるウィンドウの背景にテキスト・ラベル(CTextLabel)を描くとき、ラベルはその不透明な背景に描かれ、Alpha()メソッドに反応せず、見栄えがよくありません.ラベルの背景も透明にすることは可能ですか?


インデックスのパラメータは存在しないはずです。削除するのを忘れていました。今はどんな値でも渡すことができます。次回のアップデートでこのパラメータを削除します。

//+------------------------------------------------------------------+
//| 区切り線を作る|
//+------------------------------------------------------------------+
bool CProgram::CreateSepLine1(const int x_gap,const int y_gap)
  {
//--- ウィンドウ・ポインタを保存する
   m_sep_line1.MainPointer(m_window);
//--- 寸法
   int x_size=2;
   int y_size=72;
//--- プロパティ
   m_sep_line1.DarkColor(C'150,150,150');
   m_sep_line1.LightColor(clrWhite);
   m_sep_line1.TypeSepLine(V_SEP_LINE);
//--- 要素の作成
   if(!m_sep_line1.CreateSeparateLine(0,x_gap,y_gap,x_size,y_size))
      return(false);
//--- ベースの要素へのポインタを追加する。
   CWndContainer::AddToElementsArray(0,m_sep_line1);
   return(true);
  }

//---

アルチョム・トリシキン:

...

また、同時に別の質問も: 透明度のあるウィンドウの背景にテキストラベル (CTextLabel) を描画する場合、ラベルはそれ自身の不透明な背景に描画され、Alpha() メソッドに反応せず、見栄えがよくありません.ラベルの背景にも透過性を持たせることは可能でしょうか?

各要素の透明度を手動で設定できるようになりました。下の例では、ウィンドウの背景はアルファチャンネル200に 設定されています。テキストラベルの背景は0に 設定されています。

//---

//+------------------------------------------------------------------+
//|| テキスト・ラベル1の作成|
//+------------------------------------------------------------------+
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp"
//---
bool CProgram::CreateTextLabel(const int x_gap,const int y_gap,string text)
  {
//--- メイン要素へのポインタを保存する
   m_text_label.MainPointer(m_window);
//--- プロパティ
   m_text_label.Alpha(0);
   m_text_label.XSize(190);
   m_text_label.YSize(20);
   m_text_label.LabelXGap(21);
   m_text_label.LabelYGap(3);
   m_text_label.IconFile("Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp");
//--- 要素の作成
   if(!m_text_label.CreateTextLabel(text,x_gap,y_gap))
      return(false);
//--- ベースの要素へのポインタを追加する。
   CWndContainer::AddToElementsArray(0,m_text_label);
   return(true);
  }
 
Oleksii Chepurnyi:

記事より:

"このバージョンでの透明度は、背景の塗りつぶしと境界線にのみ適用されます。テキストと画像はどのアルファチャンネル設定でも完全に不透明で鮮明なままです。"

これはライブラリ内のすべてのアイテムに対するルールです。つまり、アルファチャンネルはアイテムごとに個別に設定できます。
 
Anatoli Kazharski:
これはライブラリ内のすべてのアイテムに対するルールである。つまり、アルファチャンネルはアイテムごとに個別に設定できます。

明確な説明ありがとう。もうひとつ質問です:

オブジェクトの座標はどの座標系で返されるのでしょうか?

例えば、ボタンの右端の座標m_button_text.X2()とすると、ボタンの座標はどの座標系で返されるのでしょうか?フォーム・ウィンドウか、チャート・ウィンドウか?

私が言いたいのは、フォーム・ウィンドウの中にオブジェクトを作っているということです。もしボタンが次々と連続する場合、私は2番目のボタンのX()座標を最初のボタンのX2()+2座標とします。3番目のボタンのX()座標は2番目のボタンのX2()+2座標、といった具合です.

パネルがシンボル・チャートの座標0にある限り、すべてうまくいく。パネルを右に動かしてTFを切り替えると、ボタンは右に移動する。また、ウィンドウ・フォームがチャートの左端から離れれば離れるほど、ボタンは互いに離れていきます。

フォーム・ウィンドウを新しい場所に移動し、TFを切り替えたときに、各ボタンの座標が画面上を移動しないようにするには、どのように設定すればよいでしょうか?

 
Artyom Trishkin:

明確にしてくれてありがとう。もう一つ質問がある:

...

絶対座標が返されます。相対座標に変換する必要があります。作成される要素が添付されている要素からの相対座標です。

主要素がフォームの 場合、次のようになります:

...
   int x=(m_button1.X2()+5)-m_window.X();
   if(!CreateButton2(x,50,"Button 2"))
      return(false);
...

//---


 
Anatoli Kazharski:

絶対座標が返される。相対座標に変換する必要があります。作成される要素がアタッチされている要素からの相対座標。

メイン要素がフォームの 場合は

//---


ありがとう。tfを変更すると、ボタンがチャート・ウィンドウの左端に行ってしまいました。もう少し慎重にやってみます。
 
Anatoli Kazharski:

絶対座標が返される。相対座標に変換する必要があります。作成される要素がアタッチされている要素からの相対座標。

メイン要素がフォームの 場合は

//---


おかしい。このメソッドで計算した座標をオブジェクトの作成 メソッドに渡すと、すべてうまくいくのだが......。

int x=(m_button1.X2()+5)-m_window.X();

しかし、計算した座標だけをメソッドに渡すと・・・:

int x=m_button1.X2()+5;

...しかし、計算された座標だけをメソッドに渡すと、そのメソッドですぐに、渡された座標からm_window.X()の 値を引くと、すべてが浮いてしまう。しかし、どこでそれを減算するかに違いはあるのだろうか?即座に、あるいはすでにビルド・メソッドの中で...。

もしかしたら、私が何か食べてしまったのかもしれないが、なぜこうなるのか理解できない。

 

TestLibrary14のProgram.mqhに、ウィンドウタイトルの色を変更する 行を1行書く:

//+------------------------------------------------------------------+
//|| プログラムのGUIを作成する。
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- パネルの作成
   if(!CreateWindow("EXPERT PANEL"))
      return(false);
   m_window.CaptionColor(clrDimGray);
   

その後、ウィンドウを最小化すると、色がデフォルト値に戻ります。そして、ツールチップ、最小化/変更解除、閉じるボタンは、プログラムで設定されたウィンドウタイトルの色で再描画されます。そして、これらのボタンの色は、カーソルを合わせたときだけデフォルトの色に変わります。

ところで、これらのボタンの背景を透明にすることは可能でしょうか?例えば、ウィンドウのヘッダーは灰色ですが、ボタンは青です。

 

Tol、この連載のどの記事でCKeyについて読めますか?

入力フィールドに数字を入力するとき、キー+シフトにある数字キーの文字が入力されてしまうことがある。例えば、「2」を入力したのに「@」が入力されてしまう......。

状況によっては(おそらくフォーム・ウィンドウ上のコントロールの数と種類による)、Backspaceキーを押すと、追加された順序と逆にフォーム・ウィンドウからコントロールが削除される。カーソルが入力フィールドにあるとき、Backspaceキーを入力フィールドの制御文字としてではなく、フォームウィンドウ上のコントロールを削除するコマンドとして認識する理由がわかりません。つまり、プログラムを開始し、Backspaceを押し始めると、Backspaceを押すたびにすべてのコントロールが削除され、最後に追加されたコントロールから削除されます。最終的には、すでに空のウィンドウフォームも削除されます。

カーソルが入力フィールドにない間、Backspaceに対する反応を無効にすることは可能ですか?

 
Artyom Trishkin:

...

ところで、ボタンの背景を透明にすることはできますか?例えば、ウィンドウのタイトルは灰色ですが、ボタンは青です...。

複合要素のポインターを取得 するにはメソッドを使用します。すべての要素に同じルールが適用されます。