Icon auf Button ändern



  • Hallo Programmiergemeinde,
    ich möchte in ein Icon, das auf einem Button liegt, eine "LED" einbauen. Also einen kleinen Bereich in Abhängigkeit einer Nachricht anders einfärben. Meine Fragen:

    1. Kann ich das Icon direkt auf der Taste bearbeiten, oder sollte ich ein zweites Icon erstellen, und je nach Bedarf das eine oder das andere auf die Taste laden?
    2. Muss ich aus dem Icon eine Bitmap machen, und nach dem bearbeiten wieder ein Icon daraus erstellen? Ich finde irgendwie keine Funktion zum bearbeiten von Icons.

    Ich habe mir GetIconInfo() und CreateIconIndirect() angesehen, aber ich komme mit den hbmMask und hbmColor Member der ICONINFO nicht weiter.

    Danke für eure Hilfe.


  • Mod



  • Hallo Martin,

    danke für den Rat mit den Ownerdraw-Button. Damit habe ich auch schon gearbeitet. Das passt hier aber nicht, das Icon auf dem Button soll nicht seine Form beim draufklicken ändern. Beim Betätigen des Buttons wird eine Funktion gestartet, die braucht eine Weile. Wenn dann die Quittung kommt (das soll dann die LED anzeigen), ist die Taste längst wieder losgelassen.

    Ich habe mir mal eine Funktion gebastelt, die das Icon verändert. Während WM_INITDIALOG lade ich das Icon aus der Resource in ein Handle. Ein zweites Handle speichere ich nach dem Aufruf der Funktion. Je nach Eintreffen der Message lade ich dann das eine oder andere Handle mit BM_SETIMAGE auf die Taste.

    HICON CreateIcon2(HICON hinp)
    {
    	ICONINFO ii; HICON hout; INT k,l;
    
    	if(!GetIconInfo(hinp,&ii)) return hinp;		//bei fehler icon nicht ändern
    	HDC hdc1,hdc2;
    	hdc1=CreateCompatibleDC(NULL);
    	hdc2=CreateCompatibleDC(NULL);
    	ii.hbmMask=(HBITMAP)SelectObject(hdc1,ii.hbmMask);
    	ii.hbmColor=(HBITMAP)SelectObject(hdc2,ii.hbmColor);
    //4x4 pixel grosser bereich links oben
    	for(k=0;k<4;++k)
    	{
    		for(l=0;l<4;++l)
    		{
    			SetPixel(hdc1,k,l,RGB(0,0,0));		//hintergrund
    			SetPixel(hdc2,k,l,RGB(128,128,128));	//farbe
    		}
    	}
    	ii.hbmColor=(HBITMAP)SelectObject(hdc2,ii.hbmColor);
    	ii.hbmMask=(HBITMAP)SelectObject(hdc1,ii.hbmMask);
    	DeleteDC(hdc1);
    	DeleteDC(hdc2);
    	hout=CreateIconIndirect(&ii);
    	DeleteObject(ii.hbmColor);	//neu erstellte bitmaps zerstören
    	DeleteObject(ii.hbmMask);
    	return hout;
    }
    

    Ich habe es nicht so mit DeviceContext's und SelectObject. Der Code oben funktioniert zwar, aber ich weiss nicht, ob ich irgendwo ein Speicherleck erzeugt habe. Könnte jemand von Euch mal drüberschauen ob das so sicher ist?
    Danke.


  • Mod

    Ja und?
    Warm soll das nicht gehen. Du setzt oder sendest eine eigene definierte Message an den Buttin und gut.
    Das Ownerdraw immer noch die richtige Lösung ist finde ich immer noch.

    Und was soll bitte der Code? Es ist sicherlich einfacher ein zweites Icon in den Ressourcen abzulegen und zu nutzen als eines onthe fly zu ändern. Letzteres kostet sichermehr Ressourcen und Speicher als sich der bereits im Speicher befindlichen Daten zu bedienen.


Log in to reply