文章 "DoEasy. 控件 (第 19 部分): 在 TabControl 中滚动选项卡、WinForms 对象事件"

 

新文章 DoEasy. 控件 (第 19 部分): 在 TabControl 中滚动选项卡、WinForms 对象事件已发布:

在本文中,我将创建的功能是利用滚动按钮在 TabControl 中滚动选项卡标题。 该功能旨在将选项卡标题从控件的任一侧拖放到单行之中。

编译 EA,并在图表上启动它:


正如我们所见,一切都按预期运作。

但是有两个缺点:如果将鼠标悬停在隐藏的选项卡标题区域上,则标题会更改颜色来做出反应,就好像它在此区域中可见一样。 这就是为什么在调整可见区域大小时,控件的活动区域不会更改其大小的原因。 若要解决此问题,我需要根据可见区域计算活动区域,并调整其大小。

第二个缺点是,如果将选定的标题移到容器之外,并移动面板,则将显示隐藏标题的两个像素。 这与调整选项卡范围大小的计算,因为所选标题每侧的大小增加两个像素。 为了修复它,我需要找到一种方式来获取选项卡标题对象内相邻标题的尺寸,根据该尺寸计算可见性区域的大小。

作者: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.您可以 通过相关索引 从检索标题中检索字段:

         //--- 创建 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
           }

如果它不能以这种方式返回注释中指定的对象,那么它就是一个错误,需要改进