Laden...

Add-In (Transparente Blder)

Erstellt von Xqgene vor 18 Jahren Letzter Beitrag vor 18 Jahren 10.796 Views
X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren
Add-In (Transparente Blder)

wie der Titel bereits andeutet, schreibe ich ein Add-In für VS (2005).
dabei werden auch einige Menüs erzeugt. Diesen Menüs weise ich kleine Bilder zu.
nun habe ich das Problem, dass die Bilder in den Menüs keinen transparenten Hintergrund haben.

weiß jemand, wie (in welchem Format) die Bilder erzeugt werden müssen?

Danke im Voraus.

4.221 Beiträge seit 2005
vor 18 Jahren

BitMap.MakeTransparent(Colors.DieFarbeDieTransparentSeinSoll) oder so...

bsp:



Bitmap bmp=new Bitmap(this.pictureBox1.Width,this.pictureBox1.Height);
			using(Graphics g=Graphics.FromImage(bmp))
			{
				g.FillRectangle(Brushes.White,0,0,bmp.Width,bmp.Height);
				g.DrawString("Guckst du",this.Font,Brushes.Red,10,10);
				bmp.MakeTransparent(Color.White);
				this.pictureBox1.Image=bmp;
			}


Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

140 Beiträge seit 2005
vor 18 Jahren

ohne alpha-channel: *.gif
in den bildbearbeitungsprogrammen (z.b. photoshop) kannst du bei *.gif-bilder eine farbe als transparency-key definieren. d.h. alle bereiche im bild, die diese farbe haben, werden transparent dargestellt.

mit alpha-channel: *.png
damit kannst du halbtransparente bereiche definieren, und so z.b. schatten/anti-aliasing schön darstellen. (photoshop-hilfe 😉 )

<edit>

Original von Programmierhans
BitMap.MakeTransparent(Colors.DieFarbeDieTransparentSeinSoll) oder so...

oder so... 8)
</edit>

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

Danke für die Antworten.

Leider habt ihr was übersehen.

Es geht nicht einfach um irgendwelche bildchen, sondern um die bilder in den Menüs bzw. Toolbars von VisualStudio.

da kann ich nix selbst zeichnen und gif's oder png's habe ich bereits auch getestet.

intern sind die bilder im format StdPicture abgelegt:
zurzeit setze ich die bilder wie folgt:

 
...
                Microsoft.VisualStudio.CommandBars.CommandBarButton commandBarButton =
                    cmd.AddControl(commandBar, index) as Microsoft.VisualStudio.CommandBars.CommandBarButton;

                if (buttonPicture != null)
                    commandBarButton.Picture = (stdole.StdPicture)Support.ImageToIPicture(buttonPicture);
...

noch ideen?

4.221 Beiträge seit 2005
vor 18 Jahren

was ist buttonPicture ?

Wenn es ein Bitmap-Type ist kannst Du doch nen Graphics draus ziehen... dann so wie in meinem Code beschrieben die Transparente Farbe setzen und das Bild wieder saven (dann ist das Problem gelöst..... oder das im Memory veränderte Bild so weiterverwenden )

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

buttonPicture ist ein Bitmap.

das pProblem liegt, glaube ich, bei der Konvertierung zu StdPicture.

commandBarButton.Picture = (stdole.StdPicture)Support.ImageToIPicture(buttonPicture);

Die Transparenz des normalen .NET Bitmaps wird nicht berücksichtigt, bzw. geht verloren. (getestet)

zeichnen in dem Bitmap selbst bringt nix, und in commandBarButton.Picture kann ich nicht zeichnen. leider finde ich keine vernünftige/gar keine doku zu StdPicture.

151 Beiträge seit 2004
vor 18 Jahren

das problem hatte ich auch schon mal ...

lösung ist relativ einfach und lautet immer noch *.gif ...

alles was du brauchst ist GIMP (photoshop-ähnliches opensource-proggi) ...

lade deine "untransparenten" icons in gimp ... markiere den "untransparenten" hintergrund ... dann markierung umkehren ... das markierte in zwischenablage kopieren ...
danach mit gimp ein neues dokument erstellen ... 16 x 16 pixel zum beispiel ... bei den erweiterten einstellungen im erstellen-dialog kannst du festlegen das das bild einen transparenten hintergrund bekommen soll ... dann fügste das markierte von vorigen bild ein ...speicherst alles unter dem format *.gif und schon hast du das bildchen im menu wie du es haben willst ...

grüßle

frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)


mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

und wie weise ich das bild meinem menü zu?

200 Beiträge seit 2004
vor 18 Jahren

Hallo Xqgene,

bin gerade bei der Suche nach einer Anderen Lösung mit Bitmaps über Deine Frage gestolpert. Also falls Du immer noch nach einer Antwort suchst:

Für Images die Du auf einem Add-In Comand unterbringen willst brauchst Du eine Bitmap in der Größe 16x16 (TrueColor). Die Farbe die von Visual Studio als Transparent dargestellt wird ist ein giftiges Grün (0,254,0). Jede abweichung bringt ein falsches Ergebnis.

Hinweis: Der BitmapExplorer von VS hat eine falsche Farbpalette. So das er zwar 0,254,0 dir anzeigt, es aber kein 0,254,0 in Wirklichkeit ist.

Das Bitmap legst Du dann in einer der Sprachregion entsprechend banannten Resource- Datei ab. In der Methode AddNamedCommand gibst Du dann anstelle true für das MSO-Button Argument false an und für den Index des Images den Wert deines eigenen Images (das ist der Name der Bitmap in Deiner Resourcedatei, der immer eine Zahl sein muss!).

HTH
TOM_MUE

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

Danke für die Antwort.
Das habe ich zwar schon mal versucht, es aber hat nicht funktioniert, da ich nirgendwo die richtigen Werte für die Hintergrundfarbe finden konnte.

Ich habe zwar inzwischen eine andere Lösung gefunden, aber ich werde diese testen.

S
1.047 Beiträge seit 2005
vor 18 Jahren

Ich habe zwar inzwischen eine andere Lösung gefunden...

und die wäre?
gibt sicher auch andere die mal so ein problem haben und wären sehr dankbar wenn auhc ein funktionierende lösung gepostet wird 😉

das problem gibts auch bei den symbolleisten von office, dort gibts 2 möglichkeiten:

  • man kann eine maske setzen, also ein schwarz-weiß bild, wobei alle weißen bereiche transparent dargestellt werden
  • das bild was man zum button setzt, muß transparent gemacht werden mittels bestimmter methoden, sonst wird diese nicht anerkannt
200 Beiträge seit 2004
vor 18 Jahren

Hallo,

Also ich erstelle die Bitmap für die Commands immer mit Paint.NET.

Wichtig sind wirklich folgende Merkmale die ein Bild für VS2005 mitbringen muss:

a) Es muss eine Bitmap sein.

b) Die Eigenschaft Colors muss für VS2005 auf "True Color" stehen.

c) Die Größe der Bitmap muss 16x16 sein.

d) Die HintergrundFarbe (also die die Transparent sein soll) muss 0,254,0 sein. Mann kann für die Controls eines Visual Studio AdIns keinen Transparentbereich selbst festlegen!

e) Das Bitmap muss in einer Resourcen- DLL eingebettet sein, die den Namen für die unterstützte Region trägt (en-US, de-DE usw.)

f) Das Bitmap muss in der Resouce-Datei liegen und da als Namen eine Zahl haben (1,2 oder 3 oder 4 etc.)

g) in der Methode "AddNamedCommand2(...)" ,muss der Werte für MSO- Button auf false und der Wert für den Index auf den des Bitmap- Names in Form eines Integers gesetzt werden.

DTE.Commands.AddNamedCommand2(AddInInstance,"CommName","BtnName","ToolTip",false,1,.....);

Der Name der ResourceDateien im AddIn Projekt lautet dann für Deutschland

"<NameProject>.de-DE.resx" Die Punkte sind wichtig!

Dann wird auch alles so dargestellt wie man es sich wünscht.

Wer mehr wissen will und zufällig auf der BASTA nächste Woche dabei ist, ich halte da eine 75Min. Session zu "BestPractices VS2005 Add-In Entwicklung und zwar am Mittwoch den 15.02.2006 von 17:15 - 18:30 Uhr. Würde mcih freuen einen von Euch da zu treffen.

Visual Studio 2005 Add-in Best Practices

HTH
TOM_MUE

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

Original von sheitman

Ich habe zwar inzwischen eine andere Lösung gefunden...
und die wäre?

Original von sheitman

  • man kann eine maske setzen, also ein schwarz-weiß bild, wobei alle weißen bereiche transparent dargestellt werden

genau so mache ich jetzt. wenn ich heut' zu Hause bin, poste ich den entsprechenden Code.

1.271 Beiträge seit 2005
vor 18 Jahren

Hallo TOM_MUE,

Wird es danach auch irgendetwas davon im Internet zu sehen geben (Folien, ...)? Ich finde das Thema interessant, bin aber leider nicht auf der BASTA!.
Ich wünsch dir auf jeden Fall viel Erfolg!

Gruß,
progger

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

200 Beiträge seit 2004
vor 18 Jahren

Hi progger,

ja wird es geben. Ich werde alle Samples zum Download frei geben und wenn ich das darf, werde ich auch die BASTA- Folien zum freien Download online stellen. Sonnst wird es andere Folien geben.

Vielen Dank fürs Daumen halten 👍

TOM_MUE

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

Original von Xqgene
wenn ich heut' zu Hause bin, poste ich den entsprechenden Code.

sollte das jemanden doch noch interessieren, hier ein paar Zeilen Code:

Bild einem Button zuweisen und Maske setzen:

commandBarButton.Picture = (stdole.StdPicture)Support.ImageToIPicture(buttonPicture);
commandBarButton.Mask = (stdole.StdPicture)Support.ImageToIPicture(Drawing.CreateMask(buttonPicture, Color.Magenta));

dabei ist buttonPicture das gewünschte Bild, stdole.StdPicture und Support.ImageToIPicture sind im Microsoft.VisualBasic.Compatibility.VB6 Namespace definiert.

und die CreateMask()-Methode:

        public static Bitmap CreateMask(Image sourceImage, Color backgroundColor)
        {
            int mcol = backgroundColor.ToArgb();

            Bitmap bmp = new Bitmap(sourceImage);
            Rectangle rect = new Rectangle(new Point(0, 0), bmp.Size);
            BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);
            unsafe
            {
                uint* ptr = (uint*)bmpdata.Scan0;
                for (int i = 0, j = bmp.Width * bmp.Height; i < j; i++)
                {
                    if (mcol != (int)*ptr)
                        *ptr = 0;
                    ptr++;
                }
            }
            bmp.UnlockBits(bmpdata);
            return bmp;
        }

200 Beiträge seit 2004
vor 18 Jahren

Hallo Xqgene,

also das es so auch funktionieren kann ist auf jeden Fall interssant mal zu sehen.

Aber kannst Du mir mal erklären wozu ich mir für das Bild, so einen Aufwand machen soll? Das würde ich pers. nie anwenden. Wenn ich mir das Bild schon selber zeichne, dann mach ich mir halt die transparenten Bereiche im RGB- Wert 0,254,0 und brauch null zeilen Code schreiben (sag mir jetzt bitte nicht das Du den RGB- Wert 0,254,0 für die Darstellung Deines Bildes brauchst 8o).

Was machst Du denn beim TabPicture eines eigenen ToolWindows? Da kannst Du doch dann keinen anderen RGB- Wert als den 255,0,255 nehmen.

Also ist nicht bös gemeint aber Deine Lösung würde für mich nur Mehraufwand bedeuten, den ich mit dem Setzen des rictigen RGB- Wertes ohne Code erreiche.

Gruß
TOM_MUE

PS: Was ist mit Deinen Fragen zum Setup? 🙂

X
Xqgene Themenstarter:in
2.051 Beiträge seit 2004
vor 18 Jahren

Das ist auch Mehraufwand, aber wie du bereits gelesen hast, hatte ich damals:

Original von Xqgene
Das habe ich zwar schon mal versucht, es aber hat nicht funktioniert, da ich nirgendwo die richtigen Werte für die Hintergrundfarbe finden konnte.

Einen Vorteil hat meine Lösung aber auf jeden Fall. Die ist nicht Culture abhängig. Ich brauche also nicht für jede Kultur extra Ressourcen-Assembly erstellen, nur für ein paar Bildchen.

PS: Was ist mit Deinen Fragen zum Setup?

vorerst hat sich das erledigt. danke die Nachfrage.