Windows Farben zuordnen

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Windows Farben zuordnen

Beitrag von AUGE_OHR »

moin,

in WinUser.h finde ich 31 Farb Konstanten

Code: Alles auswählen

#define COLOR_SCROLLBAR 0
#define COLOR_BACKGROUND 1
#define COLOR_ACTIVECAPTION 2
#define COLOR_INACTIVECAPTION 3
#define COLOR_MENU 4
#define COLOR_WINDOW 5
#define COLOR_WINDOWFRAME 6
#define COLOR_MENUTEXT 7
#define COLOR_WINDOWTEXT 8
#define COLOR_CAPTIONTEXT 9
#define COLOR_ACTIVEBORDER 10
#define COLOR_INACTIVEBORDER 11
#define COLOR_APPWORKSPACE 12
#define COLOR_HIGHLIGHT 13
#define COLOR_HIGHLIGHTTEXT 14
#define COLOR_BTNFACE 15
#define COLOR_BTNSHADOW 16
#define COLOR_GRAYTEXT 17
#define COLOR_BTNTEXT 18
#define COLOR_INACTIVECAPTIONTEXT 19
#define COLOR_BTNHIGHLIGHT 20
#define COLOR_3DDKSHADOW 21
#define COLOR_3DLIGHT 22
#define COLOR_INFOTEXT 23
#define COLOR_INFOBK 24
#define COLOR_HOTLIGHT 26
#define COLOR_GRADIENTACTIVECAPTION 27
#define COLOR_GRADIENTINACTIVECAPTION 28
#define COLOR_MENUHILIGHT 29
#define COLOR_MENUBAR 30
unter Xbase++ gibt es jedoch in der Xbp.Ch 51 XBPSYSCLR_* Konstanten ( XBPSYSCLR_TRANSPARENT ausgenommen )
wie würdet ihr die XBPSYSCLR_* Konstanten zuordnen :?:
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Windows Farben zuordnen

Beitrag von Tom »

wie würdet ihr die XBPSYSCLR_* Konstanten zuordnen
Na ja. Die, die sich erkennbar paaren lassen, paart man, die anderen nicht. :albino: Oder wie denn sonst? Wenn es hier keine Farbe für Icontexte (WTF?) gibt, dort aber schon, dann kann man nix zuordnen.

Möglich auch, dass in der Xbase-Variante noch ein paar OS2-Reste enthalten sind.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Windows Farben zuordnen

Beitrag von AUGE_OHR »

unabhängig das man bei der Zuordnung Fehler machen könnte ist die Frage ob die XBPSYSCLR_* Konstanten wirklich stimmen ... bei einige Farben habe ich das Gefühl das es, abhängig vom Theme, nicht stimmt, oder :?:
Farben_W10.jpg
Farben_W10.jpg (141.18 KiB) 4929 mal betrachtet
Farben_Office.jpg
Farben_Office.jpg (142.79 KiB) 4929 mal betrachtet
Farben_Itunes.jpg
Farben_Itunes.jpg (127.22 KiB) 4929 mal betrachtet
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Windows Farben zuordnen

Beitrag von AUGE_OHR »

moin

ich habe was beim Scrollbar versucht aber in der App wo ich gearbeitet habe wirkte es nicht.
irgendwann hab ich eine andere Xbase++ App gestartet und sah PINK ?
Scrollbar_Pink.png
Scrollbar_Pink.png (11.69 KiB) 4887 mal betrachtet
die Apps hat keinen Skin oder ähnliches sondern nur Manifest also die Theme Farben.
Farben_PINK.jpg
Farben_PINK.jpg (142.86 KiB) 4887 mal betrachtet
auch bei anderen Xbase++ Apps war der Scrollbar nun in PINK ... und was ist mit anderen Apps :?:

der TC zeigt es genau so wenig wie der Explorer oder mein Listview aber eben alle Xbase++ Apps wo man einen Scrollbar hat. nun hab ich nicht viel auf dem PC an Software installiert aber alles was ich bislang getestet habe reagiert auf die Änderung (zum Glück) nicht.

da die Änderung nach einem Re-Boot wieder auf default sind könnte man damit doch spielen, oder :roll:
ich sehe die "Gefahr" nicht ... aber alle meine Xbase++ Apps würden vermutlich auch andere System Farben übernehmen ohne das ich weiter was machen müsste ... :-"

spricht was dagegen mit den COLOR_* Konstanten so rum-zu spielen :?:
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Windows Farben zuordnen

Beitrag von AUGE_OHR »

moin,

ich komme nicht klar mit den Theme Farben ...

Windows arbeitet mit der COLORREF Structure wo in Hex der GBR (nicht RGB) Wert verwendet wird
https://docs.microsoft.com/de-de/window ... i/colorref

Code: Alles auswählen

0x00bbggrr
die GetSysColor API Function soll RGB zurück geben

Code: Alles auswählen

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getsyscolor
The function returns the red, green, blue (RGB) color value of the given element.
die SetSysColors API Function ist das Gegenstück

Code: Alles auswählen

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setsyscolors
An array of COLORREF values that contain the new red, green, blue (RGB) color values for the display elements in the array pointed to by the lpaElements parameter.
---

nun erhalte ich für

Code: Alles auswählen

DLLFUNCTION GetSysColor(n) USING STDCALL FROM USER32.DLL

   nRet1 := GetSysColor(nColor)
aber einen numerischen Wert ...
egal erst mal testen mit

Code: Alles auswählen

   @User32:SetSysColors(1, {aColor[i]},{nValue})
aber das war wie erwartet nichts ... bis auf den Hintergrund der jetzt die gelbliche Info Farbe hat.

da ich für SetSysColors() aber BGR (nicht RGB) Werte brauche hab ich es so versucht

Code: Alles auswählen

   nRet3 := GraGetRGBIntensity(nRet1)
aber er liefert mir teilweise NIL und kein Array :(
dito wenn ich so was mache

Code: Alles auswählen

   nRet2 := AutomationTranslateColor( nRet1, .T. )
die GetSysColor() Werte sind übrigen <= 16777216 (s.h. DBF Anhang)
XBFARBEN.ZIP
.DAT == .DBF
(574 Bytes) 245-mal heruntergeladen
was also mache ich verkehrt mit den Farben :?:

---

ich habe einen schönen schwarzen Scrollbar. komischerweise wirkt er nicht überall :?:
da ich die System Theme Farben ändere sollten alle Apps darauf reagieren.

eine schwarze Msgbox : bitte schön (noch nicht perfekt)
Msgbox_Black.jpg
Msgbox_Black.jpg (21.83 KiB) 4841 mal betrachtet
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Windows Farben zuordnen

Beitrag von AUGE_OHR »

eine Antwort von AGP im Ot4xb Forum
I'm not sure how you created the attachment, but the second number is always
the same as the first, with 0x1000000 added. For example:

15790320 32567536 ==> 0xF0F0F0 0x1F0F0F0 ==> BGR: F0 F0 F0 (Light Gray)
14120960 30898176 ==> 0xD77800 0x1D77800 ==> BGR: D7 78 00 (Blue)
15918295 32695511 ==> 0xF2E4D7 0x1F2E4D7 ==> BGR: F2 E4 D7 (Light Blue Gray)
15389113 32166329 ==> 0xEAD1B9 0x1EAD1B9 ==> BGR: EA D1 B9 (Dark Blue Gray)
13395456 30172672 ==> 0xCC6600 0x1CC6600 ==> BGR: CC 66 00 (Blue)
14811135 31588351 ==> 0xE1FFFF 0x1E1FFFF ==> BGR: E1 FF FF (Pale Yellow)
0 16777216 ==> 0x000000 0x1000000 ==> BGR 00 00 00 (Black)

>using that Value with
> nRet3 := GraGetRGBIntensity(nRet1)
>some are NIL ?

The GraMakeRGBColor() and GraGetRGBIntensity() routines convert RGB values
as follows: Red value + 256 * Green value + 65536 * Blue value + 16777216.

So the RGB values {01, 02, 03} become: 16974337 or 0x1030201 or x1BBGGRR.

This means that the values in the last column should therefore work with
GraGetRGBIntensity() and were probably created with GraMakeRGBColor().

When using GraGetRGBIntensity(), any value below 16777216 (0x1000000) will
return NIL while values above 33,554,431 (0x1FFFFFF) will return wrong
RGB values in an array, with the third (Blue) intensity value being above
255 (and therefore invalid)!

If you want to use a GraMakeRGBColor() value in a COLORREF Structure, simply
subtract 16777216 (0x1000000) from it or use BAnd(nValue, 0xFFFFFF).

AutomationObject():TranslateColor() -- or AutomationTranslateColor() -- on
the other hand will create a similar number, but adding 0x2000000, meaning
that the resulting number is: Red value + 256 * Green value + 65536 * Blue
value + 33554432.

So the RGB value from GraMakeRGBColor({01, 02, 03}) becomes: 33751554 or
0x2030201 or 0x2BBGGRR.

So, if you want to use an AutomationObject():TranslateColor() value in a
COLORREF Structure, simply subtract 33554432 (0x2000000) from it, or again,
use BAnd(nValue, 0xFFFFFF).

AutomationObject():TranslateColor(nColor [, .f.]) also allows GRA_CLR_xxx
constant values between -5 and 15, while invalid color values will return
an error code value of -6, and values between 16 and 16,777,215 (0x000010
and 0xFFFFFF) will all be converted to 0.

Also, using AutomationObject():TranslateColor(nColor, .t.) will (basically)
add or subtract 16777216 (0x1000000) from the supplied nColor value to
create GraMakeRGBColor() compatible values.

* Automation Color values between 33554432 and 50331647 (0x2000000 and
0x2FFFFFF) will become GraMakeRGBColor() values between 16777216 and
33554431 (0x1000000 and 0x1FFFFFF) by subtracting 16777216 (0x1000000).

* GetSysColor values, between 0 and 16777215 (0x000000 and 0xFFFFFF) will
also become GraMakeRGBColor() values between 16777216 and 33554431
(0x1000000 and 0x1FFFFFF) by adding 16777216 (0x1000000).

* Values between 16777216 and 16842751 (0x1000000 and 0x100FFFF) will become
values between 50331648 and 50397183 (0x3000000 and 0x300FFFF) by adding
33554432 (0x2000000), while values from 16842752 through 33554431
(0x1010000 through 0x1FFFFFF) will return the error code value -6.

So, all those RGB color routines -- GetSysColor(), GraMakeRGBColor(),
GraGetRGBIntensity(), and AutomationObject():TranslateColor() are using
values that are in the format: 0x0nBBGGRR, where "n" is 0 for COLORREF,
which is used by the Windows API Functions GetSysColor() as well as
SetSysColors(), while GraMakeRGBColor() and GraGetRGBIntensity() use a
value of 1 for "n". Finally AutomationObject():TranslateColor() uses a value
of 2 for "n" and can also convert between the "n" values of 0, 1, and 2,
when setting the second parameter <lIsCOMColor> to TRUE.

Hope that helps,

Andreas
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Windows Farben zuordnen

Beitrag von AUGE_OHR »

so langsam komme an die gewünschten Farben ... aber da gibt es noch "offene" Xbase++ Konstanten.

es gibt 30 COLOR_* Konstanten.
die 30 default Werte des Theme sind unter HKEY_CURRENT_USER\Control Panel\Colors zu finden.

die 30 COLOR_* Konstanten / RGB Werte habe ich nun so zugeordnet aber etliche XBPSYSCLR_* Konstanten bleiben übrig.

Code: Alles auswählen

#define XBPSYSCLR_MENUBAR                  (-62) // COLOR_MENUBAR
#define XBPSYSCLR_HOTLIGHTBGND             (-61) // COLOR_HOTLIGHT
#define XBPSYSCLR_GRADIENTACTIVETITLE      (-60) // COLOR_GRADIENTACTIVECAPTION
#define XBPSYSCLR_GRADIENTINACTIVETITLE    (-59) // COLOR_GRADIENTINACTIVECAPTION
#define XBPSYSCLR_BUTTONTEXT               (-58) // COLOR_BTNTEXT
#define XBPSYSCLR_INFOBACKGROUND           (-57) // COLOR_INFOBK
#define XBPSYSCLR_INFOTEXT                 (-56) // COLOR_INFOTEXT
#define XBPSYSCLR_3DHIGHLIGHT              (-55) // COLOR_BTNHIGHLIGHT
#define XBPSYSCLR_3DLIGHT                  (-54) // COLOR_3DLIGHT
#define XBPSYSCLR_3DFACE                   (-53) // COLOR_BTNFACE
#define XBPSYSCLR_3DSHADOW                 (-52) // COLOR_BTNSHADOW
#define XBPSYSCLR_3DDARKSHADOW             (-51) // COLOR_3DDKSHADOW
#define XBPSYSCLR_SHADOWHILITEBGND         (-50)
#define XBPSYSCLR_SHADOWHILITEFGND         (-49)
#define XBPSYSCLR_SHADOWTEXT               (-48)
#define XBPSYSCLR_ENTRYFIELD               (-47)
#define XBPSYSCLR_MENUDISABLEDTEXT         (-46) // COLOR_GRAYTEXT
#define XBPSYSCLR_MENUHILITE               (-45) // COLOR_MENUHILIGHT
#define XBPSYSCLR_MENUHILITEBGND           (-44)
#define XBPSYSCLR_PAGEBACKGROUND           (-43)
#define XBPSYSCLR_FIELDBACKGROUND          (-42)
#define XBPSYSCLR_BUTTONLIGHT              (-41)
#define XBPSYSCLR_BUTTONMIDDLE             (-40)
#define XBPSYSCLR_BUTTONDARK               (-39)
#define XBPSYSCLR_BUTTONDEFAULT            (-38)
#define XBPSYSCLR_TITLEBOTTOM              (-37)
#define XBPSYSCLR_SHADOW                   (-36)
#define XBPSYSCLR_ICONTEXT                 (-35)
#define XBPSYSCLR_DIALOGBACKGROUND         (-34)
#define XBPSYSCLR_HILITEFOREGROUND         (-33) // COLOR_HIGHLIGHTTEXT
#define XBPSYSCLR_HILITEBACKGROUND         (-32) // COLOR_HIGHLIGHT
#define XBPSYSCLR_INACTIVETITLETEXTBGND    (-31)
#define XBPSYSCLR_ACTIVETITLETEXTBGND      (-30)
#define XBPSYSCLR_INACTIVETITLETEXT        (-29) // COLOR_INACTIVECAPTIONTEXT
#define XBPSYSCLR_ACTIVETITLETEXT          (-28) // COLOR_CAPTIONTEXT
#define XBPSYSCLR_OUTPUTTEXT               (-27)
#define XBPSYSCLR_WINDOWSTATICTEXT         (-26)
#define XBPSYSCLR_SCROLLBAR                (-25) // COLOR_SCROLLBAR
#define XBPSYSCLR_BACKGROUND               (-24) // COLOR_BACKGROUND
#define XBPSYSCLR_ACTIVETITLE              (-23) // COLOR_ACTIVECAPTION
#define XBPSYSCLR_INACTIVETITLE            (-22) // COLOR_INACTIVECAPTION
#define XBPSYSCLR_MENU                     (-21) // COLOR_MENU
#define XBPSYSCLR_WINDOW                   (-20) // COLOR_WINDOW
#define XBPSYSCLR_WINDOWFRAME              (-19) // COLOR_WINDOWFRAME
#define XBPSYSCLR_MENUTEXT                 (-18) // COLOR_MENUTEXT
#define XBPSYSCLR_WINDOWTEXT               (-17) // COLOR_WINDOWTEXT
#define XBPSYSCLR_TITLETEXT                (-16)
#define XBPSYSCLR_ACTIVEBORDER             (-15) // COLOR_ACTIVEBORDER
#define XBPSYSCLR_INACTIVEBORDER           (-14) // COLOR_INACTIVEBORDER
#define XBPSYSCLR_APPWORKSPACE             (-13) // COLOR_APPWORKSPACE
#define XBPSYSCLR_HELPBACKGROUND           (-12)
#define XBPSYSCLR_HELPTEXT                 (-11)
#define XBPSYSCLR_HELPHILITE               (-10)
wer hilft mir weiter die restlichen XBPSYSCLR_* Konstanten zu identifizieren.
gruss by OHR
Jimmy
Antworten