記事「DoEasy-コントロール(第19部):TabControl、WinFormsオブジェクトイベントでのタブのスクロール」についてのディスカッション

 

新しい記事「DoEasy-コントロール(第19部):TabControl、WinFormsオブジェクトイベントでのタブのスクロール」はパブリッシュされました:

この記事では、スクロールボタンを使用してTabControlでタブヘッダーをスクロールする機能を作成します。この機能は、コントロールの両方側からタブヘッダーを1行に配置するためのものです。

EAをコンパイルし、チャート上で起動します。


ご覧のとおり、すべてが想定どおりに機能します。

ただし、2つの欠点があります。非表示のタブヘッダー領域にカーソルを合わせると、この領域に表示されているかのようにヘッダーの色が変化します。これが、表示領域のサイズが変更されたときに、コントロールのアクティブ領域のサイズが変更されない理由です。これを修正するには、表示されている領域に合わせてアクティブ領域を計算してサイズを変更する必要があります。

2つ目の欠点は、選択したヘッダーをコンテナの外に移動してパネルを移動すると、非表示のヘッダーの2ピクセルが表示されることです。これは、スコープ計算用のタブのサイズ変更に関係しています。これは、選択したヘッダーが両側で2ピクセルずつサイズが大きくなるためです。これを修正するには、タブヘッダーオブジェクト内の隣接するヘッダーのサイズを取得する方法を見つける必要があります。これに基づいて、表示領域のサイズが計算されます。

作者: Artyom Trishkin

 
ワオ。便利だね。使い道がたくさんありそうだ。
シリーズの他の記事もチェックしなきゃ。
著者に感謝
 

マウスを動かしてパネルの上のホイールをスクロールさせると、チャート自体がスクロールすることがあります。

作成された要素を明確に取得するには?すでにGRAPH_ELEMENT_TYPE_WF_TAB_CONTROL型の要素を持っている場合、インデックス0を使用するのは間違っています。

pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,InpTabControlX,InpTabControlY,pnl.Width()-30,pnl.Height()-40,clrNONE,255,true,false);
CTabControl *tc=pnl.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,0);

次に対象のタブのヘッダーのidを取得した:

int my_id=-1;
...
CTabHeader *th=tc.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_HEADER,4);
my_id=th.ID();

アクティブなタブの変更イベント、正確にはヘッダーをクリックしたときのイベントをキャッチする。アクティブなタブをクリックしてもイベントは 発生する。

if((id-CHARTEVENT_CUSTOM==WF_CONTROL_EVENT_TAB_SELECT)&&(lparam==my_id))
     {
      Print(sparam);
     }

さて、どうやってアクティブ・フィールドのオブジェクトを取得するのか?CTabFieldでしょう?

親オブジェクトを見つけるには?

 
Aliaksandr Hryshyn イベントは 発生する。

さて、どうやってアクティブ・フィールドのオブジェクトを取得するのか? CTabFieldですよね?

親オブジェクトを見つけるには?

1.インデックス 0は、要素に最初に作成されたアタッチオブジェクトに使用されます。インデックス1は2番目、インデックス2は3番目、といった具合です。

2. 取得したヘッダーから、目的のインデックスによって フィールドを取り出すことが できます:

         //--- TabControl コントロール・エレメントを作成する
         pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,InpTabControlX,InpTabControlY,pnl.Width()-30,pnl.Height()-40,clrNONE,255,true,false);
         CTabControl *tc=pnl.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,0);
         if(tc!=NULL)
           {
            CTabHeader *th=tc.GetTabHeader(index);
            CTabField  *tf=th.GetFieldObj();
           }

2.1 TabControlオブジェクトから目的のインデックスで タブフィールドを取り出すことができます:

         //--- TabControl コントロール・エレメントを作成する
         pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,InpTabControlX,InpTabControlY,pnl.Width()-30,pnl.Height()-40,clrNONE,255,true,false);
         CTabControl *tc=pnl.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,0);
         if(tc!=NULL)
           {
            CTabField  *tf=tc.GetTabField(index);
           }

3. 質問の意味がよくわかりません 。現在のオブジェクトがどのオブジェクトにバインドされているかを調べる必要がある場合は、このように動作するはずです:

      pnl=engine.CreateWFPanel("WinForms Panel"+(string)i,(i==0 ? 50 : 70),(i==0 ? 50 : 70),410,200,array_clr,200,true,true,false,-1,FRAME_STYLE_BEVEL,true,false);
      if(pnl!=NULL)
        {
         pnl.Hide();
         Print(DFUN,「パネル説明: ",pnl.Description(),", タイプと名前: ",pnl.TypeElementDescription()," ",pnl.Name());
         //--- パディングを4に設定する
         pnl.SetPaddingAll(3);
         //--- 入力パラメータから、変位、オートリサイズ、オートリサイズモードのフラグを設定する。
         pnl.SetMovable(InpMovable);
         pnl.SetAutoSize(InpAutoSize,false);
         pnl.SetAutoSizeMode((ENUM_CANV_ELEMENT_AUTO_SIZE_MODE)InpAutoSizeMode,false);
   
         //--- TabControl コントロール・エレメントを作成する
         pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,InpTabControlX,InpTabControlY,pnl.Width()-30,pnl.Height()-40,clrNONE,255,true,false);
         CTabControl *tc=pnl.GetElementByType(GRAPH_ELEMENT_TYPE_WF_TAB_CONTROL,0);
         if(tc!=NULL)
           {
            CTabField  *tf=tc.GetTabField(index);  // TabControl要素からタブフィールドを取得する tc
            CWinFormBase *base=tf.GetBase();       // タブフィールドのベースオブジェクトを見つける -TabControl tc でなければならない
            CWinFormBase *main=tf.GetMain();       // タブフィールドのメインオブジェクトを見つける -CPanel pnl でなければならない
           }

コメントで指定されたオブジェクトをこの方法で返さないのであれば、それはバグであり、改良する必要があります。