Что нового

как изменить фоновый цвет вкладок и фона у функции GUICtrlCreateTab?

Trans

Знающий
Сообщения
257
Репутация
6
в название темы всё подробно написано=)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Если вид не классический, то "нормальным" способом это сделать нельзя, т.к. для отрисовки Tab'ов Windows использует темы оформления, читай картинки. Можно, конечно, указать TCS_OWNERDRAWFIXED, но гимора будет целый вагон и маленькая тележка. Поэтому, самый простой способ, это поместить элемент Label поверх Tab и покрасить в нужный цвет.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот пример с TCS_OWNERDRAWFIXED:

Код:
#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
 
Верх