Einzele Buttonimages in einer Toolbar ersetzen


  • Mod

    Falsch. Es werden nicht mehr Buttons. Du hast nur einen größeren Vorrat an Bitmaps die Du an Buttons vergeben kannst.

    Buttons selbst werden durch TB_ADDBUTTONS hinzugefügt.
    Welches Image angezeigt wird, bestimmst Du. Dadurch ist es möglich aus einem Vorrat an Buttons auch nach einem bestimmten Status die Bitmaps in den Buttons zu wechseln. (z.B. Start/Stop Symbol auf einem Button).

    Nur die MFC hat für das einfache Laden eine 1:1 Beziehung zwischen Button-ID und Bitmap Position geschaffen.
    Diese kannst Du aber immer auch auflösen und jedem Button ein anderes Symbol (Bitmap-Index) zuweisen (TB_SETBUTTONINFO::iImage member). :xmas2:



  • Martin Richter schrieb:

    Falsch.

    Naja, wenn man weiß wie es gemeint ist versteht man diese verquasten Mickysoft-Beschreibungen sicher auch. Thx, ich werds mal probieren! 🙂



  • So, ich muss wohl noch mal nachfragen: Ich lade meine neuen Images von der Platte, habe die also anschließend in einem CBitmap-Objekt (oder allenfalls noch in einer HBITMAP-Struktur).

    Dieses TB_ADDBUTTONS mit dem ich dieses neue Bitmap zu meiner Toolbar hinzufügen können soll verwendet aber nur IDs wie sie in den internen Ressourcen zum Einsatz kommen - beides passt also nicht zueinander.

    Wie komme ich jetzt zu einer ID für dieses dynamisch erzeugte CBitmap-Objekt bzw. wie geht das sonst?


  • Mod

    Gogogo schrieb:

    So, ich muss wohl noch mal nachfragen: Ich lade meine neuen Images von der Platte, habe die also anschließend in einem CBitmap-Objekt (oder allenfalls noch in einer HBITMAP-Struktur).

    Dieses TB_ADDBUTTONS mit dem ich dieses neue Bitmap zu meiner Toolbar hinzufügen können soll verwendet aber nur IDs wie sie in den internen Ressourcen zum Einsatz kommen - beides passt also nicht zueinander.

    Wie komme ich jetzt zu einer ID für dieses dynamisch erzeugte CBitmap-Objekt bzw. wie geht das sonst?

    Was passt nicht zueinander? Ich verstehe Dich nicht.

    Du hast Deine IDs entweder weil diese in einem Menü oder einem Toolbar bereits verwendet werden oder legst diese sogar manuell an.
    Du kannst ja selber ID Bereiche für Deine COmmand vergeben.

    Welchen Command ID Du nun welchem Bimtap Index zuordnest beleibt doch Deine Sache.



  • Aaaalso, ich habe jetzt folgendes:

    HBITMAP hbmp = (HBITMAP) LoadImage(NULL,sc_get_sam_system_pathname("bild.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    if (hbmp)
    {
       TBADDBITMAP     addbmp;
       TBREPLACEBITMAP tbrb;
    
       addbmp.hInst=NULL;
       addbmp.nID=(int)hbmp;
    
       long idx=m_ToolBar.SendMessage(TB_ADDBITMAP,1,(LPARAM) (LPTBADDBITMAP)&addbmp);
       tbrb.hInstOld=AfxGetInstanceHandle();
       tbrb.nIDOld=ID_TOOL_SET_OUTPUT;
       tbrb.hInstNew=NULL;
       tbrb.nIDNew=(int)hbmp;
       tbrb.nButtons=1;
       m_ToolBar.SendMessage(TB_REPLACEBITMAP,0,(LPARAM) (LPTBREPLACEBITMAP)&tbrb);
       }
    

    In dem Bild bild.bmp ist genau ein Bild für die Toolbar aus insgesamt 10 Buttons enthalten. Nach dem SendMessage mit TB_ADDBITMAP bekomme ich allerdings 10 in idx zurück - wofür brauche ich diesen Wert?

    Und der restliche Schmons in dem ich das Bild des Buttons mit der Ressourcen-ID ID_TOOL_SET_OUTPUT durch das eben geladene Image ersetzen will führt aktuell nur noch dazu, dass der entsprechende Button hinterher ganz verschwunden ist.

    Also scheint hier irgend was mit dem Mischmasch aus Ressourcen-ID und hinzugeladenem Bild schief zu gehen?


  • Mod

    1. Warum verwendest Du immer noch TB_REPLACEBITMAP? Damit knallst Du doch alles wieder weg.
    2. Wen Du mehere Bitmaps in den Toolbar laden möchtest, dann musst Du doch wissen, ab welchem Bildindex das ganze beginnt? Oder Deshalb bekomst Du 10 zurück, weil bereits 10 Bilder in Der Bitmap des Toolbars sind.
    3. Der TB_SETBUTTONINFO::iImage Meber gibt an, welches Bild auf weclhem Button angezeigt wird.

    Ich weißt nicht, was daran so kompiliziert sein soll... :xmas1:



  • Martin Richter schrieb:

    2. Wen Du mehere Bitmaps in den Toolbar laden möchtest, dann musst Du doch wissen, ab welchem Bildindex das ganze beginnt? Oder Deshalb bekomst Du 10 zurück, weil bereits 10 Bilder in Der Bitmap des Toolbars sind.

    Naja, das ist dann eher eine Null-Information, schließlich weiß ich ja eh wie viele Buttons in der Toolbar sind, die materialisiert sich ja nicht zufällig im Speicher 😉

    Der TB_SETBUTTONINFO::iImage Meber gibt an, welches Bild auf weclhem Button angezeigt wird.

    Gut, dann das Ganze nach der Message mit TB_ADDBITMAP so:

    TBBUTTONINFO    tbbi;
    
    tbbi.cbSize=sizeof(TBBUTTONINFO);
    tbbi.dwMask=TBIF_IMAGE;
    tbbi.idCommand=0;
    tbbi.iImage=(int)hbmp;
    tbbi.fsState=0;
    tbbi.fsStyle=0;
    tbbi.cx=16;
    tbbi.lParam=ID_TOOL_SET_OUTPUT;
    tbbi.pszText=NULL;
    tbbi.cchText=0;
    		idx=m_m_ToolBar.SendMessage(TB_SETBUTTONINFO,(WPARAM)(int)ID_TOOL_SET_OUTPUT,(LPARAM)(LPTBBUTTONINFO)&tbbi);
    

    Unklar hier: warum muss ich die Ressourcen-ID des zu ändernden Buttons zweimal angeben? Und das spannenderweise einmal in einem Parameter der lParam heißt obwohl die zugehörige Struktur hinterher in wParam landet?

    Mal ganz abgesehen davon: das Ergebnis ist das gleiche, hinterher ist der Button ganz weg...


  • Mod

    Gogogo schrieb:

    Martin Richter schrieb:

    2. Wen Du mehere Bitmaps in den Toolbar laden möchtest, dann musst Du doch wissen, ab welchem Bildindex das ganze beginnt? Oder Deshalb bekomst Du 10 zurück, weil bereits 10 Bilder in Der Bitmap des Toolbars sind.

    Naja, das ist dann eher eine Null-Information, schließlich weiß ich ja eh wie viele Buttons in der Toolbar sind, die materialisiert sich ja nicht zufällig im Speicher 😉

    Quatsch! Die Information wird extrem notwendig, wenn Du dynamisch Bitmaps hinzulädst oder sogar dem User erlaubst selber Icons zu basteln.
    Warum solltest Du Dir mekren müssen was im System ist. Wichtig ist was wo steht, wenn Du es hinein getan hast!

    Gogogo schrieb:

    Der TB_SETBUTTONINFO::iImage Meber gibt an, welches Bild auf weclhem Button angezeigt wird.

    Gut, dann das Ganze nach der Message mit TB_ADDBITMAP so:

    TBBUTTONINFO    tbbi;
    
    tbbi.cbSize=sizeof(TBBUTTONINFO);
    tbbi.dwMask=TBIF_IMAGE;
    tbbi.idCommand=0;
    tbbi.iImage=(int)hbmp;
    tbbi.fsState=0;
    tbbi.fsStyle=0;
    tbbi.cx=16;
    tbbi.lParam=ID_TOOL_SET_OUTPUT;
    tbbi.pszText=NULL;
    tbbi.cchText=0;
    		idx=m_m_ToolBar.SendMessage(TB_SETBUTTONINFO,(WPARAM)(int)ID_TOOL_SET_OUTPUT,(LPARAM)(LPTBBUTTONINFO)&tbbi);
    

    Unklar hier: warum muss ich die Ressourcen-ID des zu ändernden Buttons zweimal angeben? Und das spannenderweise einmal in einem Parameter der lParam heißt obwohl die zugehörige Struktur hinterher in wParam landet?

    Mal ganz abgesehen davon: das Ergebnis ist das gleiche, hinterher ist der Button ganz weg...

    Du solltest etwasmehr die Doku lesen:
    1. Dieser Befehl kann auch einen Index ansprechen (TBIF_BYINDEX).
    2. Kann man mit diesem Befehl auch die ID ändern. Wie sollte das gehen, wenn man nicht den Zielbutton angibt?
    3. lParam steht Dir frei zur Verfügung. Eine ID musst Du dort nicht eintragen.
    4. idCommand musst Du nur angeben wenn Du auch TBIF_COMMAND
    5. Du musst überhaupt nur angeben was Du auch durch die Flags in dwMask definierst!



  • Martin Richter schrieb:

    Du solltest etwasmehr die Doku lesen:

    Gut, das versuche ich, allerdings sehe ich da beim besten willen nicht die Information die nich benötige. Da steht zwar das ich irgend welche Flags angeben muss und diese Flags mir beeinflussen ob und was in welchem der folgenden Parameter steht, aber die Information über den Gesamtzusammenhang felht mir komplett! Wo steht denn jetzt beispielsweise wie ich einem Vutton mit der Ressourcen-ID ID_TOOL_SET_OUTPUT das Image hbmp zuweise?

    Wenn ich es so mache wie ich die Beschreibung momentan interpretiere:

    tbbi.cbSize=sizeof(TBBUTTONINFO);
    tbbi.dwMask=TBIF_IMAGE|TBIF_LPARAM;
    tbbi.idCommand=0;
    tbbi.iImage=(int)hbmp;
    tbbi.fsState=0;
    tbbi.fsStyle=0;
    tbbi.cx=16;
    tbbi.lParam=ID_TOOL_SET_OUTPUT;
    tbbi.pszText=NULL;
    tbbi.cchText=0;
    		idx=m_ToolBar.SendMessage(TB_SETBUTTONINFO,(WPARAM)(int)ID_TOOL_SET_OUTPUT,(LPARAM)(LPTBBUTTONINFO)&tbbi);
    

    ist mein Button hinterher leer - das gewünschte Image ist immer noch nicht drin.



  • Jetzt sehe ich das erst: "Martin Richter (MVP für C++)" - kein wunder dass deine Antworten genau so arrogant und überheblich und vor allem unverständlich wie die MSDN sind.

    Vielleicht mal was zum Thema "Dokumentation besser lesen", da steht beispielsweise:

    TBIF_IMAGE - The iImage member contains valid information or is being requested.

    Aha, es wird also spannend, ich erfahre in der Beschreibung iImage was ich dort schönes reinsetzen muss um (irgend) was zu erreichen:

    iImage - Image index of the button.

    Ahh...äääh...was? Ein Index kommt da also rein. Welcher Index? Wofür? Was bewirkt er? Welchem Zweck dient er? Was kann ich damit alles auslösen und erreichen? DAS steht nirgends! Was zu finden ist ist lediglich eine Ansammlung von Teilinformationen die nur dann einen Sinn ergeben wenn man weiß wie sie zusammenzufügen sind - oder um es anders zu sagen wenn man sowieso schon weiß wie es funktioniert.

    Ich verzichte übrigens dankend auf weitere "Hilfen" dieser Art, ich habe es zwischenzeitlich anders gelöst.


  • Mod

    Es steht, da: Image index!

    Der Image Index. Du hat einen Toolbar, dieser besteht aus Buttons, diesem ist eine Image Liste zugeordnet. Jedem Buttin selbst wird nun gesagt welchesImage er zu verwenden hat.

    Gogogo schrieb:

    Jetzt sehe ich das erst: "Martin Richter (MVP für C++)" - kein wunder dass deine Antworten genau so arrogant und überheblich und vor allem unverständlich wie die MSDN sind.

    Ansonsten wünsche ich Dir Frohe Weihnachten und andere Leute die Deine Fragen beantworten... :xmas1:



  • > Es steht, da: Image index!

    Stimmt, DAS steht da.

    > Du hat einen Toolbar, dieser besteht aus Buttons, diesem ist eine Image Liste
    > zugeordnet.

    Wo steht das?

    > Jedem Buttin selbst wird nun gesagt welchesImage er zu verwenden hat.

    Wo steht das?

    Und selbst wenn diese beiden Punkte bekannt wären: Wo steht wie überhaupt der funktionale Zusammenhang mit dieser Struktur herzustellen ist?


Anmelden zum Antworten