【已解决】如何模仿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
case $NM_LCLICK
_GUICtrlTab_SetItemState
试试看行不行 回复 2# netegg
现在不明确如何判断标签卡上哪个标签获取了右击事件。另外你说的$NM_LCLICK似乎应该是$NM_CLICK。 本帖最后由 netegg 于 2015-1-1 15:16 编辑
Case $NM_CLICK 左击
Case $NM_RCLICK 右击 回复 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
期待回复! ;$tabWelcome = GUICtrlCreateTab( 1, 27, 598, 230) ;不能响应 $WM_NOTIFY
加一行$tabWelcom = cotrolgethandle($tabWelcom)
试试看 或者在notify里加
if not(hwnd($tabWelcom)) then $tabWelcom= cotrolgethandle($tabWelcom) 回复 7# netegg
谢谢!此方法可以。但是不知如何在左键点击/右键点击时获取标签卡上的标签项目 回复 8# vigiles
什么意思 回复 9# netegg
上面代码中
Switch $indexItemInTab
Case 0
不能执行。
希望前辈能运行一下试试 GUICtrlRead后面跟的是控件索引,不是句柄 回复 11# netegg
获取到的只有0,无论标签卡中选中的是哪个标签。 _GUICtrlTab_GetCurSel
RE: 如何模仿SciTE的标签卡
回复 13# netegg这个也不成功。
通过_GUICtrlTab_GetItemCount, _GUICtrlTab_GetItemState实现了。
多谢不厌其烦的指导!{:face (377):}
页:
[1]