CBitmap: Pixel durch eine andere Farbe ersetzen
-
Hallo zusammen!
Erstmal zum Hintergrund meines Problems. Ich habe ein CListCtrl, welches Personennamen enthält. Jeder Person ist eine Farbe zugeordnet, die erst zur Laufzeit des Programms festgelegt wird (Wert wird aus einer Datenbank gelesen).
Nun möchte ich in dem CListCtrl vor dem Personennamen die entsprechende Farbe anzeigen. Ich habe mir dazu einfach mit Paint eine Bitmap erstellt mit der Standard-Farbe (diese wird verwendet, wenn der Person keine explizite andere Farbe zugeordnet wurde) und die Bitmap habe ich als Ressource in mein Programm eingebunden.Mit
CBitmap bit; bit.LoadBitmap(IDB_FARBE_MITARBEITER);
habe ich dann ein CBitmap erstellt, das in eine Image-Liste geladen und das wird dann vor dem Personennamen angezeigt. Klappt auch alles wunderbar. Allerdings möchte ich jetzt im Bedarfsfall die Pixel der Bitmap anders färben. Also alle Pixel in der Standardfarbe zum Beispiel blau färben und dann die geänderte Bitmap anzeigen.
Wie kann ich das färben anstellen? Gibt es da irgendeine Funktion für? Hat jemand eine Idee oder würdet ihr das ganz anders lösen?
Vielen lieben Dank schonmal für eure Hilfe!
Meike
-
Hallo nochmal!
Hab die Antwort dann gerade doch noch gefunden! Für alle, die es vielleicht später noch interessiert, hier der Code:
CBitmap bitmap; bitmap.LoadBitmap(IDB_FARBE_MITARBEITER); BITMAP BMPInfo; bitmap.GetBitmap(&BMPInfo); CClientDC dc(this); CDC DCMemory; DCMemory.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = DCMemory.SelectObject(&bitmap); COLORREF farbe_replace = CHandTrainerApp::farbe_TP_static; CPoint pp; int x_pos_bis = BMPInfo.bmWidth; int y_pos_bis = BMPInfo.bmHeight; int y; COLORREF farbe_anderer_hg = mitarbeiter_neu.farbe; DCMemory.SelectObject(&bitmap); COLORREF ccc; for(int x=0; x<x_pos_bis; x++) { pp.x = x; for(y=0; y<y_pos_bis; y++) { pp.y = y; if((ccc = DCMemory.GetPixel(pp)) == farbe_replace) { DCMemory.SetPixel(pp,farbe_anderer_hg); } } } DCMemory.SelectObject(pOldBitmap); DCMemory.DeleteDC(); pos_image = image_list_farbe.Add(&bitmap,&bitmap);
-
Warum erzeugst Du nicht eine Imagelistmit den Farben der Personen, die Du anzeigst und verwendest dann nur noch den Index auf den Eintrag der Imageliste...
-
Warum überhaupt so kompliziert, einfach das CListCtrl Ownerdraw machen und den Name selbst scheiben und den Hintergrund einfach in der entsprechenden Farbe füllen. sollten Bilder mit in der Grafik sein, kann man die ja selbst Blitten. Aber den umweg über eine Geladene Grafik die ja auch noch fest ist weil Resource des Programmes würde ich erst gar nicht machen