找回密码
 加入
搜索
查看: 6850|回复: 13

[GUI管理] 【已解决】如何模仿SciTE的标签卡

  [复制链接]
发表于 2015-1-1 11:42:54 | 显示全部楼层 |阅读模式
本帖最后由 vigiles 于 2015-1-2 09:46 编辑

想必大家都用过SciTE,只打开一个文件时标签卡是不出现的,打开多个文件时标签卡出现,可以点击标签头切换文件;同时右键点击标签头还可以弹出菜单。


现在想做个程序,其中的标签卡想模仿SciTE这样。需求:能够获取标签头左键点击事件作出响应,同时也能获取右键点击标签头事件作出响应。搜索了论坛中的帖子,已经翻阅了帮助文档,发现:
1.使用用户自定义函数 _GUICtrlTab_Create 创建的标签卡不能响应 GUICtrlSetOnEvent 左键点击事件;但能在 GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") 中的检测到右键点击(不知道如何获得标签索引)。
2.使用内置函数 GUICtrlCreateTab 创建的标签卡支持 GUICtrlSetOnEvent 左键点击;但不能在 GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") 中的检测到右键点击。


...... 有点晕了。


我使用3.3.12.0版本,代码如下,期待各位网友不吝赐教!
祝2015元旦快乐!新年快乐!


#include <GUIConstantsEx.au3>
#include <GuiTab.au3>
#include <TabConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

Global $itemInTab 

$guiWelcome = GUICreate("仿SciTE标签卡", 600, 300)
        GUISetOnEvent($GUI_EVENT_CLOSE, "Func_GUI_EVENT_CLOSE")

        ; 创建标签卡控件(x-距离窗体左边,y-距离窗体顶边,w,h),注意上面的工具条也占用高度,同时菜单栏底边设为0
        ;$tabWelcome = _GUICtrlTab_Create( $guiWelcome, 1, 27, 598, 230)        ; 标签头的高度约 22 ; 自定义函数的才能检测 _WM_NOTIFY 中的右键点击
        $tabWelcome = GUICtrlCreateTab( 1, 27, 598, 230)                                                                                ; 内置函数创建的才支持 GUICtrlSetOnEvent 左键点击
                ; 为标签卡添加点击事件处理
                GUICtrlSetOnEvent($tabWelcome, "Func_TabWelcome")

                ; 添加标签(标题)。起始索引为0
                $itemWorkerInTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 0, "工作日志", 0)
                $itemSchoolInTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 1, "学习信息", 0)
                $itemProductInTabWelcome = GUICtrlCreateTabItem("公司产品")
                $itemProjectInTabWelcome = GUICtrlCreateTabItem("工程项目")

GUISetState(@SW_SHOW, $guiWelcome)

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

;-------------------------------- 分割线 -----------------------------
While 1
        Sleep(200)
WEnd

Func Func_GUI_EVENT_CLOSE ()
        Exit
EndFunc

; 响应标签卡点击事件
Func Func_TabWelcome ()
        ; 获得标签索引。@GUI_CtrlId宏命令,获取刚刚点击的控件ID
        $ctrlId = GUICtrlRead (@GUI_CtrlId)
        ; 获得标签标题文本(控件,索引)
        $itemText = _GUICtrlTab_GetItemText(@GUI_CtrlId, $ctrlId)
        
        ConsoleWrite("点击的标签卡:" & $ctrlId & " - " & $itemText & @CRLF)
EndFunc

Func _WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
    Local $tNMHDR, $hwndFrom, $code, $i_idOld, $i_idNew
    Local $tNMTBHOTITEM
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hwndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $code = DllStructGetData($tNMHDR, "Code")
        
    Switch $hwndFrom
                ; 标签卡
        Case $tabWelcome
            Switch $code
                                Case $NM_RCLICK
                                        $itemIndex = GUICtrlRead($tabWelcome, 1)
                                        ConsoleWrite("右键了"& $itemIndex & @CRLF)
                                        
                                        Switch $itemIndex
                                                Case 0 
                                                        MsgBox(262208, "点击标签:", "00000")
                                                Case 1 
                                                        MsgBox(262208, "点击标签:", "11111")
                                                Case 2 
                                                        MsgBox(262208, "点击标签:", "22222")
                                                Case 3 
                                                        MsgBox(262208, "点击标签:", "33333")
                                        EndSwitch
                        EndSwitch
        EndSwitch
        
    Return $GUI_RUNDEFMSG
EndFunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2015-1-1 14:11:38 | 显示全部楼层
case $NM_LCLICK
   _GUICtrlTab_SetItemState
试试看行不行
 楼主| 发表于 2015-1-1 14:45:05 | 显示全部楼层
回复 2# netegg


    现在不明确如何判断标签卡上哪个标签获取了右击事件。另外你说的$NM_LCLICK似乎应该是$NM_CLICK。
发表于 2015-1-1 15:11:09 | 显示全部楼层
本帖最后由 netegg 于 2015-1-1 15:16 编辑

Case $NM_CLICK 左击
Case $NM_RCLICK 右击
 楼主| 发表于 2015-1-1 15:48:48 | 显示全部楼层
回复 4# netegg
        $tabWelcome = _GUICtrlTab_Create( $guiWelcome, 1, 27, 598, 230)
                ;$tabWelcome = GUICtrlCreateTab( 1, 27, 598, 230)        ;不能响应 $WM_NOTIFY 
                $itemWorkerInTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 0, "工作日志")
                $itemSchoolInTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 1, "学习信息")
                $itemSchool2InTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 2, "学习信息2")
                $itemSchool3InTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 3, "学习信息3")
_GUICtrlTab_Create创建的标签卡控件可以在$WM_NOTIFY中获取左键、右键点击事件,但不知道如何获取其中的单个标签项目;GUICtrlCreateTab创建的标签卡不能响应$WM_NOTIFY。
#include <GUIConstantsEx.au3>
#include <GuiTab.au3>
#include <TabConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)

Global $itemInTab 

$guiWelcome = GUICreate("仿SciTE标签卡", 600, 300)
        GUISetOnEvent($GUI_EVENT_CLOSE, "Func_GUI_EVENT_CLOSE")

        $tabWelcome = _GUICtrlTab_Create( $guiWelcome, 1, 27, 598, 230)
                ;$tabWelcome = GUICtrlCreateTab( 1, 27, 598, 230)        ;不能响应 $WM_NOTIFY 
                $itemWorkerInTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 0, "工作日志")
                $itemSchoolInTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 1, "学习信息")
                $itemSchool2InTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 2, "学习信息2")
                $itemSchool3InTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 3, "学习信息3")

GUISetState(@SW_SHOW, $guiWelcome)

GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")

;-------------------------------- 分割线 -----------------------------
While 1
        Sleep(200)
WEnd

Func Func_GUI_EVENT_CLOSE ()
        Exit
EndFunc

Func _WM_NOTIFY($hWndGUI, $MsgID, $wParam, $lParam)
    Local $tNMHDR, $hwndFrom, $code, $i_idOld, $i_idNew
    Local $tNMTBHOTITEM
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hwndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $code = DllStructGetData($tNMHDR, "Code")
        
    Switch $hwndFrom
                Case $tabWelcome
            Switch $code
                                Case $NM_CLICK
                                        $itemIndex = GUICtrlRead($tabWelcome, 1)
                                        ConsoleWrite("左键了"& $itemIndex & @CRLF)
                                        
                                        $indexItemInTab = GUICtrlRead ( $tabWelcome, 1 )        ;--------------- 无效?
                                        ConsoleWrite("标签页索引:" & $indexItemInTab & @CRLF)

                                        Switch $indexItemInTab
                                                Case 0 
                                                        ConsoleWrite("左击标签:00000")
                                                Case 1 
                                                        ConsoleWrite("左击标签:11111")
                                                Case 2 
                                                        ConsoleWrite("左击标签:22222")
                                                Case 3 
                                                        ConsoleWrite("左击标签:33333")
                                        EndSwitch
                                        
                                Case $NM_RCLICK
                                        $itemIndex = GUICtrlRead($tabWelcome, 1)
                                        ConsoleWrite("右键了"& $itemIndex & @CRLF)
                                        
                                        Switch $itemIndex
                                                Case 0 
                                                        ConsoleWrite("右击标签:00000")
                                                Case 1 
                                                        ConsoleWrite("右击标签:11111")
                                                Case 2 
                                                        ConsoleWrite("右击标签:22222")
                                                Case 3 
                                                        ConsoleWrite("右击标签:33333")
                                        EndSwitch
                EndSwitch
        EndSwitch
        
    Return $GUI_RUNDEFMSG
EndFunc
期待回复!
发表于 2015-1-1 17:28:59 | 显示全部楼层
;$tabWelcome = GUICtrlCreateTab( 1, 27, 598, 230)        ;不能响应 $WM_NOTIFY
加一行$tabWelcom = cotrolgethandle($tabWelcom)
试试看
发表于 2015-1-1 17:31:19 | 显示全部楼层
或者在notify里加
if not(hwnd($tabWelcom)) then $tabWelcom= cotrolgethandle($tabWelcom)
 楼主| 发表于 2015-1-1 17:36:17 | 显示全部楼层
回复 7# netegg


    谢谢!此方法可以。但是不知如何在左键点击/右键点击时获取标签卡上的标签项目
发表于 2015-1-1 17:55:55 | 显示全部楼层
回复 8# vigiles
什么意思
 楼主| 发表于 2015-1-1 19:25:31 | 显示全部楼层
回复 9# netegg


    上面代码中
Switch $indexItemInTab
         Case 0 
不能执行。
希望前辈能运行一下试试
发表于 2015-1-1 19:43:09 | 显示全部楼层
GUICtrlRead后面跟的是控件索引,不是句柄
 楼主| 发表于 2015-1-1 20:09:54 | 显示全部楼层
回复 11# netegg


    获取到的只有0,无论标签卡中选中的是哪个标签。
发表于 2015-1-1 20:33:34 | 显示全部楼层
_GUICtrlTab_GetCurSel
 楼主| 发表于 2015-1-1 20:42:22 | 显示全部楼层

RE: 如何模仿SciTE的标签卡

回复 13# netegg


    这个也不成功。
通过_GUICtrlTab_GetItemCount, _GUICtrlTab_GetItemState实现了。
多谢不厌其烦的指导!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 07:39 , Processed in 0.105765 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表