Icon-Dateien in Toolbar benutzen
-
Hallo!
Ich will mir eine Toolbar bauen, die anstatt von Bitmap-Dateien Icon-Dateien anzeigt. Ist das möglich? Wenn ja, wie?
Ich nutze momentan den Code aus den FAQ (Klick), allerdings verlangt das Feld 'tbbutton.iBitmap' Bitmap-Handles.
Mit ImageLists habe ich es auch schon versucht, nur bekomme ich da immer NULL zurück.// Fenster registrieren, aufmachen etc. tb_create (hInstance, hWnd, WS_VISIBLE|WS_BORDER|TBSTYLE_FLAT); HIMAGELIST imgList = ImageList_LoadImage (hInstance, L"sheet.ico", 16, 16, CLR_DEFAULT, IMAGE_ICON, LR_LOADFROMFILE|LR_LOADTRANSPARENT); if (imgList != NULL ) { SendMessage (hTool, TB_SETIMAGELIST, 0, (LPARAM)imgList); //<-- } else { MessageBox (hWnd, L"imgList = 0", L"Fehler", MB_OK); } //Quelle: http://cboard.cprogramming.com/windows-programming/83673-transparent-toolbar-buttons-2.html#post597827Mit dem absoluten Pfad hab ich's auch schon versucht, allerdings erfolglos.
Voraus schon mal Danke, aVoX.
-
-
Brofi schrieb:
Hallo erstmal, Herr 'Brofi'!
Erstens einmal bin ich sehr wohl selbst im Stande Google zu benutzen, und wenn ich da nicht werde, durchsuche ich Foren und registriere mich auch.
Zweitens wird das auch einen Grund haben, warum ich Icon-Dateien statt Bitmap-Dateien benutzen will (Transparenz, mehrere Größen, wobei die nächstpassende automatisch vom OS erkannt wird, speichereffizienter, usw.).
Drittens: Ich suche nicht einmal nach einer Möglichkeit, Icons in BMPs zu konvertieren, sondern eher nach einer Möglichkeit, diese direkt einzubinden.
-
Oh sry zu voreilig.
Wie wär's damit? http://msdn.microsoft.com/en-us/library/bb761391
(ImageList_AddIcon: http://msdn.microsoft.com/en-us/library/bb761399 ...)
-
Wenn ich die Icon-Datei von der HD laden will, funktioniert es nicht (LoadIcon gibt NULL zurück), wenn ich die Datei direkt aus der Ressourcendatei mittels MAKEINTRESOURCE laden will, gibt der Befehl zwar nicht mehr NULL zurück, allerdings ist dann der Toolbarbutton, sowie alle anderen Toolbarbuttons leer.
HIMAGELIST imgList = ImageList_Create (16, 16, NULL, 1, 1); HICON hSheet = LoadIcon ( hInstance, L"sheet.ico" ); // = NULL if (hSheet != NULL) { if ( FAILED (ImageList_AddIcon (imgList, hSheet))) { MessageBox (hMain, L"AddIcon failed", L"Fehler", MB_OK); } else { SendMessage (hToolbar, TB_SETIMAGELIST, 0, (LPARAM)imgList); } else { MessageBox (hMain, L"hSheet == NULL", L"Fehler", MB_OK); }Setze ich stattdessen
HIMAGELIST imgList = ImageList_Create (16, 16, NULL, 1, 1); HICON hSheet = LoadIcon ( hInstance, MAKEINTRESOURCE(IDI_SHEET) ); // etc...ein, funktioniert es zwar, aber alle Toolbarbuttons sind leer.
-
1. LoadIcon bezieht sich immer auf eingebettete Icons. Niemals auf Daten-Dateien! Dann nimm LoadImage!
2. Was Gibt AddIcon zurück? FAILED schient mir die falsche Prüfung... AddIcon muss einen Wert >=0 liefern.
Was sagt GetLastError?
3. Bist Du sicher, dass Du Icons der Größe 32x2 laden willst und in einen Toolbar mit 16x16 konvertieren willst. Wenn nicht lies doch einfach mal die Doku... dann verstehst Du vielleicht besser warum bei LoadIcon ein Verweis auf LoadImage steht.
-
Martin Richter schrieb:
2. Was Gibt AddIcon zurück? FAILED schient mir die falsche Prüfung... AddIcon muss einen Wert >=0 liefern.
Was sagt GetLastError?OK, hab's geändert. Wenn AddIcon fehlschlägt liefert GetLastError() immer 0xCCCCCCCC (dez 3435973836). (Heißt das nicht, dass man auf einen uninitialisierten Pointer zugreift?)
Martin Richter schrieb:
3. Bist Du sicher, dass Du Icons der Größe 32x2 laden willst und in einen Toolbar mit 16x16 konvertieren willst.
Das Icon ist 16x16.
-
Keien Ahnung was Du machst. Die Doku von ImageList_AddIcon sagt nichts zu GetLastError. Ich gehe davon aus, dass es nicht benutzt wird.
Dein Fehler müsste wonders liegen.
Zeig mal Coe wie Du es aktuell machst. Die Codestücke, die Du bisher gezeigt hattes enthielten alle Fehler.
-
Ich bezweifle zwar, dass der folgende Code richtig ist (der Toolbarbutton ist leer), aber ich hab eigentlich aalles befolgt, was ihr mir gesagt habt und was in der Dokumentation steht.
#define ERROR(string) MessageBox (hWnd, string, L"Fehler!", MB_OK) // Fenster öffnen, usw... // HWND hTool = tb_create (hInstance, hWnd, WS_VISIBLE|WS_BORDER|TBSTYLE_FLAT); // Toolbar anlegen if (hTool == NULL) { ERROR (L"Toolbar konnte nicht erstellt werden!"); exit (-1); } tb_add_std_button (hTool, ID_NEW, STD_FILENEW); // "Neu"-Button hinzufügen HIMAGELIST imgList = ImageList_Create (16, 16, NULL, 1, 1); // ImageList mit 16x16 großen Bildern, 1 Element und ohne Flags if (imgList == NULL) { ERROR (L"ImageList konnte nicht erstellt werden!"); exit (-1); } HICON hSheet = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_SHEET)); if (hSheet == NULL) { ERROR (L"Icon konnte nicht geladen werden!"); exit (-1); } if (ImageList_AddIcon (imgList, hSheet) < 0) { ERROR (L"Icon konnte nicht hinzugefügt werden"); exit (-1); } SendMessage (hTool, TB_SETIMAGELIST, NULL, (LPARAM)imgList); // imgList hinzufügenTrotzdem: Danke soweit

-
1. Verstehe ich nicht die Makros die Du hier nutzt. Was ist tb_add_std_button?
2. Ist Dir klar, dass Du den Index auf das Symbol dem Button zuordnen musst?
-
OK, ich hab' jetzt einen Code, der halbwegs funktioniert. Der Code entspricht im Großen und Ganzen dem Code von der MSDN (Klick!). Zwar wird der zuvor hinzugefügte Standardbutton nicht angezeigt, und das Icon ist monochrom und ohne Transparenz, aber immerhin ist das Icon zu sehen.
// siehe voriges Posting! // hier einfügen! HIMAGELIST *ptr = &imgList; SendMessage(hTool, CCM_SETVERSION, (WPARAM) 5, 0); SendMessage (hTool, TB_SETIMAGELIST, i, (LPARAM)ptr[0]); // imgList hinzufügen TBBUTTON button; button.iBitmap = MAKELONG(i,0); button.idCommand = TB_REPORT; button.fsState = TBSTATE_ENABLED; button.fsStyle = TBSTYLE_BUTTON; button.dwData = 0; button.iString = NULL; SendMessage ( hTool, TB_ADDBUTTONS, (WPARAM) 1, (LPARAM) (LPTBBUTTON) &button );Martin Richter schrieb:
1. Verstehe ich nicht die Makros die Du hier nutzt. Was ist tb_add_std_button?
Die beziehen sich auf den Link vom 1. Posting: http://www.c-plusplus.net/forum/111101