Tab Hintergrundfarbe ermitteln

  • Hi!
    Ich habe gerade ein Problem...
    Ich bastle gerade ein Programm, aktuell 3500 Zeilen daher kein Skript angefügt^^
    Darin erstelle ich einen Slider in einem Tabitem, sieht so ähnlich aus wie hier:
    http://www.autoitscript.com/forum/index.php?act=attach&type=post&id=22810
    Jetzt müsste ich die System-Hintergrundfarbe für Tabs herausfinden.
    Bei Vista standartmäßig 255,255,255; aber mit msstyles etc. ändert sich das ja.
    Ich hab schon mit PixelGetColor eine Lösung geschrieben, da die Farbe aber erst nach erstellen des Fensters geändert wird ist das nicht ausreichend.
    Aktuell versuche ich es mit _WinAPI_GetSysColor(), raff ich aber nicht ganz.
    Vorschläge?
    Danke!

  • Nein, ich brauche nicht die Hintergrundfarbe von MDI-Fenstern sondern von TABS!!!!
    Tabs Jonathan, TABS!!!!!!
    Und was ist das überhaupt für ein komischer RGB-Wert, der da raus kommt:
    11250603
    Was soll das bedeuten?
    Ist RGB nicht z.B. 255 255 255?
    112 50 603 kanns ja nicht sein^^
    11 250 603 auch nicht
    112 506 03 auch nicht???????

  • du könntest sie per pixelsearch rausfinden?
    also praktisch die koordinaten deines fensters ermitteln und dann da irgendwo pixelsearch
    das ist aber nur ne notlösung
    würd ich unter alles andere schreiben :D

    Padmak

    Edit: Wandles mal in hex um

  • Hex($color)

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • den Wert von _WinAPI_GetSysColor mit folgender Funktion umwandeln:

    [autoit]

    Func _BGR2RGB($iColor)
    Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
    EndFunc

    [/autoit]

    Warum, weiß ich auch nicht so genau; Möglicherweise liefert _WinAPI_GetSysColor den BGR und nicht den RGB, wie beschrieben!?
    Aber es funktioniert...

    Mit Hex($Farbe) siehts du dann die RGB Werte (0xRRGGBB)


    lgE

  • Macht keinen Unterschied...
    Die Farbe ist dann 0xABABAB
    Das Problem ist, dass $COLOR_APPWORKSPACE falsch ist.
    Ich brauche die Hintergrundfarbe eines TabItems (der großen Fläche wo die Controls rein sollen^^)
    Bei Vista ist die Farbe bei Aero 0xFFFFFF.
    Hab ich mit PixelGetColor rausgefunden, nützt aber nichts.

  • Cool, danke.
    Ich versuch's mal, ist ja mit Structs und DLLCall. Kann aber für nichts garantieren!

  • OK bisher hab ich:

    [autoit]

    $classes = WinGetClassList("[CLASS:AutoIt v3 GUI;TITLE:ModMan]")
    $struct = DllStructCreate("COLORREF")
    $struct2 = DllStructCreate("str")
    DllStructSetData($struct2, 1, $classes)
    $htheme = DllCall("uxtheme.dll", "none", "OpenThemeData", "hwnd", $gui, "ptr", DllStructGetPtr($struct2))
    $color = DllCall("uxtheme.dll", "int:COLORREF", "GetThemeColor", "HTHEME", $htheme, "int", "TABP_BODY", "int", "", "int", "TMT_COLOR")
    DllCall("uxtheme.dll", "none", "CloseThemeData", "hwnd", $htheme)

    [/autoit]


    Klappt aber noch nicht. Ideen?

  • Moin,

    [autoit]


    $classes = WinGetClassList("[CLASS:AutoIt v3 GUI;TITLE:ModMan]") ; ???
    $struct = DllStructCreate("dword") ; COLORREF = BGR !!!
    $struct2 = DllStructCreate("wstr")
    DllStructSetData($struct2, 1, $classes)
    $htheme = DllCall("uxtheme.dll", "none", "OpenThemeData", "hwnd", $gui, "ptr", DllStructGetPtr($struct2))
    $color = DllCall("uxtheme.dll", "int", "GetThemeColor", _
    "ptr", $htheme, _
    "int", "TABP_BODY", _ ; ???
    "int", "", _ ; ???
    "int", "TMT_COLOR") ; ???
    DllCall("uxtheme.dll", "none", "CloseThemeData", "ptr", $htheme)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]


    Du brauchst die Klassennamen des Tab-Steuerelements ...
    Du brauchst die Werte für TABP_BODY und TMT_COLOR ...


    Gruß
    Greenhorn


  • Hi

    wstr bei DllStructCreate gibt es nicht, sollte Char[255] oda so was sein.
    Die Classlist, welche an OpenThemeData übergeben wird, muß mit Semikolons getrennt sein - WingetClasslist trennt mit @lf

    Trotzdem gibt OpenThemeData kein ThemeHandle zurück...

    Code
    If no match is found NULL is returned

    Hier sind die Werte der Konstanten (z.b. TABP_BODY) zu finden:
    http://co-project.lboro.ac.uk/users/codm2/wi…TBXUxThemes.pas

    Weiter weiß ich jetzt auch grad nicht...

    lgE

  • Sollte eigentlich so gehen:

    Spoiler anzeigen
    [autoit]

    Global Const $VSCLASS_TAB = "TAB"

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $TABP_TABITEM = 1
    Global Const $TABP_TABITEMLEFTEDGE = 2
    Global Const $TABP_TABITEMRIGHTEDGE = 3
    Global Const $TABP_TABITEMBOTHEDGE = 4
    Global Const $TABP_TOPTABITEM = 5
    Global Const $TABP_TOPTABITEMLEFTEDGE = 6
    Global Const $TABP_TOPTABITEMRIGHTEDGE = 7
    Global Const $TABP_TOPTABITEMBOTHEDGE = 8
    Global Const $TABP_PANE = 9
    Global Const $TABP_BODY = 10
    Global Const $TABP_AEROWIZARDBODY = 11
    Global Const $TMT_COLOR = 204
    Global Const $TMT_FILLCOLOR = 3802
    Global Const $TMT_FILLCOLORHINT = 0x0EED

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hWnd = GUICtrlGetHandle($tab) ; Handle des Tabcontrols
    $hTheme = DllCall("uxTheme.dll", "ptr", "OpenThemeData", "hwnd", $hWnd, "wstr", $VSCLASS_TAB)
    $hTheme = $hTheme[0]

    [/autoit] [autoit][/autoit] [autoit]

    $COLORREF = DllCall("uxTheme.dll", "lresult", "GetThemeColor", "ptr", $hTheme, "int", $TABP_PANE, "int", 0 , "int", $TMT_FILLCOLOR, "dword*", 0)
    $COLORREF = $COLORREF[5]
    $RGB = _BGR2RGB($COLORREF)
    DllCall("uxTheme.dll","lresult","CloseThemeData","ptr", $hTheme)

    [/autoit] [autoit][/autoit] [autoit]

    Func _BGR2RGB($iColor)
    Return Number(String(BinaryMid(Binary($iColor),1,3)))
    EndFunc

    [/autoit]


    Die RGB-Farbe ist dann in $RGB. ( bei mir kommt aber 0xF4F4F4 raus, das ist dunkler als der Tab selbst.

  • Danke!
    Versuch vllt mal in einer Schleife alle durch, wenn du XP hast...
    Bei Vista ist der wert nicht sehr aussagekräftig, 0xFFFFFF ist viel.
    Also so:

    [autoit]

    $hWnd = GUICtrlGetHandle($tab) ; Handle des Tabcontrols
    $hTheme = DllCall("uxTheme.dll", "ptr", "OpenThemeData", "hwnd", $hWnd, "wstr", $VSCLASS_TAB)
    $hTheme = $hTheme[0]

    [/autoit][autoit][/autoit][autoit]

    For $a = 1 to 11
    For $b = 3801 to 3823
    $COLORREF = DllCall("uxTheme.dll", "lresult", "GetThemeColor", "ptr", $hTheme, "int", $a, "int", 0 , "int", $b, "dword*", 0)
    $COLORREF = $COLORREF[5]
    $RGB = _BGR2RGB($COLORREF)
    If Hex($RGB) = "00FCFCFE" then Msgbox(0,"",Hex($RGB) & @lf & $a & @lf & $b)
    Next
    Next

    [/autoit][autoit][/autoit][autoit]

    DllCall("uxTheme.dll","lresult","CloseThemeData","ptr", $hTheme)
    Func _BGR2RGB($iColor)
    Return Number(String(BinaryMid(Binary($iColor),1,3)))

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]


    Bei XP müsste (bei Standart-Style) 0xFCFCFE rauskommen.

    Bei welchen vars ist das so?
    Danke!

  • Also, bei mir (Vista-Style) ;) Ist PixelGetColor 0xFFFFFF. Da kommt am ehesten das ran mit Ergebnis 0xFEFEFE:
    $a = $TABP_PANE
    $b = $TMT_FILLCOLORHINT