statisch Linken und SetImageList



  • Also die Bedingung ist in CObject* CHandleMap:FromHandle(HANDLE h). Die Assert Meldung lautet wie folgt: ASSERT(ph[0] == h || ph[0] == NULL); Hier liefern beide Bedingungen false;

    Ich suche mir aber nen Wolf. Ich kann ja mal den Code hier aufstellen vieleicht sieht jemand den Fehler gleich:

    CToolBar    m_toolBar;
    
    ... OnInitDialog()
    {
      ...
    
       m_toolBar.CreateEx(this, TBSTYLE_TOOLTIPS , WS_CHILD | CBRS_TOOLTIPS | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
    
       m_toolBar.LoadToolBar(IDR_TOOLBAR_MAIN);
    
       CImageList* m_toolBarImageList = m_toolBar.GetToolBarCtrl().GetImageList();
       m_toolBarImageList->DeleteImageList();
    
       m_toolBarImageList->Create(32, 32, ILC_MASK | ILC_COLOR24, 0, 0);
    
       logbmp.LoadBitmap(IDB_BITMAP_LOG);
       m_toolBarImageList->Add( &logbmp, RGB(0, 0, 0)/* Farbe für Tansparenz*/ );
    
       m_toolBar.GetToolBarCtrl().SetImageList(m_toolBarImageList); // hier tritt der Fehler auf
    
       ...
    }
    

  • Mod

    Dein vorgehen ist falsch. Du kanst nicht einen Toolbar/Imagelist so manipulieren.

    Erzeuge eine neue Imagelist, setze den Inhalt und teile die dem Toolbar mit.



  • Erzeuge eine neue Imagelist, setze den Inhalt und teile die dem Toolbar mit.
    

    Ok und was muss ich da anders machen?


  • Mod

    Aus Deinem Imagelist Zeiger, ein Imagelist Objekt und der Rest ist fast gleich. Und nach der ZUweisung würde ich einen Detach machen.



  • Wenn ich das mache sind meine Buttons leer. Nur wenn ich die Imagelist mit new erzeuge gehts.



  • Das mit dem Detach habe ich auch noch nicht verstanden


  • Mod

    - Wenn in der Imagelist nix drin ist, dann wird wohl nichts angezeigt.
    - Wenn Du einen Imagelist in einem Objekt hast, dieses dann der ListBox zuweißt, dnan ist die ListBox jetzt der Eigentümer. Detach verhindert, dass der Destruktor die Imagelist zerstört.



  • - Wenn in der Imagelist nix drin ist, dann wird wohl nichts angezeigt.

    In der Imageliste ist aber was drin. Ich mach ja m_toolBarImageList->Add(..)

    und wenn ich das ganze ja mit Zeiger und new mache erhalte ich ja Bilder auf meinen Buttons



  • na dann mach doch dir ImageListe zu einer Membervariable deiner Dialogklasse und schon sollte es auch ohne new gehen.



  • na dann mach doch dir ImageListe zu einer Membervariable deiner Dialogklasse und schon sollte es auch ohne new gehen.

    Ich habe es zu einer Membervariablen gememacht. Aber nur damit ich in InitDioalog new machen kann und bei OnDestroy wieder delete. Ohne new geht es auch bei einer Membervariablen nicht.


  • Mod

    Warum? Wo soll bitte der Unterschied sein. Dann müsstest Du Code zeigen.

    Der einzige Unterscied, den ich sehe ist dann nur zwischen mit & und ohne &.

    Flgender Code setzt eine dynamische Imageliste für ein List Control

    CImageList imageList;
    VERIFY(imageList.Create(16,15,ILC_COLOR16|ILC_MASK,10,10));
    // Add some icons
    if (imageList.m_hImageList)
    {
       imageList.Add(AfxGetApp()->LoadIcon(_T("...")));
       imageList.Add(AfxGetApp()->LoadIcon(_T("...")));
    ...
    }
    
    // Set the list and now load all
    m_lcItems.SetImageList(&imageList,TVSIL_NORMAL);
    imageList.Detach();
    


  • Also mein Code sieht so aus:

    So funktioniert es

    CToolBar    m_toolBar;
    CImageList* m_toolBarImageList;
    
    ... OnInitDialog()
    {
       m_toolBar.CreateEx(this, TBSTYLE_TOOLTIPS , WS_CHILD | CBRS_TOOLTIPS | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
    
      m_toolBar.LoadToolBar(IDR_TOOLBAR_MAIN);
    
      m_toolBarImageList = new CImageList();
    
      m_toolBarImageList->Create(32, 32, ILC_MASK | ILC_COLOR24, 0, 0);
    
      CBitmap logbmp;
    
      m_toolBarImageList->Add( &logbmp, RGB(0, 0, 0)/* Farbe für Tansparenz*/ );
    
      m_toolBar.GetToolBarCtrl().SetImageList(m_toolBarImageList);
    
      m_toolBarImageList->Detach();
    
    }
    

    So nicht:

    CToolBar    m_toolBar;
    
    ... OnInitDialog()
    {
       m_toolBar.CreateEx(this, TBSTYLE_TOOLTIPS , WS_CHILD | CBRS_TOOLTIPS | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
    
      m_toolBar.LoadToolBar(IDR_TOOLBAR_MAIN);
    
      CImageList m_toolBarImageList;
    
      m_toolBarImageList.Create(32, 32, ILC_MASK | ILC_COLOR24, 0, 0);
    
      CBitmap logbmp;
    
      m_toolBarImageList.Add( &logbmp, RGB(0, 0, 0)/* Farbe für Tansparenz*/ );
    
      m_toolBar.GetToolBarCtrl().SetImageList(&m_toolBarImageList);
    
      m_toolBarImageList.Detach();
    
    }
    

  • Mod

    Die Bitmap ist doch leer. Was soll da funktionieren?

    Und warum verwendest Du hier nicht CToolBar::SetBitmap direkt?

    Dir sollte klar sein, dass ein CToolBar noch etwas anderes ist als der gewrappte CToolBarCtrl und das der Zugriff auf die dahinterieende Imagelist nicht unbedingt ratsam ist.



  • Die Bitmap ist doch leer. Was soll da funktionieren?

    Oh vergessen aus dem Code zu kopieren. Das habe ich natürlich vorher gemacht.

    logbmp.LoadBitmap(IDB_BITMAP_LOG);
    

    Dir sollte klar sein, dass ein CToolBar noch etwas anderes ist als der gewrappte CToolBarCtrl und das der Zugriff auf die dahinterieende Imagelist nicht unbedingt ratsam ist.

    Inwiefern? Sollte ich dann CToolBarCtrl verwenden und auf die Imageliste darf ich dann zugreifen?

    Ich habe halt die Bilder über den Dialog im VS gesetzt. Und da VS keine Bitmaps über 16 Bit kann habe ich halt die Imageliste danach programmatisch ersetzt.


Anmelden zum Antworten