AutoIt上路05-通过菜单控制标签的显示和隐藏 http://www.gaohaiyan.com/933.html
用过了SciTE一定知道,在标签卡右键点击标签时,首先标签被选中,然后弹出菜单。通过这个右键菜单可以快捷的进行操作。
实现方法1:
在UDF中提供了_GUICtrlTab_HitTest($tabWelcome, $x, $y)方法,可以得到鼠标点击(包括右键)时的标签项目;
_GUICtrlTab_SetCurSel($tabWelcome, $aHit[0])方法可以选择指定标签,原生的MouseClick无法实现的,UDF实现了。
对于标签选中,我们继续在GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")中实现,就用上面的_GUICtrlTab_HitTest+_GUICtrlTab_SetCurSel。
然后是右键菜单,为了简单我们使用原生方法 GUICtrlCreateContextMenu,GUICtrlCreateMenuItem,因为原生创建的菜单项可以直接通过 GuiCtrlSetOnEvent 添加点击事件处理;如果使用UDF中 _GUICtrlMenu_CreatePopup 创建弹出菜单,则需要GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")中处理菜单项的响应,很遗憾因在下愚钝未能成功。
实现方法2:
首先原生创建控件的右键菜单,同上。
然后右键选中标签时,使用GUIRegisterMsg($WM_CONTEXTMENU, "_WM_CONTEXTMENU")
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Func WM_CONTEXTMENU($hWnd, $Msg, $wParam, $lParam) Local $x, $y, $aHit If $wParam = GUICtrlGetHandle($tabWelcome) Then ; GUICtrlGetHandle($tabWelcome),通过标签卡的ID得到句柄 $x = _WinAPI_GetMousePosX(True, $wParam) ; 鼠标右键点击时的位置 $y = _WinAPI_GetMousePosY(True, $wParam) $aHit = _GUICtrlTab_HitTest($tabWelcome, $x, $y) ; 通过鼠标位置得到标签卡上的标签 _GUICtrlTab_SetCurSel($tabWelcome, $aHit[0]) ; 选择标签 ; 得到当前选中的标签索引 ConsoleWrite("右击标签卡:" & _GUICtrlTab_GetCurSel($tabWelcome) & @CRLF) EndIf EndFunc |
这样GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")没有发生改变。
本例使用方式1。讲得不太明了,各位网友仔细研究源码即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
#include <GUIConstantsEx.au3> #include <GuiTab.au3> #include <GuiToolbar.au3> #include <GuiImageList.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) Global $itemInToolbar $guiWelcome = GUICreate("威格灵", 450, 200) GUISetOnEvent($GUI_EVENT_CLOSE, "Func_GUI_EVENT_CLOSE") $menuFile = GUICtrlCreateMenu ( "文件 &F") $itemOpenInMenuFile = GUICtrlCreateMenuItem("打开", $menuFile) GUICtrlCreateMenuItem("", $menuFile) $itemExitInMenuFile = GUICtrlCreateMenuItem("退出", $menuFile) GUICtrlSetOnEvent($itemExitInMenuFile, "Func_GUI_EVENT_CLOSE") $menuTab = GUICtrlCreateMenu ( "窗口 &W") $itemWorkersInMenuTab = GUICtrlCreateMenuItem("工作日志", $menuTab) GUICtrlSetOnEvent($itemWorkersInMenuTab, "Func_MenuItem_ShowTab") $itemProductsInMenuTab = GUICtrlCreateMenuItem("公司产品", $menuTab) GUICtrlSetOnEvent($itemProductsInMenuTab, "Func_MenuItem_ShowTab") $itemSchoolsInMenuTab = GUICtrlCreateMenuItem("学校信息", $menuTab) GUICtrlSetOnEvent($itemSchoolsInMenuTab, "Func_MenuItem_ShowTab") $itemProjectsInMenuTab = GUICtrlCreateMenuItem("工程外包", $menuTab) GUICtrlSetOnEvent($itemProjectsInMenuTab, "Func_MenuItem_ShowTab") $itemAssetsInMenuTab = GUICtrlCreateMenuItem("资产管理", $menuTab) GUICtrlSetOnEvent($itemAssetsInMenuTab, "Func_MenuItem_ShowTab") $toolbar = _GUICtrlToolbar_Create($guiWelcome) _GUICtrlToolbar_AddBitmap($toolbar, 1, -1, $IDB_STD_SMALL_COLOR) Local Enum $id_New = 1000, $id_Open, $id_Save, $id_Find, $id_Help _GUICtrlToolbar_AddButton($toolbar, $id_New, $STD_FILENEW) _GUICtrlToolbar_AddButton($toolbar, $id_Open, $STD_FILEOPEN) _GUICtrlToolbar_AddButton($toolbar, $id_Save, $STD_FILESAVE) _GUICtrlToolbar_AddButtonSep($toolbar) _GUICtrlToolbar_AddButton($toolbar, $id_Find, $STD_FIND) _GUICtrlToolbar_AddButtonSep($toolbar) _GUICtrlToolbar_AddButton($toolbar, $id_Help, $STD_HELP) ; 1.原生创建标签卡,这样可以直接添加鼠标点击事件监听 ------------------------------------- $tabWelcome = GUICtrlCreateTab ( 1, 28, 448, 130) GUICtrlSetOnEvent($tabWelcome, "Func_TabWelcome") $imgList = _GUIImageList_Create() _GUIImageList_Add($imgList, _WinAPI_CreateSolidBitmap($guiWelcome, 0xFF0000, 16, 16)) _GUIImageList_Add($imgList, _WinAPI_CreateSolidBitmap($guiWelcome, 0x00FF00, 16, 16)) _GUIImageList_Add($imgList, _WinAPI_CreateSolidBitmap($guiWelcome, 0x0000FF, 16, 16)) _GUIImageList_Add($imgList, _WinAPI_CreateSolidBitmap($guiWelcome, 0xFF3399, 16, 16)) _GUIImageList_Add($imgList, _WinAPI_CreateSolidBitmap($guiWelcome, 0x00CCFF, 16, 16)) _GUICtrlTab_SetImageList($tabWelcome, $imgList) ; 使用UDF添加默认标签(标题)。起始索引为0 $itemWorkerInTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 0, "工作日志", 0) ; 2.为标签卡创建右键菜单 ----------------------------------------------------------------- $mouseMenuTab = GUICtrlCreateContextMenu($tabWelcome) ; 创建菜单项,可以直接添加单击事件处理 $mouseMenuItemClose = GUICtrlCreateMenuItem("关闭", $mouseMenuTab) GUICtrlSetOnEvent($mouseMenuItemClose, "Func_MouseMenuItem") GUICtrlCreateMenuItem("", $mouseMenuTab) $mouseMenuItemSave = GUICtrlCreateMenuItem("保存", $mouseMenuTab) GUICtrlSetOnEvent($mouseMenuItemSave, "Func_MouseMenuItem") $mouseMenuItemSaveAs = GUICtrlCreateMenuItem("另存为", $mouseMenuTab) GUICtrlSetOnEvent($mouseMenuItemSaveAs, "Func_MouseMenuItem") GUICtrlCreateMenuItem("", $mouseMenuTab) $mouseMenuItemPrint = GUICtrlCreateMenuItem("打印", $mouseMenuTab) GUICtrlSetOnEvent($mouseMenuItemPrint, "Func_MouseMenuItem") GUICtrlCreateLabel("文本 3", 1, 160, 50, 20) GUISetState(@SW_SHOW, $guiWelcome) GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") ; 3.改变:处理标签卡右击事件 ----------------------- ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ While 1 Sleep(200) WEnd Func Func_GUI_EVENT_CLOSE () Exit EndFunc Func Func_TabWelcome () $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 $toolbar Switch $code Case $TBN_HOTITEMCHANGE $tNMTBHOTITEM = DllStructCreate($tagNMTBHOTITEM, $lParam) $i_idOld = DllStructGetData($tNMTBHOTITEM, "idOld") $i_idNew = DllStructGetData($tNMTBHOTITEM, "idNew") $itemInToolbar = $i_idNew Case $NM_CLICK Switch $itemInToolbar Case 1000 ConsoleWrite("点击的工具条按钮:新建" & @CRLF) $itemInToolbar = -1 Case $id_Open ConsoleWrite("点击的工具条按钮:打开" & @CRLF) $itemInToolbar = -1 Case $id_Save ConsoleWrite("点击的工具条按钮:保存" & @CRLF) $itemInToolbar = -1 Case 1003 ConsoleWrite("点击的工具条按钮:查找" & @CRLF) $itemInToolbar = -1 Case 1004 ConsoleWrite("点击的工具条按钮:帮助" & @CRLF) $itemInToolbar = -1 EndSwitch EndSwitch ; 3.处理标签卡右击事件 -------------------------------------------------------------- Case GUICtrlGetHandle($tabWelcome) Switch $code Case $NM_RCLICK ; 右击 ConsoleWrite("===================================" & @CRLF) Local $x, $y, $aHit $x = _WinAPI_GetMousePosX(True, GUICtrlGetHandle($tabWelcome)) $y = _WinAPI_GetMousePosY(True, GUICtrlGetHandle($tabWelcome)) $aHit = _GUICtrlTab_HitTest($tabWelcome, $x, $y) ; 选中标签 _GUICtrlTab_SetCurSel($tabWelcome, $aHit[0]) ConsoleWrite("右击标签卡:" & _GUICtrlTab_GetCurSel($tabWelcome) & @CRLF) EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ; 2.判断鼠标右键菜单选项做出响应 ----------------------------------------------------------------- Func Func_MouseMenuItem() Switch @GUI_CtrlId Case $mouseMenuItemClose ConsoleWrite("鼠标菜单点击了:111关闭" & @CRLF) Case $mouseMenuItemSave ConsoleWrite("鼠标菜单点击了:2222222保存" & @CRLF) Case $mouseMenuItemSaveAs ConsoleWrite("鼠标菜单点击了:333333333另存为" & @CRLF) Case $mouseMenuItemPrint ConsoleWrite("鼠标菜单点击了:44444444444444打印" & @CRLF) EndSwitch EndFunc Func Func_MenuItem_ShowTab () Switch @GUI_CtrlId Case $itemWorkersInMenuTab Func_Set_MenuItem_Show ("工作日志") Case $itemProductsInMenuTab Func_Set_MenuItem_Show ("公司产品") Case $itemSchoolsInMenuTab Func_Set_MenuItem_Show ("学校信息") Case $itemProjectsInMenuTab Func_Set_MenuItem_Show ("工程外包") Case $itemAssetsInMenuTab Func_Set_MenuItem_Show ( "资产管理" ) EndSwitch EndFunc Func Func_Set_MenuItem_Show ( $strItemName ) $id_item = _GUICtrlTab_FindTab ( $tabWelcome, $strItemName, True) If $id_item <> -1 Then _GUICtrlTab_DeleteItem ( $tabWelcome, $id_item ) Else Switch $strItemName Case "工作日志" $id_item = 0 Case "公司产品" $id_item = 1 Case "学校信息" $id_item = 2 Case "工程外包" $id_item = 3 Case "资产管理" $id_item = 4 EndSwitch _GUICtrlTab_InsertItem ( $tabWelcome, $id_item, $strItemName, $id_item) EndIf EndFunc |
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/939.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设