Mr Burns Skrevet 29. mars 2007 Del Skrevet 29. mars 2007 (endret) 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 15. mai 2007 av Mr Burns Lenke til kommentar
GeirGrusom Skrevet 2. april 2007 Del Skrevet 2. april 2007 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. Lenke til kommentar
Mr Burns Skrevet 10. april 2007 Forfatter Del Skrevet 10. april 2007 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
GeirGrusom Skrevet 10. april 2007 Del Skrevet 10. april 2007 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
Mr Burns Skrevet 11. april 2007 Forfatter Del Skrevet 11. april 2007 Er sånn du mener: Form.ActiveForm.TransparencyKey = Form.ActiveForm.BackColor; Gir desverre en exception... Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on. Lenke til kommentar
GeirGrusom Skrevet 11. april 2007 Del Skrevet 11. april 2007 F.eks. men velg formen i editoren, og velg TransparencyKey egenskapen, og velg Color.Control istedet. den feilen der, kommer av a du prøver å endre egenskapen fra en annen thread. Dette kan du løse med å bruke Invoke funksjonen, hvis du kommer ut for det i fremtiden. Lenke til kommentar
Mr Burns Skrevet 11. april 2007 Forfatter Del Skrevet 11. april 2007 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
GeirGrusom Skrevet 11. april 2007 Del Skrevet 11. april 2007 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 Lenke til kommentar
Mr Burns Skrevet 12. april 2007 Forfatter Del Skrevet 12. april 2007 (endret) 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 12. april 2007 av Mr Burns Lenke til kommentar
GeirGrusom Skrevet 12. april 2007 Del Skrevet 12. april 2007 (endret) 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 12. april 2007 av GeirGrusom Lenke til kommentar
Mr Burns Skrevet 18. april 2007 Forfatter Del Skrevet 18. april 2007 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
Mr Burns Skrevet 15. mai 2007 Forfatter Del Skrevet 15. mai 2007 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå