请教自制sstab控件的思路

高手都到碗里来 2010-02-14 11:12:09
请教自制sstab控件的思路,怎样让不同的控件显示在不同的页面上?
...全文
227 20 打赏 收藏 转发到动态 举报
写回复
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
取消了放在最前功能真不爽,还得人工置顶,打这么多的废话,郁闷
熊孩子开学喽 2010-02-20
  • 打赏
  • 举报
回复
最简单的就是用一个可以当作容器的控件作成数组,比如PICTUREBOX控件和FRAME控件。
当你需要那个页面的控件显示出来的时候就把相应下表的数组控件显示出来,其他的都设为不可见。
  • 打赏
  • 举报
回复
引用 18 楼 lyserver 的回复:
一句话,就是不用改变Container,而是根据tabindex决定控件是否在可视区域内。


这个应该比较靠谱,弄一个结构体数组,结构为:

left
top
tabIndex

嗯,这个办法靠谱,明天上班了,改天验证一下
lyserver 2010-02-20
  • 打赏
  • 举报
回复
引用 15 楼 bloom8848 的回复:
引用 13 楼 lyserver 的回复:用API函数SetParent代替上述句子。

不说有的控件并未提供hwnd不说,就算有hwnd,虽然这个函数会执行成功,但是实际操作并未成功,也就是说控件并没有发生Container的变化(变化是有变化,只是不知道变成什么了)

我想这种操作应该是被禁止的,所以我认为,MS做sstab肯定用的另外的方法

这样处理,建立一个结构体,包括两个成员,一个为当前的TabIndex,一个为Object,然后建立一个该结构体的动态数组。
当设计时控件有变化时(根据控件子类化的鼠标事件和for each ctl in usercontrol.parent.controls进行判断,当ctl.container为usercontrol.extender且数组中不存在该控件),如果有变化,则使用redim preserve增加数组成员,然后将控件信息加入数组成员中。
如果tabindex有变化,则遍历数组,将不属于该tablindex的控件move到可视区域外(因为可能某些控件不支持visible属性,所以使用了move方法),将属于tabindex的控件move到可视区域内。比如可加减10000像素。
一句话,就是不用改变Container,而是根据tabindex决定控件是否在可视区域内。
东方之珠 2010-02-20
  • 打赏
  • 举报
回复
引用 4 楼 lyserver 的回复:
一、在usercontrol中根据TabCount动态加载PictureBox,动态加载方法为Usercontrol.Controls.Add。
二、子类化Usercontrol,判断设计时子控件拖放事件,并设置子控件的Container为当前PictureBox。
三、运行时,隐藏不属于当前TabIndex的PictureBox,显示属性当前TabIndex的PictureBox。
为了方便代码编写,建议使用THUNK技术将子类化过程写到Usercontrol模块里。


推荐此法............
guyehanxinlei 2010-02-20
  • 打赏
  • 举报
回复
学习一下!!!!!!
  • 打赏
  • 举报
回复
引用 13 楼 lyserver 的回复:
用API函数SetParent代替上述句子。


不说有的控件并未提供hwnd不说,就算有hwnd,虽然这个函数会执行成功,但是实际操作并未成功,也就是说控件并没有发生Container的变化(变化是有变化,只是不知道变成什么了)

我想这种操作应该是被禁止的,所以我认为,MS做sstab肯定用的另外的方法
  • 打赏
  • 举报
回复
提示信息
您不是管理员,不能执行搜索操作
lyserver 2010-02-20
  • 打赏
  • 举报
回复
引用 11 楼 bloom8848 的回复:
Set ctl.Container=Usercontrol.PictureBox(TabIndex)


问题的问题是,这一句是会导致错误的,我的例子说的就是这个错误的问题

用API函数SetParent代替上述句子。
  • 打赏
  • 举报
回复
Set ctl.Container=Usercontrol.PictureBox(TabIndex)


问题的问题是,这一句是会导致错误的,我的例子说的就是这个错误的问题
lyserver 2010-02-19
  • 打赏
  • 举报
回复
引用 8 楼 bloom8848 的回复:
引用 7 楼 myjian 的回复:关键是,你要设置多个"容器",并配合TAB页的切换而显示不同的容器. 容器里面就放入不同的目标控件.

是的,关键问题是在这里,上面的例子中,我用sstab来替换江南春说的多个picturebox,这个是合理的
用sstab的dblclick来替换他说的子类化获取事件,这个也是合理的
如果我们在一个activex内部设置多个不同的“容器”,那方法也就是这些
以上工作做好了以后,我们往这个ActiveX中拉了一个控件,那么,怎么才能把这个东西“放”到“容器(江南春说的picturebox,例子里说的sstab)”上面去?

判断是否为设计时,然后再判断是否有鼠标拖放事件(可能有具体对应的COM事件,但我没分析过),在此事件里使用for each ctl in Usercontrol.parent.controls遍历控件,如果发现有新放入的控件且该控件的container.name为UserControl.Extender.Name,则使用Set ctl.Container=Usercontrol.PictureBox(TabIndex)语句设置新控件的容器为Usercontrol中的Picturebox控件,至于为什么要子类化,就是为了捕获设计时的鼠标动作,否则,无法得到是否有控件新增或删除。当然,别忘了设置Usercontrol.ControlContainer属性为True。
lyserver 2010-02-18
  • 打赏
  • 举报
回复
一、在usercontrol中根据TabCount动态加载PictureBox,动态加载方法为Usercontrol.Controls.Add。
二、子类化Usercontrol,判断设计时子控件拖放事件,并设置子控件的Container为当前PictureBox。
三、运行时,隐藏不属于当前TabIndex的PictureBox,显示属性当前TabIndex的PictureBox。
为了方便代码编写,建议使用THUNK技术将子类化过程写到Usercontrol模块里。
  • 打赏
  • 举报
回复
或许我说的不是很清楚?嗯,这个还真是比较难描述
  • 打赏
  • 举报
回复
引用 7 楼 myjian 的回复:
关键是,你要设置多个"容器",并配合TAB页的切换而显示不同的容器.

容器里面就放入不同的目标控件.


是的,关键问题是在这里,上面的例子中,我用sstab来替换江南春说的多个picturebox,这个是合理的
用sstab的dblclick来替换他说的子类化获取事件,这个也是合理的
如果我们在一个activex内部设置多个不同的“容器”,那方法也就是这些
以上工作做好了以后,我们往这个ActiveX中拉了一个控件,那么,怎么才能把这个东西“放”到“容器(江南春说的picturebox,例子里说的sstab)”上面去?
嗷嗷叫的老马 2010-02-18
  • 打赏
  • 举报
回复
关键是,你要设置多个"容器",并配合TAB页的切换而显示不同的容器.

容器里面就放入不同的目标控件.
  • 打赏
  • 举报
回复
先建立一个activex,上面添加一个sstab控件
代码如下:

Option Explicit

Private Sub SSTab1_DblClick()

Dim frm As Object
Dim ctl As Control

Set frm = GetForm()
If Not frm Is Nothing Then
If TypeOf frm Is Form Then
For Each ctl In frm.Controls
If ctl.Container Is UserControl.Extender Then
'本意是将这个控件上的子控件的Container设置到sstab上来
'实际证明,在运行的时候,这里就出错了
Set ctl.Container = SSTab1
End If
Next
End If
End If

Set frm = Nothing
Set ctl = Nothing
End Sub

Private Sub UserControl_Resize()
With SSTab1
.Move 0, 0, UserControl.Width, UserControl.Height
End With
End Sub
Public Property Get ThisObject() As Object
Set ThisObject = SSTab1

End Property
Private Function GetForm() As Object
Dim obj As Object

Do
Set obj = UserControl.Parent

Loop Until (TypeOf obj Is Form)

Set GetForm = obj

Set obj = Nothing

End Function


新建一个EXE工程,添加做好的控件,往控件上添加一个子控件,然后双击SStab执行代码
  • 打赏
  • 举报
回复
引用 4 楼 lyserver 的回复:
一、在usercontrol中根据TabCount动态加载PictureBox,动态加载方法为Usercontrol.Controls.Add。
二、子类化Usercontrol,判断设计时子控件拖放事件,并设置子控件的Container为当前PictureBox。
三、运行时,隐藏不属于当前TabIndex的PictureBox,显示属性当前TabIndex的PictureBox。
为了方便代码编写,建议使用THUNK技术将子类化过程写到Usercontrol模块里。


有一点不明,怎么才能把一个外部的控件的container设置为控件内部的一个控件?我简单的来模拟一下,不知道我的问题在哪里

附上代码
孤独剑_LPZ 2010-02-17
  • 打赏
  • 举报
回复
控件数组的方法简单点,用select判断不同的页面index值,动态生成不同的控件到窗体,用load 控件的方法

  • 打赏
  • 举报
回复
怎样让不同的控件显示在不同的页面上?
cqq_chen 2010-02-15
  • 打赏
  • 举报
回复
如果不是很有必要,还是不这么做好些!
可以考虑用控件数组,然后把控件属性放到后台,需要时加载,可能比你想的方法好些吧!
相关推荐

1,446

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告