#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUITab.au3>
Global Const $ODT_TAB = 101
Global Const $ODS_SELECTED = 0x0001
Global Const $ODA_DRAWENTIRE = 0x1
Global Const $ODS_FOCUS = 0x0010
Global $aBrushColor[3] = [2, 0xDDAA11, 0x99BBEE]
Global $aTabItem[3] = [2]
$hGUI = GUICreate("Draw Tab", 300, 200)
$hTab = GUICtrlCreateTab(10, 10, 280, 160, $TCS_OWNERDRAWFIXED)
$aTabItem[1] = GUICtrlCreateTabItem(" Item 1")
_GUICtrlTab_SetBkColor($hGUI, $hTab, $aBrushColor[1])
$aTabItem[2] = GUICtrlCreateTabItem(" Item 2")
_GUICtrlTab_SetBkColor($hGUI, $hTab, $aBrushColor[2])
GUICtrlCreateTabItem("")
$nButton = GUICtrlCreateButton("Create Tab", 10, 175, 60, 20)
GUISetState()
GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
_GUICtrlTab_SetCurSel($hTab, 1)
_GUICtrlTab_SetCurSel($hTab, 0)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $nButton
$aBrushColor[0] += 1
ReDim $aBrushColor[$aBrushColor[0]+1]
While _ColorIsDarkShade($aBrushColor[$aBrushColor[0]])
$aBrushColor[$aBrushColor[0]] = _ColorGetRandomColor()
WEnd
$aTabItem[0] += 1
ReDim $aTabItem[$aTabItem[0]+1]
$aTabItem[$aTabItem[0]] = GUICtrlCreateTabItem(" Item " & $aTabItem[0])
_GUICtrlTab_SetBkColor($hGUI, $hTab, $aBrushColor[$aBrushColor[0]])
GUICtrlSetState($aTabItem[$aTabItem[0]], $GUI_SHOW)
EndSwitch
WEnd
Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
Local $DRAWITEMSTRUCT
$DRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)
If DllStructGetData($DRAWITEMSTRUCT, "cType") <> $ODT_TAB Then Return $GUI_RUNDEFMSG
Local $cID = DllStructGetData($DRAWITEMSTRUCT, "cID")
Local $itmID = DllStructGetData($DRAWITEMSTRUCT, "itmID")
Local $itmAction = DllStructGetData($DRAWITEMSTRUCT, "itmAction")
Local $itmState = DllStructGetData($DRAWITEMSTRUCT, "itmState")
Local $hItm = DllStructGetData($DRAWITEMSTRUCT, "hItm")
Local $hDC = DllStructGetData($DRAWITEMSTRUCT, "hDC")
If $itmAction <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG
Local $itmText, $iBrushColor = _ColorSwitchRGBBGR($aBrushColor[$itmID+1])
DLLCall("gdi32.dll", "int", "SetBkMode", "hwnd", $hDC, "int", 1)
Local $iBrush = DLLCall("gdi32.dll", "hwnd", "CreateSolidBrush", "int", $iBrushColor)
$iBrush = $iBrush[0]
Local $iBrushOld = _WinAPI_SelectObject($hDC, $iBrush)
DLLCall("user32.dll", "int", "FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "hwnd", $iBrush)
Local $tBuffer = DllStructCreate("char[256]")
DllStructSetData($tBuffer, 1, "Item " & $itmID)
$itmText = DllStructGetData($tBuffer, 1)
DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 1) + 10, 1)
DllStructSetData($DRAWITEMSTRUCT, "itmRect", DllStructGetData($DRAWITEMSTRUCT, "itmRect", 2) + 3, 2)
DllCall("user32.dll", "int", "DrawText", "hwnd", $hDC, "str", $itmText, "int", StringLen($itmText), _
"ptr", DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), "int", $DT_LEFT)
_WinAPI_SelectObject($hDC, $iBrushOld)
_WinAPI_DeleteObject($iBrush)
Return $GUI_RUNDEFMSG
EndFunc
Func _GUICtrlTab_SetBkColor($hWnd, $hSysTab32, $sBkColor)
Local $aTabPos = ControlGetPos($hWnd, "", $hSysTab32)
Local $aTab_Rect = _GUICtrlTab_GetItemRect($hSysTab32, -1)
GUICtrlCreateLabel("", $aTabPos[0]+2, $aTabPos[1]+$aTab_Rect[3]+4, $aTabPos[2]-6, $aTabPos[3]-$aTab_Rect[3]-7)
GUICtrlSetBkColor(-1, $sBkColor)
GUICtrlSetState(-1, $GUI_DISABLE)
EndFunc
Func _ColorGetRandomColor()
Return "0x" & Hex(Random(1, 255, 1) & Random(1, 255, 1) & Random(1, 255, 1), 6)
EndFunc
Func _ColorIsDarkShade($nColor)
Local $i_Red = BitAND(BitShift($nColor, 16), 0xFF)
Local $i_Green = BitAND(BitShift($nColor, 8), 0xFF)
Local $i_Blue = BitAND($nColor, 0xFF)
Local $iMidle_Color_Val = Int(765 / 2) ;765 is the total of 255 + 255 + 255
Return (($i_Red + $i_Green + $i_Blue) < $iMidle_Color_Val)
EndFunc
Func _ColorSwitchRGBBGR($iColor)
Local $iMask = BitXOR(BitAND($iColor, 0xFF), ($iColor / 0x10000))
Return "0x" & Hex(BitXOR($iColor, ($iMask * 0x10001)), 6)
EndFunc