vigiles 发表于 2015-1-1 11:42:54

【已解决】如何模仿SciTE的标签卡

本帖最后由 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

netegg 发表于 2015-1-1 14:11:38

case $NM_LCLICK
   _GUICtrlTab_SetItemState
试试看行不行

vigiles 发表于 2015-1-1 14:45:05

回复 2# netegg


    现在不明确如何判断标签卡上哪个标签获取了右击事件。另外你说的$NM_LCLICK似乎应该是$NM_CLICK。

netegg 发表于 2015-1-1 15:11:09

本帖最后由 netegg 于 2015-1-1 15:16 编辑

Case $NM_CLICK 左击
Case $NM_RCLICK 右击

vigiles 发表于 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
期待回复!

netegg 发表于 2015-1-1 17:28:59

;$tabWelcome = GUICtrlCreateTab( 1, 27, 598, 230)      ;不能响应 $WM_NOTIFY
加一行$tabWelcom = cotrolgethandle($tabWelcom)
试试看

netegg 发表于 2015-1-1 17:31:19

或者在notify里加
if not(hwnd($tabWelcom)) then $tabWelcom= cotrolgethandle($tabWelcom)

vigiles 发表于 2015-1-1 17:36:17

回复 7# netegg


    谢谢!此方法可以。但是不知如何在左键点击/右键点击时获取标签卡上的标签项目

netegg 发表于 2015-1-1 17:55:55

回复 8# vigiles
什么意思

vigiles 发表于 2015-1-1 19:25:31

回复 9# netegg


    上面代码中
Switch $indexItemInTab
         Case 0
不能执行。
希望前辈能运行一下试试

netegg 发表于 2015-1-1 19:43:09

GUICtrlRead后面跟的是控件索引,不是句柄

vigiles 发表于 2015-1-1 20:09:54

回复 11# netegg


    获取到的只有0,无论标签卡中选中的是哪个标签。

netegg 发表于 2015-1-1 20:33:34

_GUICtrlTab_GetCurSel

vigiles 发表于 2015-1-1 20:42:22

RE: 如何模仿SciTE的标签卡

回复 13# netegg


    这个也不成功。
通过_GUICtrlTab_GetItemCount, _GUICtrlTab_GetItemState实现了。
多谢不厌其烦的指导!{:face (377):}
页: [1]
查看完整版本: 【已解决】如何模仿SciTE的标签卡