AutoIt上路06-通过鼠标右键菜单控制标签 http://www.gaohaiyan.com/939.html
为了动态的控制标签显示与隐藏,我使用了UDF 中 _GUICtrlTab_InsertItem 来为原生的标签卡添加标签,这样就无法直接在标签后创建可以随标签切换显示的控件。
我掌握的方法就是在整个窗体的最后创建控件-ListView,这样控件就会在标签卡顶层,然后我们控制ListView的显示与隐藏,使之和标签切换同步,达到一种ListView属于某个标签的效果。
本例中有以下情况须要切换ListView的显示/隐藏状态:
1)通过菜单栏的菜单打开或关闭标签;
2)通过右键菜单的“关闭”选项关闭标签;
3)单击标签卡进行标签切换;
4)仅右键点击标签时。
具体实现细节请看代码:
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 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 |
#include <GUIConstantsEx.au3> #include <GuiTab.au3> #include <GuiToolbar.au3> #include <GuiImageList.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) Global $itemInToolbar, $idOfTabItem ; 添加一个全局变量$idOfTabItem记录被右击的标签索引 $guiWelcome = GUICreate("www.cuiweiyou.com", 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) $tabWelcome = GUICtrlCreateTab ( 1, 28, 448, 130) GUICtrlSetOnEvent($tabWelcome, "Func_TabWelcome") $imgList = _GUIImageList_Create() _GUIImageList_Add($imgList, _WinAPI_CreateSolidBitmap($guiWelcome, 0x990033, 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) $itemWorkerInTabWelcome = _GUICtrlTab_InsertItem ( $tabWelcome, 0, "工作日志", 0) $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) ; 1.创建标签卡上的控件。在窗体最后创建,避免被遮挡。设置合适的位置和宽高,使之看起来刚好嵌入标签 ; 工作日志 $lvInTabWorks = GUICtrlCreateListView ( "日志编号|时间|工程师|学校|交通|饮食|工作内容|备注", 4, 51, 443, 106) GUICtrlSetState($lvInTabWorks, $GUI_SHOW) ; 可见 ; 公司产品 $lvInTabProduces = GUICtrlCreateListView ( "产品编号|名称|类型|设计|造价|销售|配置单|备注", 4, 51, 443, 106) GUICtrlSetState($lvInTabProduces, $GUI_HIDE) ; 隐藏 ; 学校信息 $lvInTabSchools = GUICtrlCreateListView ( "学校编号|学校|校方联系人|我司负责人|合作项目|项目状态|备注", 4, 51, 443, 106) GUICtrlSetState($lvInTabSchools, $GUI_HIDE) ; 隐藏 ; 工程外包 $lvInTabProjects = GUICtrlCreateListView ( "工程编号|项目|学校|承包商|我司负责人|项目细则|备注", 4, 51, 443, 106) GUICtrlSetState($lvInTabProjects, $GUI_HIDE) ; 隐藏 ; 资产管理 $lvInTabAssets = GUICtrlCreateListView ( "物资编号|名称|计量单位|类型|购入日期|原价|部门|保管|报废|备注", 4, 51, 443, 106) GUICtrlSetState($lvInTabAssets, $GUI_HIDE) ; 隐藏 GUISetState(@SW_SHOW, $guiWelcome) GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY") ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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 ) ; 2.单击时切换标签的ListView------------------------------------------------------------ GUICtrlSetState($lvInTabWorks, $GUI_HIDE) ; 1)全部隐藏 GUICtrlSetState($lvInTabProduces, $GUI_HIDE) GUICtrlSetState($lvInTabSchools, $GUI_HIDE) GUICtrlSetState($lvInTabProjects, $GUI_HIDE) GUICtrlSetState($lvInTabAssets, $GUI_HIDE) Switch $itemText ; 2)根据文本显示被选中的 Case "工作日志" GUICtrlSetState($lvInTabWorks, $GUI_SHOW) Case "公司产品" GUICtrlSetState($lvInTabProduces, $GUI_SHOW) Case "学校信息" GUICtrlSetState($lvInTabSchools, $GUI_SHOW) Case "工程外包" GUICtrlSetState($lvInTabProjects, $GUI_SHOW) Case "资产管理" GUICtrlSetState($lvInTabAssets, $GUI_SHOW) EndSwitch 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 Case GUICtrlGetHandle($tabWelcome) Switch $code Case $NM_RCLICK Local $x, $y, $aHit $x = _WinAPI_GetMousePosX(True, GUICtrlGetHandle($tabWelcome)) $y = _WinAPI_GetMousePosY(True, GUICtrlGetHandle($tabWelcome)) $aHit = _GUICtrlTab_HitTest($tabWelcome, $x, $y) $idOfTabItem = $aHit[0] _GUICtrlTab_SetCurSel($tabWelcome, $aHit[0]) ConsoleWrite("右击标签卡:" & _GUICtrlTab_GetCurSel($tabWelcome) & @CRLF) ; 3.右击标签时切换ListView----------------------------------------- ; 将以下代码封装到一个方法里调用,不成功 GUICtrlSetState($lvInTabWorks, $GUI_HIDE) ; 1)隐藏 GUICtrlSetState($lvInTabProduces, $GUI_HIDE) GUICtrlSetState($lvInTabSchools, $GUI_HIDE) GUICtrlSetState($lvInTabProjects, $GUI_HIDE) GUICtrlSetState($lvInTabAssets, $GUI_HIDE) Switch _GUICtrlTab_GetItemText ( $tabWelcome, $aHit[0] ) ; 2)根据标签文本控制 Case "工作日志" GUICtrlSetState($lvInTabWorks, $GUI_SHOW) Case "公司产品" GUICtrlSetState($lvInTabProduces, $GUI_SHOW) Case "学校信息" GUICtrlSetState($lvInTabSchools, $GUI_SHOW) Case "工程外包" GUICtrlSetState($lvInTabProjects, $GUI_SHOW) Case "资产管理" GUICtrlSetState($lvInTabAssets, $GUI_SHOW) EndSwitch EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc Func Func_MouseMenuItem() Switch @GUI_CtrlId Case $mouseMenuItemClose ConsoleWrite("鼠标右键菜单点击了:111关闭" & @CRLF) ; 4.右击菜单“关闭”,切换ListView------------------------------------------------- GUICtrlSetState($lvInTabWorks, $GUI_HIDE) GUICtrlSetState($lvInTabProduces, $GUI_HIDE) GUICtrlSetState($lvInTabSchools, $GUI_HIDE) GUICtrlSetState($lvInTabProjects, $GUI_HIDE) GUICtrlSetState($lvInTabAssets, $GUI_HIDE) ; 1)鼠标右击的标签ID保存在全局变量$idOfTabItem里,如果是第一个标签 If $idOfTabItem = 0 Then _GUICtrlTab_SetCurSel($tabWelcome, 1) ; 那么首先切换到下一个标签 Else _GUICtrlTab_SetCurSel($tabWelcome, $idOfTabItem - 1) ; 否则前移 EndIf ; 2)移除右击的标签 _GUICtrlTab_DeleteItem ( $tabWelcome, $idOfTabItem ) ; 3)然后获取如今最新选中的标签 $strTabItemText = _GUICtrlTab_GetItemText ( $tabWelcome, _GUICtrlTab_GetCurSel ( $tabWelcome ) ) ; 4)根据标签切换ListView Switch $strTabItemText Case "工作日志" GUICtrlSetState($lvInTabWorks, $GUI_SHOW) Case "公司产品" GUICtrlSetState($lvInTabProduces, $GUI_SHOW) Case "学校信息" GUICtrlSetState($lvInTabSchools, $GUI_SHOW) Case "工程外包" GUICtrlSetState($lvInTabProjects, $GUI_SHOW) Case "资产管理" GUICtrlSetState($lvInTabAssets, $GUI_SHOW) EndSwitch $idOfTabItem = -1 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 ) ; 5.菜单栏菜单项切换ListView------------------------------------------------------------ GUICtrlSetState($lvInTabWorks, $GUI_HIDE) GUICtrlSetState($lvInTabProduces, $GUI_HIDE) GUICtrlSetState($lvInTabSchools, $GUI_HIDE) GUICtrlSetState($lvInTabProjects, $GUI_HIDE) GUICtrlSetState($lvInTabAssets, $GUI_HIDE) ; 1)查找目标标签 $id_item = _GUICtrlTab_FindTab ( $tabWelcome, $strItemName, True) ; 2)如果找到了 If $id_item <> -1 Then ; 如果已经处于选中状态 If _GUICtrlTab_GetItemState ( $tabWelcome, $id_item ) = $TCIS_BUTTONPRESSED Then If $id_item = 0 Then ; 同时是第一个标签 _GUICtrlTab_SetCurSel($tabWelcome, 1) ; 那么切换为选中下一个标签 Else _GUICtrlTab_SetCurSel($tabWelcome, 0) ; 否则选中第一个标签 EndIf EndIf ; 1> 移除目标标签 _GUICtrlTab_DeleteItem ( $tabWelcome, $id_item ) ; 2> 根据最新选中的标签切换ListView $strTabItemText = _GUICtrlTab_GetItemText ( $tabWelcome, _GUICtrlTab_GetCurSel ( $tabWelcome ) ) Switch $strTabItemText Case "工作日志" GUICtrlSetState($lvInTabWorks, $GUI_SHOW) Case "公司产品" GUICtrlSetState($lvInTabProduces, $GUI_SHOW) Case "学校信息" GUICtrlSetState($lvInTabSchools, $GUI_SHOW) Case "工程外包" GUICtrlSetState($lvInTabProjects, $GUI_SHOW) Case "资产管理" GUICtrlSetState($lvInTabAssets, $GUI_SHOW) EndSwitch ; 3)如果没有找到目标标签,那么创建,然后切换ListView Else Switch $strItemName Case "工作日志" $id_item = 0 Case "公司产品" $id_item = 1 Case "学校信息" $id_item = 2 Case "工程外包" $id_item = 3 Case "资产管理" $id_item = 4 EndSwitch ; 1> 创建标签 _GUICtrlTab_InsertItem ( $tabWelcome, $id_item, $strItemName, $id_item) ; 2> 使刚插入的标签选中 For $i = 0 To _GUICtrlTab_GetItemCount ( $tabWelcome ) - 1 Step 1 ; 遍历标签 If $strItemName = _GUICtrlTab_GetItemText ( $tabWelcome, $i ) Then ; 如果是刚插入的 _GUICtrlTab_SetCurSel($tabWelcome, $i) ; 选中 GUICtrlSetState($lvInTabWorks, $GUI_HIDE) GUICtrlSetState($lvInTabProduces, $GUI_HIDE) GUICtrlSetState($lvInTabSchools, $GUI_HIDE) GUICtrlSetState($lvInTabProjects, $GUI_HIDE) GUICtrlSetState($lvInTabAssets, $GUI_HIDE) ; 3> 切换ListView Switch $strItemName Case "工作日志" GUICtrlSetState($lvInTabWorks, $GUI_SHOW) Case "公司产品" GUICtrlSetState($lvInTabProduces, $GUI_SHOW) Case "学校信息" GUICtrlSetState($lvInTabSchools, $GUI_SHOW) Case "工程外包" GUICtrlSetState($lvInTabProjects, $GUI_SHOW) Case "资产管理" GUICtrlSetState($lvInTabAssets, $GUI_SHOW) EndSwitch EndIf Next EndIf EndFunc |
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/945.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设