Thumbviewer und Drag & Drop
-
Hallo!
Ich programmiere zur Zeit an einem Bildbetrachter, bzw. ich moechte den Viewer etwas schicker machen :). Hierfuer wuerde ich gerne einige Bilder folgendermassen verarbeiten. Man waehlt z.B. 20 Bilder aus. Dann sollen diese wie ein Filmstreifen dargestellt werden (Thumbs von den Orginalbildern, alle Bilder nebeneinander). Um sich ein Bild in Gross anzuschauen soll der User es per Drag & Drop von dem Filmstreifen in ein anderes Window ziehen koennen.
Meine Fragen dazu. Ich habe ja dann z.B. zwei Windows. Das eine zum Darstellen eines Bildes und das andere zum Darstellen der Thumbs. Gibt es schon eine "vordefinierte" Vorgehensweise wie man solch einen Filmstreifen umsetzt? Ich habe was von einer ImageList gelesen, aber es bisher noch nicht verstanden was damit gemeint ist. Und dann wie funktioniert Drag & Drop? Gibt es dazu ein gutes Tutorial? Ich hatte bisher nur wenig Erfolg bei meiner Suche.
Daher schonmal danke fuer alle Tipps!
-
Schau Dir mal ein List View an. Drag&Drop wir dort schon als Funktionalität angeboten (LVN_BEGINDRAG).
Aber warum so mühsam? Um ein Fenster anzusehen ein Drag&Drop zu machen finde ich ziemlich uneffektiv für enen User.
Intuitiver fände ich einen einfachn Klick oder eben einen Doppelklick.
-
Hmm, da werde ich mir nochmal Gedanken machen
Denke es ist abhaengig vom Enduser..Aber nochmal zu dem Filmstreifen. Wie kann ich am besten Bilder nebeneinander anordnen?
Danke

-
Schreib ich Dir schon:
Schau Dir List View an, dazu Custom Draw dürfte keine Hexerei sein...
-
imwaitingforsomething schrieb:
Aber nochmal zu dem Filmstreifen. Wie kann ich am besten Bilder nebeneinander anordnen?
Das wurde hier schon mal erörtert.
-
Hallo Martin Richter und sri,
danke fuer die Antworten. Habe mir heute einiges dazu durchgelesen und auch den Ansatz aus dem anderen Beitrag versucht umzusetzen. Hat leider noch nicht ganz geklappt.
Ich habe folgendes:
// Zunaechst das ListView Control filmstreifen = CreateWindowEx( WS_EX_CLIENTEDGE , WC_LISTVIEW , NULL , WS_VISIBLE | WS_CHILD | LVS_REPORT , 0 , 0 , 0 , 0 , hWnd , (HMENU)IRGEND_EINE_ID , ghInstance , NULL ); // Und eine Image list hImageList = ImageList_Create(100, 100, ILC_COLOR32, 2, 1); // Dann lade ich in meinem Fall keine Icons, sondern zwei Bilder LoadABitmap("C:\\test1.bmp", &hBitmap1); LoadABitmap("C:\\test2.bmp", &hBitmap2); // Die fuege ich in meine Image List hinzu i1 = ImageList_Add(hImageList, hBitmap1, NULL); i2 = ImageList_Add(hImageList, hBitmap2, NULL); // Loesche sie wieder... DeleteObject(hBitmap1); DeleteObject(hBitmap2); // Dann fuege ich ein column ein, da ich sonst nichts angezeigt bekomme.. Obwohl ich ja eigenltlich den Balken ueber der Liste nicht haben moechte lvColumn.mask = LVCF_WIDTH; lvColumn.cx = 100; SendMessage(filmstreifen, LVM_INSERTCOLUMN, 0, (LPARAM)&lvColumn); // Setzen der ImageList und die Einstellungen aus dem anderen Beitrag (Bei mir funktioniert an dieser Stelle nur die SMALL-Einstellung) ListView_SetImageList(filmstreifen, hImageList, LVSIL_SMALL); ListView_SetView(filmstreifen, LV_VIEW_SMALLICON); ListView_SetExtendedListViewStyleEx(filmstreifen, LVS_EX_SINGLEROW, LVS_EX_SINGLEROW); // lvi = LV_ITEM Struktur // i1 ist das der Index fuer das erste Bild lvi.mask = LVIF_IMAGE; lvi.iSubItem= 0; lvi.iItem = 0; lvi.iImage = i1; ListView_InsertItem(filmstreifen, &lvi); //i2 ist das der Index fuer das erste Bild lvi.iImage = i2; ListView_InsertItem(filmstreifen, &lvi);Mir werden die Bilder in der ersten Spalte untereinander angezeigt. Ich erhalte auch Errorwerte und zwar gibt "ImageList_Create" - "Not enough storage is available to process this command. (ErrorCode 8)" - an. Setze ich die Groesse auf der Bilder auf 10x10 anstatt 100x100, kommt der Fehler auch

Ich vermute das ich einige States falsch setze

Danke fuer eure Hilfe!
-
Ich habe es bei mir immer nur mit der normalen Ansicht gemacht:
ListView_SetImageList(filmstreifen, hImageList, LVSIL_LARGE); ListView_SetView(filmstreifen, LV_VIEW_ICON);Der ImageList_Create-Fehler könnte vielleicht daran liegen, dass Deine Anwendung kein Manifest für die ComCtl32.dll v6 enthält.