WebColor z ColorDialog

dział ogólny

WebColor z ColorDialog

Nowy postprzez wargo » sobota, 19 wrzeÅ›nia 2009, 16:45

http://cyfbar.republika.pl/grafika2.html - na dole jest przykład konwersji z TColor na WebColor. Jednak napisane jest coś takiego:
W środowisku Borland Developer Studio 2006znajduje się kilka funkcji funkcji umożliwiających prostą konwersję między różnymi formatami kolorów. Nie wiem czy występują w środowisku BCB 6.

I chodzi mi właśnie o to co pogrubiłem. Tych funkcji nie ma ale może ktoś zna jakieś inne lub jakiś inny sposób na ta konwersję?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: WebColor z ColorDialog

Nowy postprzez Cyfrowy Baron » sobota, 19 wrzeÅ›nia 2009, 18:06

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;
}   
}
//---------------------------------------------------------------------------

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
wargo
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: WebColor z ColorDialog

Nowy postprzez wargo » sobota, 19 wrzeÅ›nia 2009, 19:46

To musisz zaktualizować poradę chyba że to przeoczyłem
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: WebColor z ColorDialog

Nowy postprzez Cyfrowy Baron » sobota, 19 wrzeÅ›nia 2009, 20:05

Przecież podałem nazwę działu: porady -> łańcuchy znaków...

Porada dotyczy konwersji int do hex i odwrotnie, to co podałem wyżej to modyfikacja tych porad.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: WebColor z ColorDialog

Nowy postprzez wargo » sobota, 19 wrzeÅ›nia 2009, 21:49

Mi chodzi o poradę dotyczącą konwersji kolorów aby zaktualizować zacytowaną wiadomość w 1 poście oraz dodać przykład podany wyżej.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana


Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 5 gości