回家路上 发表于 2015-11-29 17:37:32

[已解决]请教,怎么在Tab页里加入垂直滚动条,我试了内嵌窗口但试不明白,求教了。

本帖最后由 回家路上 于 2015-11-30 16:59 编辑

我想在第二个TabItem里面加上垂直滚动条,试了好久没是成功,请教大家,能帮帮忙。
#include <GUIConstantsEx.au3>
#include <GuiScrollBars.au3>
#include <SendMessage.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GuiTab.au3>

Example()

Func Example()
    GUICreate("标签页控件 GUI", 785, 375);

    ;GUISetBkColor(0x00E0FFFF)
    GUISetFont(9, 300)

    Local $idTab = GUICtrlCreateTab(15, 8, 760, 355)
        _GUICtrlTab_SetMinTabWidth($idTab, 80)

    GUICtrlCreateTabItem("选项页 0")
    GUICtrlCreateGroup("组框 1", 25, 40, 740, 135)
    For $i=0 to 13
                $iX = 35 + Mod($i, 4)*185
                $iY = 55 + Int($i/4)*25
                GUICtrlCreateCheckbox("标准复选框" & ($i+1) & "|" & $iX & $iY, $iX, $iY, 165, 25)
        Next
    GUICtrlCreateGroup("组框 1", 25, 180, 740, 135)
    For $i=0 to 13
                $iX = 35 + Mod($i, 4)*185
                $iY = 195 + Int($i/4)*25
                GUICtrlCreateCheckbox("标准复选框" & ($i+1) & "|" & $iX & $iY, $iX, $iY, 165, 25)
        Next
        GUICtrlCreateButton("测试按钮", 675, 325, 85, 25)
        GUICtrlCreateButton("测试按钮", 580, 325, 85, 25)
        GUICtrlCreateGroup("", -99, -99, 1, 1) ;关闭组框控件


    $tabItem2 = GUICtrlCreateTabItem("选项页 1")
        ;$tabItem2InnerGUI = GUICreate("", 300, 300, 0,0, $WS_CHILD, -1, $tabItem2)
        ;_WinAPI_SetParent($tabItem2InnerGUI,$tabItem2)
        ;_GUIScrollBars_Init($tabItem2InnerGUI)
    ;_GUIScrollBars_ShowScrollBar($tabItem2InnerGUI, $SB_HORZ)
        ;GUISetState(@SW_SHOW, $tabItem2InnerGUI)
    GUICtrlCreateGroup("组框 1", 25, 40, 740, 135)
    For $i=0 to 13
                $iX = 35 + Mod($i, 4)*185
                $iY = 55 + Int($i/4)*25
                GUICtrlCreateCheckbox("标准复选框" & ($i+1) & "|" & $iX & $iY, $iX, $iY, 165, 25)
        Next
    GUICtrlCreateGroup("组框 1", 25, 180, 740, 135)
    For $i=0 to 13
                $iX = 35 + Mod($i, 4)*185
                $iY = 195 + Int($i/4)*25
                GUICtrlCreateCheckbox("标准复选框" & ($i+1) & "|" & $iX & $iY, $iX, $iY, 165, 25)
        Next
    GUICtrlCreateGroup("组框 1", 25, 320, 740, 135)
        GUICtrlCreateButton("测试按钮", 675, 465, 85, 25)
        _SendMessage($tabItem2, 0x0194)

    GUICtrlCreateTabItem("选项页 2")
    GUICtrlCreateGroup("组框 1", 25, 40, 740, 135)
    For $i=0 to 13
                $iX = 35 + Mod($i, 4)*185
                $iY = 55 + Int($i/4)*25
                GUICtrlCreateCheckbox("标准复选框" & ($i+1) & "|" & $iX & $iY, $iX, $iY, 165, 25)
        Next
    GUICtrlCreateGroup("组框 1", 25, 180, 740, 135)
    For $i=0 to 13
                $iX = 35 + Mod($i, 4)*185
                $iY = 195 + Int($i/4)*25
                GUICtrlCreateCheckbox("标准复选框" & ($i+1) & "|" & $iX & $iY, $iX, $iY, 165, 25)
        Next
        GUICtrlCreateButton("测试按钮", 675, 325, 85, 25)
    GUICtrlCreateTabItem(""); 结束选项标签页的定义

    ;GUICtrlCreateLabel("点击标签页并查看标题", 20, 130, 250, 20)

    GUISetState(@SW_SHOW)

    Local $idMsg
    While 1
      $idMsg = GUIGetMsg()

      If $idMsg = $GUI_EVENT_CLOSE Then ExitLoop
      If $idMsg = $idTab Then
            WinSetTitle("标签页控件 GUI", "", "标签页控件 GUI" & GUICtrlRead($idTab))
      EndIf
    WEnd
EndFunc   ;==>Example
====================================================================
解决方案在 9楼---------http://www.autoitx.com/forum.php?mod=redirect&goto=findpost&pid=638286&ptid=50873
感谢提供帮助。

回家路上 发表于 2015-11-29 21:55:24

自己顶一下。新手,正在动手学习,希望有人能指点指点,谢谢。

回家路上 发表于 2015-11-30 11:04:41

自己顶一下。希望看到的论坛前辈指点一下。

====================================
我每次都删除上一次顶的,都扣钱了,还是没人O__O "…。。。

afan 发表于 2015-11-30 11:23:54

你可以参考早几天的帖子,就有你需要的内容
http://www.autoitx.com/forum.php?mod=viewthread&tid=50682
9# 10# 的代码
你这个应该比那贴对滚动条的需求更有意义点,但如果可以不用的话最好不用,调试很麻烦。就算那贴给出的答案也只建议你参考,因为两个代码都会出现滚动不够或滚动过多的问题。如果你用了TAB分页,不如再用TAB细分,看你需要滚动的部分也是一组一组的。

回家路上 发表于 2015-11-30 13:08:21

本帖最后由 回家路上 于 2015-11-30 14:22 编辑

回复 4# afan


谢谢afan超版,嗯确实大思路的正确会少很多功夫,在论坛学习,一半是学技术,一半是学思路。

看了您推荐的帖子,试了试子窗口滚动条的效果,确实好使。
可是我在Tab页里内嵌窗口还没整好,能不能麻烦给个例子,我昨天今天在论坛搜“tab”“滚动条”了,好多帖子也没搜到tab内嵌滚动条的例子。希望有时间的话能指教一下。谢谢。

================================
关于分组的想法,确实很好,只是我这目前是写了个测试样例,实际上可能有十几组,内部分组的话Tab也太多,就不好了。

水木子 发表于 2015-11-30 15:25:21

是这样吗?

cfanpc 发表于 2015-11-30 15:37:37

回复 6# 水木子


    挖厉害啊给个源码呗

回家路上 发表于 2015-11-30 15:57:07

回复 6# 水木子


嗯嗯,就是这个效果,我就是搜索看到14年的一个帖子,afan版主在那个帖子中建议如此实现,然后你也说这样可行切不难,我就动手试,结果参考文档也没试成,好吧,是我心急了,学习中。
谢谢水木子超版关注,请指教。谢啦O(∩_∩)O!

水木子 发表于 2015-11-30 16:14:17

本帖最后由 水木子 于 2015-11-30 16:17 编辑

哦!是吗!afan前辈说的那个帖子我还没来得及看,这是我根据你的要求写的。
以前也没有写过关于滚动条的东西,看你提问,我正好也对这个有兴趣,所以就试试呗!
思路比较简单,就是在Tab中内嵌子窗口,然后给子窗口添加滚动条。
代码如下,希望对你有帮助。

#include <GuiTab.au3>
#include 'GUIScrollbars_Ex.au3'

$MyGui0 = GUICreate('标签页控件 GUI', 800, 400)
GUISetFont(9)

$Tab = GUICtrlCreateTab(10, 10, 780, 380)
_GUICtrlTab_SetMinTabWidth($Tab, 80)

$TabItem1 = GUICtrlCreateTabItem('第一页')
$Button1_1 = GUICtrlCreateButton('测试按钮1-1', 420, 350, 85, 25)

$TabItem2 = GUICtrlCreateTabItem('第二页')
$Button2_1 = GUICtrlCreateButton('测试按钮2-1', 420, 350, 85, 25)
$Button2_2 = GUICtrlCreateButton('测试按钮2-2', 550, 350, 85, 25)

$TabItem3 = GUICtrlCreateTabItem('第三页')
$Button3_1 = GUICtrlCreateButton('测试按钮3-1', 420, 350, 85, 25)
$Button3_2 = GUICtrlCreateButton('测试按钮3-2', 550, 350, 85, 25)
$Button3_3 = GUICtrlCreateButton('测试按钮3-3', 680, 350, 85, 25)
GUICtrlCreateTabItem('')

Global $aCtrlCount1
Global $iNumber = 4
Global $iSpacingX = 200, $iSpacingY = 50

$MyGui1 = GUICreate('', 776, 300, 11, 31, $WS_POPUP, $WS_EX_MDICHILD, $MyGui0)
For $i = 0 To UBound($aCtrlCount1) - 1
        $aCtrlCount1[$i] = GUICtrlCreateCheckbox('复选框 1 - ' & $i + 1, $iSpacingX * Mod($i, $iNumber) + 30, $iSpacingY * Floor($i / $iNumber) + 40, 100, 20)
Next
GUICtrlCreateGroup('组框 1 - 1', 10, 10, 740, UBound($aCtrlCount1) * 12.5 + 40)
If UBound($aCtrlCount1) > 20 Then _GUIScrollbars_Generate($MyGui1, 0, UBound($aCtrlCount1) * 12.5 + 40, 0, 0, True)


Global $aCtrlCount2
$MyGui2 = GUICreate('', 776, 300, 11, 31, $WS_POPUP, $WS_EX_MDICHILD, $MyGui0)
For $i = 0 To UBound($aCtrlCount2) - 1
        $aCtrlCount2[$i] = GUICtrlCreateCheckbox('复选框 2 - ' & $i + 1, $iSpacingX * Mod($i, $iNumber) + 30, $iSpacingY * Floor($i / $iNumber) + 40, 100, 20)
Next
GUICtrlCreateGroup('组框 2 - 1', 10, 10, 740, UBound($aCtrlCount2) * 12.5 + 40)
If UBound($aCtrlCount2) > 20 Then _GUIScrollbars_Generate($MyGui2, 0, UBound($aCtrlCount2) * 12.5 + 40, 0, 0, True)


Global $aCtrlCount3
$MyGui3 = GUICreate('', 776, 300, 11, 31, $WS_POPUP, $WS_EX_MDICHILD, $MyGui0)
For $i = 0 To UBound($aCtrlCount3) - 1
        $aCtrlCount3[$i] = GUICtrlCreateCheckbox('复选框 3 - ' & $i + 1, $iSpacingX * Mod($i, $iNumber) + 30, $iSpacingY * Floor($i / $iNumber) + 40, 100, 20)
Next
GUICtrlCreateGroup('组框 3 - 1', 10, 10, 740, UBound($aCtrlCount3) * 12.5 + 40)
If UBound($aCtrlCount3) > 20 Then _GUIScrollbars_Generate($MyGui3, 0, UBound($aCtrlCount3) * 12.5 + 40, 0, 0, True)


GUISetState(@SW_SHOW, $MyGui1)
GUISetState(@SW_SHOW, $MyGui0)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")


While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case -3
                        Exit
                Case $Button1_1
                        MsgBox(0, 0, 'Test')
                       
        EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
        Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTab
        $hWndTab = GUICtrlGetHandle($Tab)
        $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
        $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
        $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
        $iCode = DllStructGetData($tNMHDR, "Code")
        Switch $hWndFrom
                Case $hWndTab
                        Switch $iCode
                                Case $NM_CLICK
                                        $iTabItemIndex = _GUICtrlTab_GetCurFocus($hWndTab)
                                        Switch $iTabItemIndex
                                                Case 0
                                                        GUISetState(@SW_HIDE, $MyGui2)
                                                        GUISetState(@SW_HIDE, $MyGui3)
                                                        GUISetState(@SW_SHOW, $MyGui1)
                                                Case 1
                                                        GUISetState(@SW_HIDE, $MyGui1)
                                                        GUISetState(@SW_HIDE, $MyGui3)
                                                        GUISetState(@SW_SHOW, $MyGui2)
                                                Case 2
                                                        GUISetState(@SW_HIDE, $MyGui1)
                                                        GUISetState(@SW_HIDE, $MyGui2)
                                                        GUISetState(@SW_SHOW, $MyGui3)
                                        EndSwitch
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


附上UDF函数,不好意思,我已经忘了出处了,感谢作者!
顺便提一下,_GUIScrollbars_Generate 这个函数也可以创建水平滚动条。

回家路上 发表于 2015-11-30 16:56:05

回复 9# 水木子


一下子就醒悟了,通过事件处理和逻辑控制实现假内嵌。记下了。
横向的也试了
UDF也很强大,收藏学习了。

再次感谢帮助O(∩_∩)O!

zhaoyun 发表于 2015-12-1 07:33:12

收藏,收藏,后消化

ak47gglllk 发表于 2015-12-3 09:45:18

感谢大大 学习了

车技一流 发表于 2015-12-6 18:18:04

以学习感谢分享

yhjfirst 发表于 2015-12-6 19:51:33

感谢分享 学习了

yhjfirst 发表于 2015-12-6 19:51:36

感谢分享 学习了
页: [1] 2
查看完整版本: [已解决]请教,怎么在Tab页里加入垂直滚动条,我试了内嵌窗口但试不明白,求教了。