通过扩展 Tab3 控件,实现了 Tab 控件的高级功能。它展示了如何使用自定义函数操作 Tab 控件的各种属性和行为,包括设置图标、调整大小、设置样式、获取/设置选项卡内容等。
#NoEnv
; #Include TC_EX.ahk
; 创建ImageList(手册中的示例)
HIL := IL_Create(10) ; 创建一个ImageList以容纳10个小图标。
Loop 10 ; 从DLL加载带有一系列图标的ImageList。
IL_Add(HIL, "shell32.dll", A_Index) ; 省略DLL的路径,以便它也能在Windows 9x上运行。
; 创建GUI
Gui, Margin, 10, 10
Gui, Add, Tab3, w400 h200 HwndHTC, Tab 1|Tab 2|Tab 3
; TC_EX_SetPadding(10, 10)
Loop % TC_EX_GetCount(HTC) {
Gui, Tab, %A_Index%
Gui, Add, Text, , 这是 Tab %A_Index%!
}
TC_EX_SetImageList(HTC, HIL)
Loop % TC_EX_GetCount(HTC)
TC_EX_SetIcon(HTC, A_Index, A_Index)
Gui, Add, StatusBar, , % " TC_EX_GetText(HTC, 3) -> " . TC_EX_GetText(HTC, 3)
Gui, Show, , Class GuiControlTabEx
WinGet, Styles, Style, ahk_id %HTC%
WinGet, ExStyles, ExStyle, ahk_id %HTC%
MsgBox, 0, Styles & ExStyles, %Styles%`r`n%ExStyles%`n`n接下来将自动演示一些使用方法
; 演示一些方法
; TC_EX_SetMinWidth(100)
TC_EX_GetInterior(HTC, X, Y, W, H)
MsgBox, 0, GetInterior(HTC), X: %X% - Y: %Y% - W: %W% - H: %H%
SB_SetText(" 【突出Tab2】 TC_EX_HighLight(HTC, 2)")
TC_EX_HighLight(HTC, 2)
Sleep, 2000
TC_EX_HighLight(HTC, 2, False)
SB_SetText(" 【修改第3个Tab名称】 TC_EX_SetText(HTC, 3, ""Tab 4"")")
TC_EX_SetText(HTC, 3, "Tab 4")
Sleep, 2000
SB_SetText(" 【切换到第3个Tab】 TC_EX_SetSel(HTC, 3)")
TC_EX_SetSel(HTC, 3)
Sleep, 2000
SB_SetText(" 【删除末尾的Tab】 TC_EX_RemoveLast(HTC)")
TC_EX_RemoveLast(HTC)
Sleep, 2000
SB_SetText(" 演示结束,感谢您的关注!")
Return
GuiClose:
IL_Destroy(HIL) ; Required for image lists used by tab controls.
ExitApp
; ================================================================
; Namespace: TC_EX
; Function: Some functions to use with AHK GUI Tab2 controls (TC).
; Tested with: AHK 1.1.13.01 (A32/U32/U64)
; Tested on: Win 7 (x64)
; Changelog:
; 1.0.01.00/2014-01-06/just me - changed function name Delete to RemoveLast.
; 1.0.00.00/2014-01-04/just me - initial release
; Common function parameters:
; HTC - Handle to the tab control.
; TabIndex - 1-based index of the tab.
; TabText - Text of the tab's label.
; IconIndex - 1-based index of the icon in the tab control's image list. Specify 0 for no icon.
; ================================================================
; This software is provided 'as-is', without any express or implied warranty.
; In no event will the authors be held liable for any damages arising from the use of this software.
; ================================================================
; Add Adds a new tab at the end of the tabs control.
; Return values: Returns the 1-based index of the new tab if successful, or 0 otherwise.
; ================================================================
TC_EX_Add(HTC, TabText, IconIndex := 0) {
Static TCIF_TEXT := 0x0001
Static TCIF_IMAGE := 0x0002
Static TCM_INSERTITEM := A_IsUnicode ? 0x133E : 0x1307 ; TCM_INSERTITEMW : TCM_INSERTITEMA
Static OffImg := (3 * 4) + (A_PtrSize - 4) + A_PtrSize + 4
Static OffTxP := (3 * 4) + (A_PtrSize - 4)
TC_EX_CreateTCITEM(TCITEM)
Flags := TCIF_TEXT
If (ItemIcon > 0)
Flags |= TCIF_IMAGE
NumPut(Flags, TCITEM, 0, "UInt")
NumPut(&TabText, TCITEM, OffTxP, "Ptr")
If (ItemIcon > 0)
NumPut(IconIndex - 1, TCITEM, OffImg, "Int")
SendMessage, % TCM_INSERTITEM, % TC_EX_GetCount(HTC), % &TCITEM, , % "ahk_id " . HTC
Return ErrorLevel + 1
}
; ================================================================
; CreateTCITEM >>> For internal use! <<< Creates and initializes a TCITEM structure.
; ================================================================
TC_EX_CreateTCITEM(ByRef TCITEM) {
Static Size := (5 * 4) + (2 * A_PtrSize) + (A_PtrSize - 4)
VarSetCapacity(TCITEM, Size, 0)
}
; ================================================================
; GetCount Retrieves the number of tabs in a tab control.
; Return values: Returns the number of tabs if successful, or zero otherwise.
; ================================================================
TC_EX_GetCount(HTC) {
Static TCM_GETITEMCOUNT := 0x1304
SendMessage, % TCM_GETITEMCOUNT, 0, 0, , % "ahk_id " . HTC
Return ErrorLevel
}
; ================================================================
; GetFocus Returns the index of the tab that has the focus.
; Return values: Returns the index of the tab that has the focus.
; ================================================================
TC_EX_GetFocus(HTC) {
Static TCM_GETCURFOCUS := 0x132F
SendMessage, % TCM_GETCURFOCUS, 0, 0, , % "ahk_id " . HTC
Return ErrorLevel + 1
}
; ================================================================
; GetIcon Retrieves the icon assigned to the specified tab in a tab control.
; Return values: Returns the 1-based icon index if successful, or False otherwise.
; ================================================================
TC_EX_GetIcon(HTC, TabIndex) {
Static TCIF_IMAGE := 0x0002
Static TCM_GETITEM := A_IsUnicode ? 0x133C : 0x1305 ; TCM_GETITEMW : TCM_GETITEMA
Static OffImg := (3 * 4) + (A_PtrSize - 4) + A_PtrSize + 4
If (TabIndex < 0) or (TabIndex > TC_EX_GetCount(HTC))
Return False
TC_EX_CreateTCITEM(TCITEM)
NumPut(TCIF_IMAGE, TCITEM, 0, "UInt")
SendMessage, % TCM_GETITEM, % (TabIndex - 1), % &TCITEM, , % "ahk_id " . HTC
If (ErrorLevel = 0)
Return False
Return NumGet(TCITEM, OffImg, "Int") + 1
}
; ================================================================
; GetInterior Retrieves the display area of a tab control relative to it's window.
; Return values: Always True.
; ================================================================
TC_EX_GetInterior(HTC, ByRef X, ByRef Y, ByRef W, ByRef H) {
Static TCM_ADJUSTRECT := 0x1328
X := Y := W := H := 0
VarSetCapacity(RECT, 16, 0)
DllCall("User32.dll\GetClientRect", "Ptr", HTC, "Ptr", &RECT)
SendMessage, % TCM_ADJUSTRECT, 0, % &RECT, , % "ahk_id " . HTC
X := NumGet(RECT, 0, "Int")
Y := NumGet(RECT, 4, "Int")
W := NumGet(RECT, 8, "Int")
H := NumGet(RECT, 12, "Int")
Return True
}
; ================================================================
; GetRect Retrieves the bounding rectangle for a tab in a tab control.
; Return values: Returns True if successful, or False otherwise.
; ================================================================
TC_EX_GetRect(HTC, TabIndex, ByRef X, ByRef Y, ByRef W, ByRef H) {
Static TCM_GETITEMRECT := 0x130A
X := Y := W := H := 0
If (TabIndex < 0) or (TabIndex > TC_EX_GetCount(HTC))
Return False
VarSetCapacity(RECT, 16, 0)
SendMessage, % TCM_GETITEMRECT, % (TabIndex - 1), % &RECT, , % "ahk_id " . HTC
If (ErrorLevel = 0)
Return False
X := NumGet(RECT, 0, "Int")
Y := NumGet(RECT, 4, "Int")
W := NumGet(RECT, 8, "Int")
H := NumGet(RECT, 12, "Int")
Return True
}
; ================================================================
; GetSel Determines the currently selected tab in a tab control.
; Return values: Returns the 1-based index of the selected tab if successful, or 0 if no tab is selected.
; ================================================================
TC_EX_GetSel(HTC) {
Static TCM_GETCURSEL := 0x130B
SendMessage, % TCM_GETCURSEL, 0, 0, , % "ahk_id " . HTC
Return ErrorLevel + 1
}
; ================================================================
; GetText Retrieves the label assigned to the specified tab in a tab control.
; Return values: Returns the label of the specified tab if successful, or an empty string otherwise.
; ================================================================
TC_EX_GetText(HTC, TabIndex) {
Static TCIF_TEXT := 0x0001
Static TCM_GETITEM := A_IsUnicode ? 0x133C : 0x1305 ; TCM_GETITEMW : TCM_GETITEMA
Static OffTxL := (3 * 4) + (A_PtrSize - 4) + A_PtrSize
Static OffTxP := (3 * 4) + (A_PtrSize - 4)
Static MaxLength := 256
If (TabIndex < 0) or (TabIndex > TC_EX_GetCount(HTC))
Return
VarSetCapacity(ItemText, MaxLength * (A_IsUnicode ? 2 : 1), 0)
TC_EX_CreateTCITEM(TCITEM)
NumPut(TCIF_TEXT, TCITEM, 0, "UInt")
NumPut(&ItemText, TCITEM, OffTxP, "Ptr")
NumPut(MaxLength, TCITEM, OffTxL, "Int")
SendMessage, % TCM_GETITEM, % (TabIndex - 1), % &TCITEM, , % "ahk_id " . HTC
If (ErrorLevel = 0)
Return
TxtPtr := NumGet(TCITEM, OffTxP, "UPtr")
If (TxtPtr = 0)
Return
Return StrGet(TxtPtr, MaxLength)
}
; ================================================================
; HighLight Sets the highlight state of a tab in a tab control.
; Parameters: HighLight - True /False
; Return values: Returns nonzero if successful, or zero otherwise.
; ================================================================
TC_EX_HighLight(HTC, TabIndex, HighLight := True) {
Static TCM_HIGHLIGHTITEM := 0x1333
If (TabIndex < 0) or (TabIndex > TC_EX_GetCount(HTC))
Return False
SendMessage, % TCM_HIGHLIGHTITEM, % (TabIndex - 1), % HighLight, , % "ahk_id " . HTC
Return ErrorLevel
}
; ================================================================
; RemoveLast Removes the last tab of a tab control, if it is not the only one.
; Return values: Returns True if successful, or False otherwise.
; ================================================================
TC_EX_RemoveLast(HTC) {
Static TCM_DELETEITEM := 0x1308
TabIndex := TC_EX_GetCount(HTC)
If (TabIndex < 2)
Return False
CurSel := TC_EX_GetSel(HTC)
SendMessage, % TCM_DELETEITEM, % (TabIndex - 1), 0, , % "ahk_id " . HTC
If (ErrorLevel = 0)
Return False
Items := TC_EX_GetCount(HTC)
If (CurSel > Items)
CurSel := Items
Return TC_EX_SetSel(HTC, CurSel)
}
; ================================================================
; SetIcon Assigns an icon to a tab in a tab control.
; Return values: Returns True if successful, or False otherwise.
; ================================================================
TC_EX_SetIcon(HTC, TabIndex, IconIndex) {
Static TCIF_IMAGE := 0x0002
Static TCM_SETITEM := A_IsUnicode ? 0x133D : 0x1306 ; TCM_SETITEMW : TCM_SETITEMA
Static OffImg := (3 * 4) + (A_PtrSize - 4) + A_PtrSize + 4
If (TabIndex < 0) or (TabIndex > TC_EX_GetCount(HTC))
Return False
TC_EX_CreateTCITEM(TCITEM)
NumPut(TCIF_IMAGE, TCITEM, 0, "UInt")
NumPut(IconIndex - 1, TCITEM, OffImg, "Int")
SendMessage, % TCM_SETITEM, % (TabIndex - 1), % &TCITEM, , % "ahk_id " . HTC
Return ErrorLevel
}
; ================================================================
; SetImageList Assigns an image list to a tab control.
; Parameters: HIL - Handle to the image list.
; Return values: Always True.
; ================================================================
TC_EX_SetImageList(HTC, HIL) {
Static TCM_SETIMAGELIST := 0x1303
SendMessage, % TCM_SETIMAGELIST, 0, % HIL, , % "ahk_id " . HTC
Return True
}
; ================================================================
; SetFocus Sets the focus to a specified tab in a tab control.
; Return values: Returns True if successful, or False otherwise.
; ================================================================
TC_EX_SetFocus(HTC, TabIndex) {
Static TCM_SETCURFOCUS := 0x1330
If (TabIndex < 0) or (TabIndex > TC_EX_GetCount(HTC))
Return False
SendMessage, % TCM_SETCURFOCUS, % (TabIndex - 1), 0, , % "ahk_id " . HTC
Return True
}
; ================================================================
; SetMinWidth Sets the minimum width of items in a tab control.
; Parameters: Width - New minimum width, in pixels
; If this parameter is set to -1, the control will use the default tab width.
; Return values: Returns an INT value that represents the previous minimum tab width.
; ================================================================
TC_EX_SetMinWidth(HTC, Width) {
Static TCM_SETMINTABWIDTH := 0x1331
SendMessage, % TCM_SETMINTABWIDTH, 0, % Width, , % "ahk_id " . HTC
Return ErrorLevel
}
; ================================================================
; SetPadding Sets the amount of space (padding) around each tab's icon and label in a tab control.
; Parameters: Horizontal - Specifies the amount of horizontal padding, in pixels.
; Vertical - Specifies the amount of vertical padding, in pixels.
; Redraw - True / False - immediately redraw the tab control
; Return values: Always True.
; Note: You should call this method before adding any controls to the Tab to ensure that
; default positioning will work as expected.
; AHK seems to use defaults of 6 for horizontal and 3 for vertical padding, so values smaller
; these will be set to the defaults internally.
; ================================================================
TC_EX_SetPadding(HTC, Horizontal, Vertical, Redraw = False) {
Static TCM_SETPADDING := 0x132B
Static DefaultH := 6
Static DefaultV := 3
If (Horizontal < DefaultH)
Horizontal := DefaultH
If (Vertical < DefaultV)
Vertical := DefaultV
Padding := Horizontal | (Vertical << 16)
SendMessage, % TCM_SETPADDING, 0, % Padding, , % "ahk_id " . HTC
If (Redraw)
TC_EX_SetText(HTC, 1, TC_EX_GetText(HTC, 1))
Return True
}
; ================================================================
; SetSel Selects a tab in a tab control.
; Return values: Returns the 1-based index of the previously selected tab if successful, or 0 otherwise.
; ================================================================
TC_EX_SetSel(HTC, TabIndex) {
Static TCM_SETCURSEL := 0x130C
Static TCN_SELCHANGE := -551
Static WM_NOTIFY := 0x004E
CurSel := TC_EX_GetSel(HTC) - 1
If (TabIndex < 0) or (TabIndex > TC_EX_GetCount(HTC))
Return False
SendMessage, % TCM_SETCURSEL, % (TabIndex - 1), 0, , % "ahk_id " . HTC
If (ErrorLevel != CurSel)
Return 0
RetVal := ErrorLevel + 1
; A tab control does not send a TCN_SELCHANGING or TCN_SELCHANGE notification code when a tab is selected
; using this message. So it must be done manually, at least for AHK.
CID := DllCall("User32.dll\GetDlgCtrlID", "Ptr", HTC, "Int")
Parent := DllCall("User32.dll\GetParent", "Ptr", HTC, "UPtr")
VarSetCapacity(NMHDR, 3 * A_PtrSize, 0)
NumPut(HTC, NMHDR, 0, "Ptr")
NumPut(CID, NMHDR, A_PtrSize, "Ptr")
NumPut(TCN_SELCHANGE, NMHDR, A_PtrSize * 2, "Int")
SendMessage, % WM_NOTIFY, % HTC, % &NMHDR, , % "ahk_id " . Parent
Return RetVal
}
; ================================================================
; SetSize Sets the width and height of tabs in a fixed-width or owner-drawn tab control.
; Parameters: Width - New width in pixels
; Height - New height in pixels
; Return values: Returns True if successful, or False otherwise.
; Note: The width won't be used unless the tab control has the TCS_FIXEDWIDTH style (0x0400).
; ================================================================
TC_EX_SetSize(HTC, Width, Height) {
Static TCM_SETITEMSIZE := 0x1329
If (Height < 0) || (Height > 0xFFFF)
Return False
If (Width < 0) || (Width > 0xFFFF)
Return False
Size := Width | (Height << 16)
SendMessage, % TCM_SETITEMSIZE, 0, % Size, , % "ahk_id " . HTC
Return True
}
; ================================================================
; SetText Assigns a label to the specified tab in a tab control.
; Return values: Returns True if successful, or False otherwise.
; ================================================================
TC_EX_SetText(HTC, TabIndex, TabText) {
Static TCIF_TEXT := 0x0001
Static TCM_SETITEM := A_IsUnicode ? 0x133D : 0x1306 ; TCM_SETITEMW : TCM_SETITEMA
Static OffTxP := (3 * 4) + (A_PtrSize - 4)
If (TabIndex < 0) or (TabIndex > TC_EX_GetCount(HTC))
Return False
TC_EX_CreateTCITEM(TCITEM)
NumPut(TCIF_TEXT, TCITEM, 0, "UInt")
NumPut(&TabText, TCITEM, OffTxP, "Ptr")
SendMessage, % TCM_SETITEM, % (TabIndex - 1), % &TCITEM, , % "ahk_id " . HTC
Return ErrorLevel
}
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)