Gå til innhold

Anbefalte innlegg

Hei!

 

Jeg lager mine egne knapper ved hjelp av pictureBox. De skal være runde og dragbare, og er fine å se til ;-)

 

Men jeg får ikke gjennomsiktigheten til å funke. De er tegne uten gjennonsiktighet, så jeg bruker MakeTrasparent for å gjøre en farge gjennomsiktig. Problemet er bare at fargen blir ikke gjennomsiktig, men den samme som bakgrunnsfargen i Formet. Gjør jeg noe galt, eller har jeg bare misforstått?

 

 

Bitmap b = new Bitmap(recorderButtonPic.Image);
Color t = b.GetPixel(1, 1);
b.MakeTransparent(t);
recorderButtonPic.Image = b;

 

EDIT: Endret emnetittel

Endret av Mr Burns
Lenke til kommentar
Videoannonse
Annonse
Du trenger ikke sette denne egenskapen på Bitmap, dette gjør bare at når du tegner et Bitmap uten en Alpha kanal, kan du velge en mask color.

 

Bruk Form.TransparencyKey istedet.

8296152[/snapback]

Er det slik du mener:

            Bitmap b = new Bitmap(recorderButtonPic.Image);
           b.MakeTransparent(TPC.ActiveForm.TransparencyKey);
           recorderButtonPic.Image = b;

Ser helt likt ut... Blir ikke gjennonsiktig..

Lenke til kommentar

Du bruker den feil :)

 

TCP.ActiveForm.TransparencyKey = Color.Magenta

 

Etterpå kan du tegne over formen, eller enklest, bare sett Image egenskapen til Bitmapet du har laget.

Du kan endre TCP.ActiveForm.TransparencyKey til [bitmap].GetPixel(0, 0) hvis du vil.

 

MakeTransparent er for å sette en gjennomsiktig farge på et bitmap, det trenger du ikke å gjøre i dette tilfellet.

Lenke til kommentar
F.eks. men velg formen i editoren, og velg TransparencyKey egenskapen, og velg Color.Control istedet.

8359269[/snapback]

 

Akkurat...

 

Da blir selve formen gjennomsiktig, men det jeg trenger er at pictureboxen er gjennomsiktig til det som ligger under pictureboxen.

Lenke til kommentar

Ah, skjønner :)

 

Hvis det ikke hjelper å sette PictureBox.BackColor til Color.Transparent, må du deklarere en egen klasse:

class MyTransparentPictureBox : PictureBox
{
 public override CreateParams CreateParams
 {
   get { CreateParam param = base.CreateParams; param.ExStyle |= 0x00000020; return param; }
 }
}

 

Tror jeg burde fungere... har ikke prøvd :p

Lenke til kommentar

Haha! Genialt! Takker og bukker!

 

    class TransPictureBox : PictureBox
   {
       protected override CreateParams CreateParams
       {
           get { CreateParams param = base.CreateParams; param.ExStyle |= 0x00000020; return param; }
       }
   }

Men det ble litt feil når jeg flytter rundt på knappen. Bildet flyttes raskere enn Transpictureboxen, og "flyter ut". Hvis jeg flytter knappen "veldig" fort, blir hele knappen lengre enn opprinnelig størrelse!

Endret av Mr Burns
Lenke til kommentar

Prøv å legg til [MyPictureBox].Invalidate() når du flytter den rundt, og legg all tegning i Paint event, eller OnPaint funksjonen, dvs. ikke bruk CreateGraphics til å tegne med.

 

edit: Menneh, nå som du er kommet så langt som å lage din egen klasse for å få til dette, kan du bruke denne klassen til knappen.

 

Bytt ut MyPictureBox : PictureBox Med:

[system.ComponentModel.DefaultEvent("Click")]

MyButton : Control, IButtonControl

 

og implementer IButtonControl, og legg til:

 

protected override void OnPaint(object sender, PaintEventArgs e)
{
 base.OnPaint(sender, e);
 // Tegn knappen din her ved å bruke e.Graphics
}

 

Så har du din fiks egne knapp (då må legge til egen kode på mousedown og mouseup etc. Invalidate() tegner på nytt)

Endret av GeirGrusom
Lenke til kommentar
Så har du din fiks egne knapp (då må legge til egen kode på mousedown og mouseup etc. Invalidate() tegner på nytt)

8365679[/snapback]

 

Hmmm, intill videre legger jeg dette et stykke nede på TODO-lista. Det er kun av estetisk art, og ikke funksjonskritisk.

 

Takk for hjelpen, uansett!

Lenke til kommentar
  • 4 uker senere...
Så har du din fiks egne knapp (då må legge til egen kode på mousedown og mouseup etc. Invalidate() tegner på nytt)

8365679[/snapback]

 

Jeg har sett litt på dette i dag, og kommet så langt som dette:

Klikk for å se/fjerne innholdet nedenfor

    class TransPictureBox : PictureBox
   {
       protected override CreateParams CreateParams
       {
           get { CreateParams param = base.CreateParams; param.ExStyle |= 0x00000020; return param; }
       }
       protected override void OnPaint(PaintEventArgs pe)
       {
           try
           {
               // Background image
               Bitmap backBitmap = new Bitmap(37, 37);
               Graphics backGraphics = Graphics.FromImage(backBitmap);
               //backGraphics = Graphics.FromImage(backBitmap);
               Point coord = new Point(TPC.ActiveForm.Location.X + 158 + this.Location.X + 4 , TPC.ActiveForm.Location.Y + 724 + this.Location.Y + 23);
               backGraphics.CopyFromScreen(coord, new Point(0, 0), new Size(37, 37));

               // Button image
               Bitmap buttonBitmap = new Bitmap(this.Image.Size.Width, this.Image.Size.Height);
               Graphics buttonGraphics = Graphics.FromImage(buttonBitmap);
               buttonGraphics.DrawImage(this.Image, 0, 0);

               // Copy button to bitmap
               BitmapData backBitmapData = backBitmap.LockBits(new Rectangle(0, 0,
                                        backBitmap.Width, backBitmap.Height),
                                        ImageLockMode.ReadWrite,
                                        PixelFormat.Format24bppRgb);

               BitmapData buttonBitmapData = buttonBitmap.LockBits(new Rectangle(0, 0,
                                        buttonBitmap.Width, buttonBitmap.Height),
                                        ImageLockMode.ReadOnly,
                                        PixelFormat.Format24bppRgb);

               unsafe
               {
                   byte* backBitmapPointer = (byte*)backBitmapData.Scan0;
                   byte* buttonBitmapPointer = (byte*)buttonBitmapData.Scan0;

                   // Transparent color:
                   byte[] trans = new byte[3];
                   trans[0] = 255; 
                   trans[1] = 255; 
                   trans[2] = 0;

                   for (int i = 0; i < backBitmapData.Height; i++)
                   {
                       for (int j = 0; j < backBitmapData.Width; j++)
                       {
                           //Sjekk mot trans!
                           if ((buttonBitmapPointer[0] == trans[0]) && (buttonBitmapPointer[1] == trans[1]) && (buttonBitmapPointer[2] == trans[2]))
                           {
                               // transparent pixel:Do nothing
                           }
                           else
                           {
                               // Copy pixel
                               backBitmapPointer[0] = buttonBitmapPointer[0];
                               backBitmapPointer[1] = buttonBitmapPointer[1];
                               backBitmapPointer[2] = buttonBitmapPointer[2];
                           }

               //            //4 bytes per pixel
                           backBitmapPointer += 3;
                           buttonBitmapPointer += 3;
                       }//end for j
                       //4 bytes per pixel
                       backBitmapPointer += backBitmapData.Stride -
                                       (backBitmapData.Width * 3);
                       buttonBitmapPointer += buttonBitmapData.Stride -
                                       (buttonBitmapData.Width * 3);
                   }//end for i
               }//end unsafe

               backBitmap.UnlockBits(backBitmapData);
               buttonBitmap.UnlockBits(buttonBitmapData);

               // Paint it back to screen
               pe.Graphics.DrawImage(backBitmap, pe.ClipRectangle.Location);
               //base.OnPaint(pe);
           }
           catch (NullReferenceException nre)
           {
               // Activeform not visible yet...
               // Not much to do about it...
           }

       }
   }

Har fremdeles litt problemer:

 

- Flimring, sannsynligvis ikke raskt nok...

- Problem med å "treffe" rett plass for å kopiere fra skjerm.

- Jeg klarer å dra musa raskere enn knappen blir tegnet opp, slik at knappen virker "treg", og henger igjen.

- Knappen er synlig flere steder samtidig. :-(

- Må passe på at knappen blir tegnet når bakgrunnen blir det.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...