COLORREF in CString und CString in COLORREF

Indian

Erfahrenes Mitglied
Hi

ich hab einen COLORREF wert welchen ich in CString umwandenl möchte und dann wieder von CString in COLORREF.

Ist das überhaubt möglich ? Geht das ?

Hab leider bis jetzt nichts gefunden :(

Indian
 
Ein COLORREF ist ja nur ein Typedef für ein DWORD, dazu müsste es Millionen Umwandel-Beispiele geben.

CString.Format( "%0x", rgbColor ) sollte das in Hex-Darstellung in den CString fummeln.
Ansonsten die üblichen DWORD in CString-Umwandel-Funktionen.
 
DWORD nach CString hatte ich gerade gefunden, geht genauso wie du es gesagt hast. Jedoch ich finde leider nicht von CString nach DWORD. Habe alles mögliche schon gefunden .
 
ich glaub ich bin zu blöd um eine funktion zu finden welche einen CString in DWORD umwandelt. Kennst du eine ?
 
atoi sollte das machen, macht auch keine Probleme mit dem Vorzeichen (sage ich mal so).
 
lol.. ich hatte es gerade vor 5 minuten ausprobiert und mein ColorDialog hat durch atoi denn richtigen wert sogar angezeigt :)

danke schön
 
einmal so

Code:
 CString strColor;
 COLORREF m_rgbColor = picker.GetRGB();
 	strColor.Format("%02X%02X%02X",GetRValue(m_rgbColor),GetGValue(m_rgbColor),GetBValue(m_rgbColor));

und einmal so:

Code:
 int _httoi(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;
 }
 
 COLORREF HexToRGB(CString strHex)
 {
 	int iRed   = _httoi(strHex.Left(2));
 	int iGreen = _httoi(strHex.Mid(2, 2));
 	int iBlue  = _httoi(strHex.Right(2));
 	return RGB(iRed,iGreen,iBlue);
 }
 
 // hier siehts dann in aktion aus
 
 CString strColor = FFFFFF;
 COLORREF rgbColor;
 
 rgbColor = HexToRGB(m_strColor);

hoffe das hilft :)
 
Sorry, aber wo hast du die Hex-Routine her? Die ist umständlich Quadrat.

Alleine die Hexmap, den zweiten Eintrag kann man sich einfach über Subtraktion errechnen. Ein einfacher String wäre da besser, wenn nicht ganz auf IF-Abfragen umsteigen.
Und wenn ich das bFirstTime richtig interpretiere, klappt das nur für zwei Zeichen lange Hex-Strings, weil bFirstTime nie wieder true ist. Die Hex-Strings können aber dafür ein 0x vorne dran haben :)

Nachtrag: Nimm's mir nicht krumm, ich will den Code nicht runtermachen, aber es gibt da einfach wesentlich einfachere Methoden.
 
nimms nicht übel, hast ja recht

aber ich bin zu faul da weiter anzupacken :)
der ohne probleme....und du kennst ja den spruch, repariere nichts, was nicht kaputt ist...

in diesem sinne :)
 
Zurück