展示了一个复杂的  GUI 实现,其中使用了多层嵌套的选项卡(Tab)控件,子窗口与控件被动态生成和管理,最终形成了一种类似于多页面叠加的用户界面结构。

 

Plain text
复制到剪贴板
Open code in new window
EnlighterJS 3 Syntax Highlighter
; 多页面选项卡叠加的例子 By FeiYue
; 注意:Tab3不能叠加到其他页面
ids:=[]
Gui, +Hwndmain_id
Gui, Margin, 15, 15
;-- Tab3不能叠加到其他页面
Gui, Add, Tab3, w500 h300 AltSubmit, 1|2|3
Loop, 3 {
Gui, Tab, % i:=A_Index
Gui, Add, Edit, w200 Section Hwndid, % 随机数()
ids.Push(id)
Gui, Add, Button, x+15 wp Hwndid gRun1, OK
ids.Push(id)
;-- 在页面中设置一个控件作为父窗口
Gui, Add, Text, xs Hwndid w415 h200
;----------------------------
;-- 根据父窗口的宽高生成一个只有Tab2控件的子窗口
GuiControlGet, p, Pos, %id%
Gui, New, +Hwndsub_id +Parent%id% -Caption +ToolWindow
Gui, Add, Tab2, x0 y0 w%pW% h%pH%, %i%-1|%i%-2|%i%-3
Gui, Margin, 15, 15
Loop, 3 {
Gui, Tab, % j:=A_Index
Gui, Add, Edit, w180 Section Hwndid, % 随机数()
ids.Push(id)
Gui, Add, Button, x+15 wp Hwndid gRun1, OK
ids.Push(id)
;-- 在页面中设置一个控件作为父窗口
Gui, Add, Text, xs Hwndid w375 h100
;----------------------------
;-- 根据父窗口的宽高生成一个只有Tab2控件的子窗口
GuiControlGet, p, Pos, %id%
Gui, New, +Hwndsub_sub_id +Parent%id% -Caption +ToolWindow
Gui, Add, Tab2, x0 y0 w%pW% h%pH%, %i%-%j%-1|%i%-%j%-2|%i%-%j%-3
Gui, Margin, 15, 15
Loop, 3 {
Gui, Tab, % A_Index
Gui, Add, Edit, w150 Hwndid, % 随机数()
ids.Push(id)
Gui, Add, Button, x+15 w150 Hwndid gRun1, OK
ids.Push(id)
}
Gui, Tab
Gui, Margin, 0, 0
;-- 设定边距为零后只显示Tab2控件的大小
Gui, Show, NA
;----------------------------
;-- 返回父窗口的默认GUI编号
Gui, %sub_id%: Default
}
Gui, Tab
Gui, Margin, 0, 0
;-- 设定边距为零后只显示Tab2控件的大小
Gui, Show, NA
;----------------------------
;-- 返回父窗口的默认GUI编号
Gui, %main_id%: Default
}
Gui, Tab
Gui, Show
;-------------------------
Menu, Tray, Add
Menu, Tray, Add, 显示窗口
Menu, Tray, Default, 显示窗口
Menu, Tray, Click, 1
return
显示窗口() {
Gui, 1:Show
}
随机数() {
Random, r
return r
}
;-- 使用函数的好处是可以得到控件的 Hwnd
;-- 函数中同样可以使用 A_GuiControl
Run1(hwnd, arg*) {
global ids
;-- 根据控件的 Hwnd 得到控件的序号
i:=0
For k,v in ids
if (v=hwnd)
i:=k
;-- 根据控件的序号得到目标控件的 hwnd
hwnd:=ids[i-1]
if !DllCall("IsWindow", "ptr",hwnd)
return
GuiControlGet, s,, %hwnd%
MsgBox, 4096,, %s%
}
F1:: 显示窗口()
F4::
IfWinExist, ahk_class Notepad
{
ControlSend,, ^s
Sleep, 500
}
Reload
return
; 多页面选项卡叠加的例子 By FeiYue ; 注意:Tab3不能叠加到其他页面 ids:=[] Gui, +Hwndmain_id Gui, Margin, 15, 15 ;-- Tab3不能叠加到其他页面 Gui, Add, Tab3, w500 h300 AltSubmit, 1|2|3 Loop, 3 { Gui, Tab, % i:=A_Index Gui, Add, Edit, w200 Section Hwndid, % 随机数() ids.Push(id) Gui, Add, Button, x+15 wp Hwndid gRun1, OK ids.Push(id) ;-- 在页面中设置一个控件作为父窗口 Gui, Add, Text, xs Hwndid w415 h200 ;---------------------------- ;-- 根据父窗口的宽高生成一个只有Tab2控件的子窗口 GuiControlGet, p, Pos, %id% Gui, New, +Hwndsub_id +Parent%id% -Caption +ToolWindow Gui, Add, Tab2, x0 y0 w%pW% h%pH%, %i%-1|%i%-2|%i%-3 Gui, Margin, 15, 15 Loop, 3 { Gui, Tab, % j:=A_Index Gui, Add, Edit, w180 Section Hwndid, % 随机数() ids.Push(id) Gui, Add, Button, x+15 wp Hwndid gRun1, OK ids.Push(id) ;-- 在页面中设置一个控件作为父窗口 Gui, Add, Text, xs Hwndid w375 h100 ;---------------------------- ;-- 根据父窗口的宽高生成一个只有Tab2控件的子窗口 GuiControlGet, p, Pos, %id% Gui, New, +Hwndsub_sub_id +Parent%id% -Caption +ToolWindow Gui, Add, Tab2, x0 y0 w%pW% h%pH%, %i%-%j%-1|%i%-%j%-2|%i%-%j%-3 Gui, Margin, 15, 15 Loop, 3 { Gui, Tab, % A_Index Gui, Add, Edit, w150 Hwndid, % 随机数() ids.Push(id) Gui, Add, Button, x+15 w150 Hwndid gRun1, OK ids.Push(id) } Gui, Tab Gui, Margin, 0, 0 ;-- 设定边距为零后只显示Tab2控件的大小 Gui, Show, NA ;---------------------------- ;-- 返回父窗口的默认GUI编号 Gui, %sub_id%: Default } Gui, Tab Gui, Margin, 0, 0 ;-- 设定边距为零后只显示Tab2控件的大小 Gui, Show, NA ;---------------------------- ;-- 返回父窗口的默认GUI编号 Gui, %main_id%: Default } Gui, Tab Gui, Show ;------------------------- Menu, Tray, Add Menu, Tray, Add, 显示窗口 Menu, Tray, Default, 显示窗口 Menu, Tray, Click, 1 return 显示窗口() { Gui, 1:Show } 随机数() { Random, r return r } ;-- 使用函数的好处是可以得到控件的 Hwnd ;-- 函数中同样可以使用 A_GuiControl Run1(hwnd, arg*) { global ids ;-- 根据控件的 Hwnd 得到控件的序号 i:=0 For k,v in ids if (v=hwnd) i:=k ;-- 根据控件的序号得到目标控件的 hwnd hwnd:=ids[i-1] if !DllCall("IsWindow", "ptr",hwnd) return GuiControlGet, s,, %hwnd% MsgBox, 4096,, %s% } F1:: 显示窗口() F4:: IfWinExist, ahk_class Notepad { ControlSend,, ^s Sleep, 500 } Reload return
; 多页面选项卡叠加的例子  By FeiYue
; 注意:Tab3不能叠加到其他页面

ids:=[]
Gui, +Hwndmain_id
Gui, Margin, 15, 15
;-- Tab3不能叠加到其他页面
Gui, Add, Tab3, w500 h300 AltSubmit, 1|2|3
Loop, 3 {
  Gui, Tab, % i:=A_Index
  Gui, Add, Edit, w200 Section Hwndid, % 随机数()
  ids.Push(id)
  Gui, Add, Button, x+15 wp Hwndid gRun1, OK
  ids.Push(id)
  ;-- 在页面中设置一个控件作为父窗口
  Gui, Add, Text, xs Hwndid w415 h200
  ;----------------------------
  ;-- 根据父窗口的宽高生成一个只有Tab2控件的子窗口
  GuiControlGet, p, Pos, %id%
  Gui, New, +Hwndsub_id +Parent%id% -Caption +ToolWindow
  Gui, Add, Tab2, x0 y0 w%pW% h%pH%, %i%-1|%i%-2|%i%-3
  Gui, Margin, 15, 15
  Loop, 3 {
    Gui, Tab, % j:=A_Index
    Gui, Add, Edit, w180 Section Hwndid, % 随机数()
    ids.Push(id)
    Gui, Add, Button, x+15 wp Hwndid gRun1, OK
    ids.Push(id)
    ;-- 在页面中设置一个控件作为父窗口
    Gui, Add, Text, xs Hwndid w375 h100
    ;----------------------------
    ;-- 根据父窗口的宽高生成一个只有Tab2控件的子窗口
    GuiControlGet, p, Pos, %id%
    Gui, New, +Hwndsub_sub_id +Parent%id% -Caption +ToolWindow
    Gui, Add, Tab2, x0 y0 w%pW% h%pH%, %i%-%j%-1|%i%-%j%-2|%i%-%j%-3
    Gui, Margin, 15, 15
    Loop, 3 {
      Gui, Tab, % A_Index
      Gui, Add, Edit, w150 Hwndid, % 随机数()
      ids.Push(id)
      Gui, Add, Button, x+15 w150 Hwndid gRun1, OK
      ids.Push(id)
    }
    Gui, Tab
    Gui, Margin, 0, 0
    ;-- 设定边距为零后只显示Tab2控件的大小
    Gui, Show, NA
    ;----------------------------
    ;-- 返回父窗口的默认GUI编号
    Gui, %sub_id%: Default
  }
  Gui, Tab
  Gui, Margin, 0, 0
  ;-- 设定边距为零后只显示Tab2控件的大小
  Gui, Show, NA
  ;----------------------------
  ;-- 返回父窗口的默认GUI编号
  Gui, %main_id%: Default
}
Gui, Tab
Gui, Show
;-------------------------
Menu, Tray, Add
Menu, Tray, Add, 显示窗口
Menu, Tray, Default, 显示窗口
Menu, Tray, Click, 1
return

显示窗口() {
  Gui, 1:Show
}

随机数() {
  Random, r
  return r
}

;-- 使用函数的好处是可以得到控件的 Hwnd
;-- 函数中同样可以使用 A_GuiControl
Run1(hwnd, arg*) {
  global ids
  ;-- 根据控件的 Hwnd 得到控件的序号
  i:=0
  For k,v in ids
    if (v=hwnd)
      i:=k
  ;-- 根据控件的序号得到目标控件的 hwnd
  hwnd:=ids[i-1]
  if !DllCall("IsWindow", "ptr",hwnd)
    return
  GuiControlGet, s,, %hwnd%
  MsgBox, 4096,, %s%
}

F1:: 显示窗口()

F4:: 
IfWinExist, ahk_class Notepad
{
  ControlSend,, ^s
  Sleep, 500
}
Reload
return

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。