Toolbar: Standardbuttons und eigene Bitmaps gemischt???



  • Hoi Leute 🙂

    Hmmm ich komme hier nicht mehr weiter... ich will nämlich eine Toolbar basteln, die sowohl die Windows-Standardicons für z.B. "Datei öffnen" oder "Datei neu" enthält, als auch ein eigenes Bitmap verwenden .... nur funktioniert mein folgender Code nicht (die Windows-eigenen Icons werden angezeigt, nur mein eigenes, das nicht 😞 ):

    EDITOR.RH (Auszug):

    #define IDB_MYBITMAP 4100
    

    EDITOR.RC (Auszug):

    IDB_MYBITMAP BITMAP DISCARDABLE "res\\mybitmap.bmp"
    

    EDITOR.CPP (Auszug):

    HWND CreateToolbar (HWND hWindow)
    {
    	TBADDBITMAP bit;
    	memset (&bit, 0, sizeof (TBADDBITMAP));
    	bit.hInst = HINST_COMMCTRL;
            bit.nID = IDB_STD_SMALL_COLOR;
    
    	TBBUTTON mypictures [] = 
    	{
    		 {STD_FILENEW ,IDM_FILE_NEW, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON, 0, 0},
                     {STD_FILEOPEN, IDM_FILE_OPEN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON, 0, 0},
                     {STD_FILESAVE, IDM_FILE_SAVE, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON, 0, 0},
    
                     {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
    
                     {IDB_MYBITMAP, 0, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON, 0, 0}
    
    	};
    
    	HWND hToolbar = CreateWindowEx (NULL,
    				   TOOLBARCLASSNAME,
    				   "",
    				   WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT,
    				   0,0,0,0,
    				   hWindow,
    				   (HMENU)1,
    				   gInstance,
    				   NULL);
    
    	SendMessage (hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof (TBBUTTON), 0);
    
            //Hier sende ich ihm die standard-icons...
    	SendMessage(hToolbar,TB_ADDBITMAP,0,(LPARAM)&bit);
    
            //Und hier soll er mein eigenes dazukopieren .... geht aber net :(
            bit.hInst = gInstance;
    	bit.nID = IDB_MYBITMAP;
    	SendMessage(hToolbar,TB_ADDBITMAP,1,(LPARAM)&bit);
    
            SendMessage (hToolbar, TB_ADDBUTTONS, (WPARAM)sizeof(mypictures)/sizeof(mypictures[0]), (LPARAM)(TBBUTTON*)&mypictures);
    
    	SendMessage (hToolbar, TB_AUTOSIZE, 0, 0);
    	ShowWindow (hToolbar, SW_SHOW);
    	UpdateWindow (hToolbar);
    
    	return hTree;
    }
    

    Könnt ihr mir da vielleicht weiterhelfen? Weil ich komm da einfach net weiter, hab mal alles durchprobiert ... warscheinlich haperts bei mir noch an der Logik, das ich die Funktionsweise der Toolbars noch net so ganz verstanden hab...

    VIELEN VIELEN DANK SCHONMAL IM VORRAUS! 😋

    ~code_pilot



  • Was liefert denn dein SendMessage(hToolbar,TB_ADDBITMAP,1,(LPARAM)&bit); zurück?

    Returns the index of the first new image if successful, or -1 otherwise.



  • Hi flenders,

    nee der Wert ist > -1 (um genau zu sein: 15) also kann's net daran liegen ... oder? Ist vielleicht an meinem Bitmap was falsch?

    Gruss,
    code_pilot



  • Hast du es schon mal nur mit eigenen Icons ausprobiert - also ohne die Kombination mit den Standard-Icons?



  • Hi flenders...

    geht auch nicht! Das Bild wird dann auch nicht angezeigt. Ein Button wird immer erzeugt, nur halt ohnedas Bild. Es ist ein Bitmap und hat eine größe von 16x16 Pixeln bei einer Farbtiefe von 16 Farben. Sollte also doch eigentlich klappen ... *grummel* 😞 ... habs auch nochmal als Icon eingebunden ... bringt genauso viel :(((

    Gruss,
    ~code_pilot



  • Ich habs immer noch net hingekriegt ... habt ihr nicht irgendwo noch ein Beispiel/Vorlage für mich rumfliegen??

    Gruss,
    ~code_pilot



  • Ah! Ich hab den Fehler gefunden! Ich machs jetzt so:

    HWND CreateToolbar (HWND hWindow)
    {
        TBADDBITMAP bit;
        memset (&bit, 0, sizeof (TBADDBITMAP));
    
        TBBUTTON mypictures [] =
        {
             {STD_FILENEW ,IDM_FILE_NEW, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON, 0, 0},
                     {STD_FILEOPEN, IDM_FILE_OPEN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON, 0, 0},
                     {STD_FILESAVE, IDM_FILE_SAVE, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON, 0, 0},
    
                     {0, 0, TBSTATE_ENABLED, TBSTYLE_SEP, 0, 0},
    
                     {0, 0, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE | TBSTYLE_BUTTON, 0, 0}
    
        };
    
        HWND hToolbar = CreateWindowEx (NULL,
                       TOOLBARCLASSNAME,
                       "",
                       WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT,
                       0,0,0,0,
                       hWindow,
                       (HMENU)1,
                       gInstance,
                       NULL);
    
        SendMessage (hToolbar, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof (TBBUTTON), 0);
    
        bit.hInst = HINST_COMMCTRL;
        bit.nID = IDB_STD_SMALL_COLOR;
        SendMessage(hToolbar,TB_ADDBITMAP,0,(LPARAM)&bit);
    
        bit.hInst = GetModuleHandle(NULL);
        bit.nID = IDB_MYBITMAP;
        mypictures[4].iBitmap = SendMessage(hToolbar,TB_ADDBITMAP,0,(LPARAM)&bit);
    
        SendMessage (hToolbar, TB_ADDBUTTONS, (WPARAM)sizeof(mypictures)/sizeof(mypictures[0]), (LPARAM)(TBBUTTON*)&mypictures);
    
        SendMessage (hToolbar, TB_AUTOSIZE, 0, 0);
        ShowWindow (hToolbar, SW_SHOW);
        UpdateWindow (hToolbar);
    
        return hTree;
    }
    

    👍 Aber jetzt hab ich ein Problem: Mein Bitmap wird nicht transparent angezeigt 😞 gibt es dafür eine Möglichkeit, zu sagen: "Mache mir alles was Weiss ist transparent"? Hab hier leider nix gefunden im Forum ... und den Hintergrund fest färben will ich nicht, weil's dann unter XP nicht mehr gut aussieht.

    Grüsse,
    ~code_pilot :p



  • So denn, im WinAPI.net Forum konnte man mir helfen, hier die Lösung:

    bit.hInst = NULL;
    bit.nID   = (UINT_PTR)LoadImage(GetModuleHandle(NULL),
                                    MAKEINTRESOURCE(IDI_MYBITMAP),
                                    IMAGE_BITMAP,
                                    GetSystemMetrics(SM_CXSMICON),
                                    GetSystemMetrics(SM_CYSMICON),
                                    LR_DEFAULTCOLOR | LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
    

    Bitte Thread schließen. -> vielleicht in die FAQ?

    ~cp


Anmelden zum Antworten