Что нового

Решение проблемы цвета для элементов на Tab'ах

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Способ решения проблемы, связанной с некорректным отображением цвета для некоторых элементов GUI (Slider, Checkbox и т.д), расположенных на Tab'ах. Для запуска примера необходимо скачать библиотеку WinAPIEx.au3.


Код:
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $hForm, $Msg, $Tab, $hTab, $Button, $Slider, $Color, $Part

$hForm = GUICreate('MyGUI', 400, 400)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg', $hForm)
$Button = GUICtrlCreateButton('Set Theme Color', 140, 368, 115, 23)
$Tab = GUICtrlCreateTab(7, 7, 388, 354)
$hTab = GUICtrlGetHandle($Tab)
GUICtrlCreateTabItem('About')
$Slider = GUICtrlCreateSlider(20, 45, 360, 26)
GUICtrlCreateTabItem('')
GUISetState()

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Button
			Switch @OSVersion
				Case 'WIN_2000', 'WIN_XP', 'WIN_2003'
					$Part = 10
				Case Else
					$Part = 11
			EndSwitch
			$Color = _WinAPI_GetThemeColor($hTab, 'TAB', $Part, 1, 0x0EED)
			If Not @error Then
				GUICtrlSetBkColor($Slider, $Color)
			EndIf
	EndSwitch
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 273
Репутация
2 352
У меня всё ровно цвета немного не сходятся...

Я для себя решаю эту проблему так:

Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate("_GUICtrlTabSetBkColor Demo", 400, 400)

$nTab = GUICtrlCreateTab(10, 10, 380, 370)
_GUICtrlTabSetBkColor($hGUI, $nTab, 0xFFFFFF)

GUICtrlCreateTabItem("Tab Item")

$nSlider = GUICtrlCreateSlider(20, 50, 360, 23)
GUICtrlSetBkColor(-1, 0xFFFFFF)

GUICtrlCreateCheckbox("Checkbox", 25, 90)
GUICtrlSetBkColor(-1, 0xFFFFFF)

GUICtrlCreateTabItem("")
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
WEnd

Func _GUICtrlTabSetBkColor($hWnd, $hSysTab32, $sBkColor)
	;Disabled Label to hold the color
	Local $aTabPos = ControlGetPos($hWnd, "", $hSysTab32)
	
	GUICtrlCreateLabel("", $aTabPos[0] + 2, $aTabPos[1] + 23, $aTabPos[2] - 5, $aTabPos[3] - 26)
	GUICtrlSetState(-1, $GUI_DISABLE)
	GUICtrlSetBkColor(-1, $sBkColor)
EndFunc
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
CreatoR сказал(а):
У меня всё ровно цвета немного не сходятся...
Это потому, что Tab в твоей Theme имеет градиент, а функция возвращает верхний цвет этого градиента.

Но как в твоем методе получить цвет Tab, что бы не отличалось от установленной Theme? Белый не всегда подходит. Кстати, я пользуюсь примерно тем же, но цвет $sBkColor получаю с помощью вышепреведенной функции.

;)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 273
Репутация
2 352
Yashied [?]
как в твоем методе получить цвет Tab, что бы не отличалось от установленной Theme?
Вроде вот так ещё можно:

Код:
$Color = _GetSystemColor("Window")

Func _GetSystemColor($sElement)
	Local $sColorsRead = RegRead("HKEY_CURRENT_USER\Control Panel\Colors", $sElement)
	If @error Then Return SetError(1, 0, 0xFFFFFF)
	
	Local $aSplit = StringSplit($sColorsRead, ' ')
	Return "0x" & Hex(Dec(Hex($aSplit[1], 2) & Hex($aSplit[2], 2) & Hex($aSplit[3], 2)), 6)
EndFunc
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Это цвет окна, а не Tab'а.

PS

А твою функцию можно записать немного покороче. :smile:

Код:
_WinAPI_GetSysColor($COLOR_WINDOW)
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Выложи скриншот (полный), если можно.

:smile:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
CreatoR сказал(а):
Любого окна, где есть вкладки. Например диалог Mouse Properties. Только в PNG или BMP формате.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 273
Репутация
2 352
Yashied [?]
Любого окна, где есть вкладки


Кстати, как у тебя вот такой пример будет отображаться:

Код:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
;

$hForm = GUICreate('MyGUI', 400, 400)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg', $hForm)

$Button = GUICtrlCreateButton('Set Theme Color', 140, 368, 115, 23)

$Tab = GUICtrlCreateTab(7, 7, 388, 354)
$hTab = GUICtrlGetHandle($Tab)

GUICtrlCreateTabItem('About')

$Slider = GUICtrlCreateSlider(20, 45, 360, 26)

GUICtrlCreateTabItem('')
GUISetState()

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Button
			$iTheme_Color = _WinAPI_GetThemeColor($hTab, 'TAB', 1, 0x0EED)
			
			_GUICtrlTabSetBkColor($hForm, $hTab, $iTheme_Color)
			GUICtrlSetBkColor($Slider, $iTheme_Color)
			_WinAPI_RedrawWindow(GUICtrlGetHandle($Slider), 5)
	EndSwitch
WEnd

Func _WinAPI_GetThemeColor($hWnd, $sClass, $iState, $iProp)
	Local $iPart = 11
	If StringRegExp(@OSVersion, "\A(WIN_2000|WIN_XP|WIN_200)\z") Then $iPart = 10
	
	Local $hTheme = DllCall('uxtheme.dll', 'ptr', 'OpenThemeData', 'hwnd', $hWnd, 'wstr', $sClass)
	Local $Ret = DllCall('uxtheme.dll', 'lresult', 'GetThemeColor', _
			'ptr', $hTheme[0], 'int', $iPart, 'int', $iState, 'int', $iProp, 'dword*', 0)

	If (@error) Or ($Ret[0] < 0) Then $Ret = -1
	
	DllCall('uxtheme.dll', 'lresult', 'CloseThemeData', 'ptr', $hTheme[0])
	If $Ret = -1 Then Return SetError(1, 0, -1)
	
	Local $iColor = $Ret[5]
	
	Return SetError(0, 0, _
			BitOR(BitAND($iColor, 0x00FF00), BitShift(BitAND($iColor, 0x0000FF), -16), BitShift(BitAND($iColor, 0xFF0000), 16)))
EndFunc

Func _GUICtrlTabSetBkColor($hWnd, $hSysTab32, $sBkColor)
    ;Disabled Label to hold the color
    Local $aTabPos = ControlGetPos($hWnd, "", $hSysTab32)
    
    GUICtrlCreateLabel("", $aTabPos[0] + 2, $aTabPos[1] + 23, $aTabPos[2] - 5, $aTabPos[3] - 26)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetBkColor(-1, $sBkColor)
EndFunc


?
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Да, это я и имел в виду.
 
Верх