Toolbar mit Nicht-Standard-Icons



  • Achso, Du kennst C_Bastian persönlich. Ich wusste bis eben nicht, daß er den VC verwendet.

    /EDIT: Nachdem Du Dein Original-Posting editiert hattest, habe ich schon verstanden, wie Du das mit der Struktur gemeint hattest. Dein Code war halt einfach nur falsch.



  • Willst du mich verarschen? Auch wenn er nicht VC benutzt, zeigt das obige Beispiel wie man eine Toolbar erstellt und mit einer Imagelist verknüpft, Klugscheisser. 👎



  • Shlo schrieb:

    , ich denke mit anderen IDEs funktioniert es nicht.

    Nicht? 😕

    Shlo schrieb:

    Klugscheisser. 👎

    Ja. 👍



  • Hallo zusammen,

    danke für die Antworten. Bitte beruhigt euch, ich habe eine (einfache) Frage gestellt und wollte hier keinen Krieg beginnen 😞 .

    Danke besonders für den Codeschnipsel. Als Ressource einbinden könnte ich sogar noch hinkriegen (vielleicht). Was mir noch unklar ist ist dieses reinterpret_cast. Bin halt noch so gut wie ein Newbie, was WinAPI/C angeht, ist erst mein zweites größeres Projekt in der Kombination.. Aber vielleicht wartet die Erleuchtung auch bis ich ausgeschlafen bin (komme gerade von der Arbeit). Werde mich aus dem selben Grund erst morgen mit dem Code beschäftigen. Wenns klappt, gut, wenn nicht, melde ich mich mit genaueren Informationen. Ich verwende allerdings nicht VC, sondern den LCC (weditres) und ein bisschen "Handarbeit" in den Ressource-Dateien.

    Und persönlich kenne ich hier, soweit es mir bewusst ist) leider keinen, sonst wüsste ich, wen ich anrufen könnte 😉

    Nochmals Danke, melde mich bald wieder.

    Gruß,
    Sebastian



  • Hallo nochmal,

    leider habe ich immer noch Probleme. Ich kann eine Toolbar wie schon vermutet, leider nicht als Ressource laden. Mein Weditres sieht das zwar vor, stürzt beim erstellen dieser Toolbar aber leider ab. Ich nehme an, die dahinter liegenden Funktionen sind noch nicht implementiert (LCC ist noch in Entwicklung und wird es auch noch Jahre sein...)

    Ich glaube, es ist einfacher, wenn wir den Weg anders herum gehen: Hier ist mein bisheriger Code:

    #define NUM_TOOLBAR_BUTTONS		2
    
    HWND CreateAToolBar(HWND hwndParent)
    {
    	HWND hwndTB;
    	TBADDBITMAP tbab;
    	TBBUTTON tbb[NUM_TOOLBAR_BUTTONS];
    	int index;
    
    	// Ensure that the common control DLL is loaded.
    	InitCommonControls();
    
    	// Create a toolbar
    	hwndTB = CreateWindowEx(0, TOOLBARCLASSNAME, (LPSTR) NULL,
    	    WS_CHILD|WS_BORDER|CCS_ADJUSTABLE,
    	    0, 0, 0, 0, hwndParent, (HMENU) ID_TOOLBAR, hInst, NULL);
    
    	// Send the TB_BUTTONSTRUCTSIZE message
    	SendMessage(hwndTB, TB_BUTTONSTRUCTSIZE,
    	    (WPARAM) sizeof(TBBUTTON), 0);
    
    	// Add the bitmap containing button images to the toolbar.
    	tbab.hInst = HINST_COMMCTRL;
    	tbab.nID   = 1;
    	SendMessage(hwndTB, TB_ADDBITMAP, (WPARAM) NUM_TOOLBAR_BUTTONS,(LPARAM) &tbab);
    
    	// clean memory before using it
    	memset(tbb,0,sizeof tbb);
    
    	// Add the strings
    
    	index = SendMessage(hwndTB,TB_ADDSTRING,0,(LPARAM)"Neu");
    	tbb[0].iString = index;
    	index = SendMessage(hwndTB,TB_ADDSTRING,0,(LPARAM)"Öffnen");
    	tbb[1].iString = index;
    	// Button "New"
    	tbb[0].iBitmap = STD_FILENEW ;
    	tbb[0].idCommand = IDM_NEW;
    	tbb[0].fsState = TBSTATE_ENABLED;
    	tbb[0].fsStyle = TBSTYLE_BUTTON;
    
    	// Button "Open"
    	tbb[1].iBitmap = STD_FILEOPEN;
    	tbb[1].idCommand = IDM_OPEN;
    	tbb[1].fsState = TBSTATE_ENABLED;
    	tbb[1].fsStyle = TBSTYLE_BUTTON;
    
    	SendMessage(hwndTB,TB_ADDBUTTONS,2,(LPARAM)&tbb);
    	ShowWindow(hwndTB,SW_SHOW);
    	return hwndTB;
    }
    

    Bekommt später natürlich mehr Buttons, andere Funktionen etc, ist ja nur fürs kapieren.

    Meine Hindernisse:
    1.) Wie kann ich eine Bitmap (ich weiß inzwischen, dass mein Weg mit Icons falsch war) erstellen, die mehrere Symbole enthält 😕

    2.) Wie bekomme ich die in mein Programm? Irgendwie aus der Ressource laden? Was ist dann mein tbab.hInst? Dass STD_FILENEW der Index für das Symbol in der Bitmap (die ja mehrere Symbole enthält) ist, hab ich kapiert.

    Oder mache ich einen Denkfehler 😕

    Gruß,
    Sebastian



  • Willst du die eigenen Bitmaps als externe Files oder als Ressource haben? Und so wie ich das verstanden habe werden die einzelnen Bitmaps getrennt gehalten (also nicht die für alle Button in einem). Die eigenen Bitmaps musst du dann zu erst entsprechend mit TB_ADDBITMAP dem Toolbar-Control bekannt machen 🙂

    Wenn du die Bitmaps als Ressourcen ablegst gibst du für hInst der TBADDBITMAP-Struktur dein hInst deiner Anwendung an (bzw. das, woraus du die Ressourcen laden willst) und für nID die ID der Ressource - so wie in diesem Beispiel (ganz unten) 🙂



  • Hallo Flenders,

    am liebsten hätte ich sie in einer Ressource. Ich probiers. Danke einstweilen.

    Sebastian



  • Hallo nochmal,

    ich krieg es immer noch nicht hin. Mein Code ist jetzt:

    #define NUM_TOOLBAR_BUTTONS		2
    
    HWND CreateAToolBar(HWND hwndParent)
    {
    	HWND hwndTB;
    	TBADDBITMAP tbab;
    	TBBUTTON tbb[NUM_TOOLBAR_BUTTONS];
    	int index;
    
    	// Ensure that the common control DLL is loaded.
    	InitCommonControls();
    
    	hwndTB = CreateWindowEx(0, TOOLBARCLASSNAME, (LPSTR) NULL,
    	    WS_CHILD|WS_BORDER|CCS_ADJUSTABLE,
    	    0, 0, 0, 0, hwndParent, (HMENU) ID_TOOLBAR, hInst, NULL);
    
    	// Add the bitmap containing button images to the toolbar.
    	tbab.hInst = hInst;
    	tbab.nID   = IDB_FADER; //aus der Ressource:IDB_FADER BITMAP discardable "fader.bmp"
    
        // Send the TB_BUTTONSTRUCTSIZE message, which is required for
    	// backward compatibility.
    	SendMessage(hwndTB, TB_BUTTONSTRUCTSIZE,(WPARAM) sizeof(TBBUTTON), 0);
    
    	// clean memory before using it
    	memset(tbb,0,sizeof tbb);
    
    	// Add the strings
    
    	index = SendMessage(hwndTB,TB_ADDSTRING,0,(LPARAM)"Neu");
    	tbb[0].iString = index;
    
    	index = SendMessage(hwndTB,TB_ADDSTRING,0,(LPARAM)"Neu2");
    	tbb[1].iString = index;
    
    	index = SendMessage(hwndTB,TB_ADDBITMAP,1,(LPARAM) &tbab);
    
    	tbb[0].iBitmap = index ;
    	tbb[0].idCommand = IDM_NEW;
    	tbb[0].fsState = TBSTATE_ENABLED;
    	tbb[0].fsStyle = TBSTYLE_BUTTON;
    
    	tbb[1].iBitmap = index;
    	tbb[1].idCommand = IDM_OPEN;
    	tbb[1].fsState = TBSTATE_ENABLED;
    	tbb[1].fsStyle = TBSTYLE_BUTTON;
    
    	SendMessage(hwndTB,TB_ADDBUTTONS,2,(LPARAM)&tbb);
    	ShowWindow(hwndTB,SW_SHOW);
    	return hwndTB;
    }
    

    Leider stürzt das Programm beim
    index = SendMessage(hwndTB,TB_ADDBITMAP,1,(LPARAM) &tbab);
    mit einer exception ab. Wenn ich // davor setze, läufts, aber eben ohne die Bitmap. Für Versuchszwecke habe ich erstmal nur eine Bitmap genommen, die dann auf beiden Buttons erscheint, später werden es mehr.

    Die Bitmap ist 32x32x16 Quadratpixelfarben

    Was mache ich falsch 😕



  • Also bei mir klappt das einwandfrei. Ich nehme an es liegt daran, dass hInst ungültig ist 😉



  • 😕 😕 😕 😞 😕

    Jetzt kapier ich gar nix mehr. hInst ist gültig: global und mit dem richtigen Wert (void * 0x400000).

    Argh. Ok, ich bastel mal weiter.

    Danke einstweilen.....



  • Und die ID des Bildes stimmt auch mir der aus der Ressource überein und diese ist richtig eingebunden (evtl. mal versuchen das Bild normal zu laden - aus den Ressourcen)



  • Hallo nochmal,

    ich hab den Fehler gefunden: Er lag im Compiler. Mit einem anderen Compiler gings problemlos. Da kann man sich dumm und dämlich suchen....

    Danke für die Hilfe.

    Gruß,
    Sebastian


Anmelden zum Antworten