Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Transparenz und OnPaint Problem in Form
Simon Heinzmann
myCSharp.de - Member

Avatar #avatar-2571.jpg


Dabei seit:
Beiträge: 43
Herkunft: Bayern

Themenstarter:

Transparenz und OnPaint Problem in Form

beantworten | zitieren | melden

Guten Morgen,

Folgendes Szenario siehe Anhang:

- Form mit Sternen BackgroundImage
- Panel in der Mitte das das Signal der Webcam ausgibt
- Eine grosse PictureBox unten mit PNG Bild
- Drei kleine PictureBoxen oben jeweils rechts und links neben dem Panel und genau darüber

Ziel:
Über das Panel soll ein Rahmen kommen

Variante Balken Unten:
Unten hab ich einfach eine Picturebox über das Panel gelegt, aber nach kurzer Recherche hab ich erfahren das es keine echte Transparenz gibt und deshalb der Background von der Form angezeigt wird und nicht das Panel

Variante mehrere Balken Oben:
Den Balken direkt auf das Panel zulegen bringt nichts weil das Panel von der Webcam immer übermalt wird. Deshalb hab ich in das OnPaintEvent der Form folgendes eingebaut:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
// using AxSHDocVw;

namespace InnovationsCockpitPrototyp
{
    public partial class FormDispalyFrontPassenger : Form
    {
       protected override void OnPaint(PaintEventArgs e)
        {
            Assembly myAssembly = Assembly.GetExecutingAssembly();
            Stream myStream = myAssembly.GetManifestResourceStream("InnovationsCockpitPrototyp.Resources.Passenger_mitte.png");
            Bitmap bmp = new Bitmap(myStream);
            Graphics g = e.Graphics;
            g.DrawImage(bmp, 380, 0);
            base.OnPaint(e);
        }
    }
}

Any Ideas???

Gruss
Simon
Attachments
private Nachricht | Beiträge des Benutzers
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 593
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

Hallo,

wie gesagt ist es blöd mit GDI+ und Transparenz zu arbeiten. Der einzigst mir bekannte funktionierende Weg wäre es den Inhalt des Panels zu bereichnen und entsprechend in schwächeren Farbtönen wieder zugeben um eine "vorgegaukelte" transparenz zu enthalten. Für wirkliche Transparenz kannst du z.b. WPF benutzen weil das auch auf DirectX zurückgreift.
private Nachricht | Beiträge des Benutzers
Simon Heinzmann
myCSharp.de - Member

Avatar #avatar-2571.jpg


Dabei seit:
Beiträge: 43
Herkunft: Bayern

Themenstarter:

beantworten | zitieren | melden

Hi,

ich kann direkt auf der Form zeichnen (das Weisse Dreieck siehe Anhang) und die Transparente Picturebox darüber legen. Das funktioniert wunderbar. Meine Idee war das bei jeder Änderung des Panels (OnPaint Event) ich einfach das transparente Bild darüber male.....

Gruss
Simon
Attachments
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

HalloSimon Heinzmann

da "wer zuletzt malt, malt am besten" gilt, solltest du base.OnPaint(e); immer als erstes aufrufen. Ob das dein Problem löst, steht auf einem anderen Blatt.

herbivore
private Nachricht | Beiträge des Benutzers
Simon Heinzmann
myCSharp.de - Member

Avatar #avatar-2571.jpg


Dabei seit:
Beiträge: 43
Herkunft: Bayern

Themenstarter:

beantworten | zitieren | melden

Hi,

@herbivore: bringt leider nichts
@all: Noch andere Ideen???

Gruss
Simon
private Nachricht | Beiträge des Benutzers
Raptor 2101
myCSharp.de - Member



Dabei seit:
Beiträge: 119

beantworten | zitieren | melden

wie herbivore schon angedeutet hat "wer zuletzt malt..."

das problem ist, dass die Windows.Forms pe definition keine Transparenz beherschen. Diese Pseudotransparenz funktioniert nur mit elementen hörer ebene (parent) dort wird das gezeichnete bild zurechgeschnitten usw

Die Transparenz kann nur von einer höheren Hirarchieebene "durchgereicht" werden.
Elemente in der gleichen ebene (iin der gleichen Controls-collection zb) können sich nicht gegenseitig beeinflussen (transparenztechnisch...)

wenn du also diesen effekt willst musst du deine Elemente so ineinader verschachteln, dass das Element welches topmost ist, das unterste Child ist...

brauchst du 2 objekte die sich gegenseitig beeinflussen, muss du das zeichnen selber übernehmen. Also dir das image der objekte als Graphic holen und "zeichen" aber das geht performanter mit DirectX
private Nachricht | Beiträge des Benutzers
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 593
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

Wie ich schon gesagt habe um das wirklich tauglich zu lösen muss man DirectX OpenGl benutzen. Am einfachsten geht das ganze in .Net mit WPF ^^ Oder es gibt auch glaube ich OpenGL Controls die dort innerhalb OpenGL rendern damit würde es wohl auch gehen.
private Nachricht | Beiträge des Benutzers