Kolor WEB to po prostu heksadecymalna interpretacja wartości liczbowych koloru RGB, wiec wystarczy dokonać konwersji wartości int do hex i odwrotnie o czym możesz przeczytać
w serwisie Cyfrowy
Baron w dziale: porady

łańcuchy znaków...
Trzeba to wszystko nieco zmodyfikować by działało prawidłowo.
Podaję przykład z wykorzystaniem komponentu typu TColorDialog. W przykładzie konwersja jest prowadzona dwukierunkowo. Najpierw program pobiera wartość typu TColor z obiektu typu TColorDialog, następnie wartość ta jest konwertowana do postaci koloru WEB przechowywanego w zmiennej typu String. Kolor WEB to zapis trzech wartości typu heksadecymalnego stanowiących szesnastkowy zapis wartości typu int na które składają się składowe RGB, czyli każda składowa RGB ma swój odpowiednik w postaci wartości heksadecymalnej. Potem program dokonuje rozbicia koloru RGB przechowywanego w zmiennej typu String na pojedyncze wartości typu heksadecymalnego, by potem dokonać konwersji pojedynczych heksów do wartości typu int, a te z kolei są konwertowane na wartość typu TColor.
- Kod: Zaznacz cały
//---------------------------------------------------------------------------
#include <tchar.h>
int WebToRGB(const TCHAR *value)
{
struct CHexMap
{
TCHAR chr;
int value;
};
const int HexMapL = 16;
CHexMap HexMap[HexMapL] =
{
{'0', 0}, {'1', 1},
{'2', 2}, {'3', 3},
{'4', 4}, {'5', 5},
{'6', 6}, {'7', 7},
{'8', 8}, {'9', 9},
{'A', 10}, {'B', 11},
{'C', 12}, {'D', 13},
{'E', 14}, {'F', 15}
};
TCHAR *mstr = _tcsupr(_tcsdup(value));
TCHAR *s = mstr;
int result = 0;
if(*s == '0' && *(s + 1) == 'X') s += 2;
bool firsttime = true;
while (*s != '\0')
{
bool found = false;
for(int i = 0; i < HexMapL; i++)
{
if(*s == HexMap[i].chr)
{
if(!firsttime) result <<= 4;
result |= HexMap[i].value;
found = true;
break;
}
}
if(!found) break;
s++;
firsttime = false;
}
free(mstr);
return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(KolorDialog1->Execute())
{
TColor kolor = KolorDialog1->Color;
/* konwersja wartości typy TColor do wartości RGB */
byte r = GetRValue(kolor);
byte g = GetGValue(kolor);
byte b = GetBValue(kolor);
/* konwersja wartosci RGB na wartości hexadecymalne odpowiednik koloru WEB */
String webColor = (String)(IntToHex(r, 2) + IntToHex(g, 2) + IntToHex(b, 2));
Label1->Caption = webColor;
/* konwersja w drugą stronę z wartości hexadecymalnej (kolor WEB)
na wartość TColor */
String wk = Label1->Caption;
/* najpierw nastęuje rozbicie wartości typu String zawierajacej zapis
hexadecymalny na pojedyncze wartości hexów stanowiące składowe RGB
następnie funkcja WebToRGB konwertuje te wartości na wartości typu int
po czym są one konwertowane na wartość typu TColor */
TColor rgbColor = TColor(RGB( WebToRGB(wk.SubString(1, 2).c_str()),
WebToRGB(wk.SubString(3, 2).c_str()),
WebToRGB(wk.SubString(5, 2).c_str()) ));
Panel1->Color = rgbColor;
}
}
//---------------------------------------------------------------------------