Icon aus Imagliste zu Bitmap
-
Hallo, ich hab folgendes problem.
ich möchte aus einer Imageliste die Icons beinhaltet, bestimmte Icons in ein Bitmap umwandeln und dann später als Bitmap speichern.In meiner Liste werden 12 Icons korrect angezeigt. egal welches Icon ich jetzt auswähle. ob es nur ein Icon ist oder Icon nr 0,3,6 es wird mir immmer nur das letzte Icon (nr 12) dargestellt.
CCtrlList ist eine eigens erstellte Classe unter verwendung der WinAPI die Korrect funktioniert.
kann mir dabei bitte jemand helfen??
void ExtractBitmap(CCtrlList *pList,CImageList *pSmall,CImageList *pLarge) { /********************************************************************************************** EXTRACT BITMAP extrahiert die Icons aus der Liste zu einem Bitmap -in - pList Address Zeiger auf die Liste in der die Icons dargestellt werden - pSmall Address Zeiger auf die Imageliste in der die kleinen Icons zu finden sind - pLarge Address Zeiger auf die Imageliste in der die großen Icons zu finden sind **********************************************************************************************/ int *iaCurSel = new int[pList->GetSelectedCount()];//Bereich für die markierten Elemente int iSelCount = pList->GetSelectedItem(iaCurSel);//Belegt Bereich mit markierten Elementen zB. Icon Nr 0,3,6 HDC hDc = GetDC(pList->GetDlgItem()); for (int i = 0; i < iSelCount; i++) { IMAGEINFO imageinfo; pLarge->GetImageInfo (i, &imageinfo); HDC hdcMem = CreateCompatibleDC (hDc); CRect rect (imageinfo.rcImage); HBITMAP hBitmap = CreateCompatibleBitmap (hdcMem, rect.Width() /** iSelCount*/, rect.Height ()); HBITMAP hBmpOld = (HBITMAP)SelectObject (hdcMem, hBitmap); ImageList_Draw(pLarge->GetSafeHandle(),iaCurSel[i],hdcMem,rect.Width () /** i + rect.Width ())*/, rect.Height (),ILD_NORMAL); SelectObject (hdcMem,hBmpOld); //Ab hier ist der Code nur zur Kontrolle //umgewandeltes Icon wird als Bitmap wieder in die liste eingefügt. CBitmap bmp; bmp.Attach(hBmpOld); CString sText("Blub"); pLarge->Add(&bmp,RGB(0,0,0)); //Element der Liste erstellen LVITEM LvItem; memset(&LvItem,0,sizeof(LvItem)); LvItem.mask = LVIF_TEXT|LVIF_IMAGE ; LvItem.cchTextMax = sText.GetLength(); LvItem.iItem = pList->GetItemCount(); LvItem.iImage = pLarge->GetImageCount()-1; LvItem.pszText = sText.GetBuffer(sText.GetLength()); pList->InsertItem(&LvItem); DeleteObject(hBmpOld); DeleteObject(hBitmap); DeleteDC(hdcMem); bmp.DeleteObject(); } ReleaseDC(pList->GetDlgItem(),hDc); delete [] iaCurSel; /* */ }
-
Deine schleife ist falsch. Dumusst einmal die Bitmap erzeugen und den DC danach die Schleife laufen lassen, die diese Bitmap mit den Images befüllt.
Du erzeugst xmal eine neue Bitmap!
-
Also ich hab die schleife jetzt abgeändert, so wie ich dich verstanden hab,
leider komm ich immer noch nicht zu dem gewünschen ergebniss.jetzt hab ich teilweise schwarze Icons, mit weisen pünktchen, oder ganz schwarze Icons...
ich nehm jetzt mal an das dies die Mask ist.was läuft nun verkehrt?
int *iaCurSel = new int[pList->GetSelectedCount()]; int iSelCount = pList->GetSelectedItem(iaCurSel); HDC hDc = GetDC(pList->GetDlgItem()); CBitmap bmp; IMAGEINFO imageinfo; pLarge->GetImageInfo (iaCurSel[0], &imageinfo); HDC hdcMem = CreateCompatibleDC (hDc); CRect rect (imageinfo.rcImage); HBITMAP hBitmap = CreateCompatibleBitmap (hdcMem, rect.Width() /** iSelCount*/, rect.Height ()); HBITMAP hBmpOld = (HBITMAP)SelectObject (hdcMem, hBitmap); for (int i = 0; i < iSelCount; i++) { pLarge->GetImageInfo (iaCurSel[i], &imageinfo); ImageList_Draw(pLarge->GetSafeHandle(),iaCurSel[i],hdcMem,rect.Width () /** i + rect.Width ())*/, rect.Height (), ILD_MASK | ILD_TRANSPARENT ); HBITMAP hBmpOld = (HBITMAP)SelectObject (hdcMem, hBitmap); bmp.Attach(hBmpOld); CString sText("Blub"); pLarge->Add(&bmp,(COLORREF)imageinfo.hbmImage); //Element der Liste erstellen LVITEM LvItem; memset(&LvItem,0,sizeof(LvItem)); LvItem.mask = LVIF_TEXT|LVIF_IMAGE ; LvItem.cchTextMax = sText.GetLength(); LvItem.iItem = pList->GetItemCount(); LvItem.iImage = pLarge->GetImageCount()-1; LvItem.pszText = sText.GetBuffer(sText.GetLength()); pList->InsertItem(&LvItem); DeleteObject(hBmpOld); DeleteObject(hBitmap); DeleteDC(hdcMem); bmp.DeleteObject(); } ReleaseDC(pList->GetDlgItem(),hDc); delete [] iaCurSel;
-
1. Ist das doch gar nicht die gemalte Bitmap, die befindet sich in hBitmap
bmp.Attach(hBmpOld);2. Kann es doch nicht funktionieren, die folgenden Objekte freizugeben und im nächsten Schleifendurchlauf weiter zu verwenden!
DeleteObject(hBmpOld); DeleteObject(hBitmap); DeleteDC(hdcMem); bmp.DeleteObject(); }
-
ok stimmt hast recht,
war gestern wohl doch schon recht spät
hab es jetzt geändert, aber es funzt immmer noch nicht, das gleiche ergebniss.hab hier mal einen screen geschoßen.
http://image-upload.de/image/7sSBUG/523ba25535.jpgdas blau markierte Image wollte ich als bitmap haben.
-
BTW: Es gibt auch ImageList_Merge
http://msdn.microsoft.com/en-us/library/bb761558(VS.85).aspx
-
danke aber das ist nicht das richtige, ich will es ja in einem bitmap haben, weil ich es später(wenn das ganze mal klappt) auf festplatte speichern will.
das ich das bitmap wieder in die immageliste steck, hab ich nur zum test gemacht, weil alles was mit grafischer darstellung zu tun hat völliges neuland für mich ist und ich so ganz unkompliziert testen kann ob der code auch das macht was ich will.
was er ja wie man sieht nicht tut