Announcement

Collapse
No announcement yet.

Probleme mit Transparenz in einer Form

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Transparenz in einer Form

    Edit: Hab den Titel von "Probleme mit Form-Editor" nach "Probleme mit Transparenz in einer Form" geändert.

    Hallo zusammen,
    eigentlich wollte ich für das Programm, was ich für meine Bachelor-Thesis geschrieben hab noch nen kleinen Wilkommensbildschirm hinzufügen.
    (sollte ja eigentlich nicht so schwer sein :-))

    leider bin ich doch auf größere Probleme gestoßen.

    ich habe zwei Bilder angehängt.
    imEditor.jpg: wie es aussehen soll
    Programmablauf.jpg: wie es aussieht

    ich verwende Visual Studio 2005.

    kann mir jemand verraten warum da sowas passirt??
    meine Einstellungen sind:

    BackColor: Black
    ForeColor: White

    und beim Fenster sind für den TransparencyKey keine Einstellung getroffen.
    Das Bild ist ein BMP. JPG geht aber auch nicht.

    ich bin echt ein bischen ratlos und freue mich über jede Hilfe.

    Achso und starten tuhe ich das so:
    Code:
            private void show_start_monitor()
            {
                grafic_window start = new grafic_window();
                start.Show();
                System.Threading.Thread.Sleep(2500);
                start.Close();
            }
    
    
            public mainwindow()
            {
                Thread start_monitor = new Thread(show_start_monitor);
                start_monitor.Start();
    
                System.Threading.Thread.Sleep(500);
                [...]
            }
    in grafic_window mache ich gar nix mehr ausser InitializeComponent();
    Attached Files
    Zuletzt editiert von gfoidl; 16.07.2009, 17:08. Reason: Titeländerung

  • #2
    Der Text rechts oben sind transparente Labels die du über eine Picturebox geschoben hast?

    Dann mußt du wahrscheinlich noch die Labels richtig parenten. Transparente Winform Controls ziehen ihre Hintergrundfarbe von ihrem Parent Control. Da aber eine Picturebox eigentlich kein Container Control ist, ist der Parent der Labels erstmals die Form und nicht die Picturebox. Da die BackColor der Form vermutlich weiß ist ergibt sich dein gezeigter Effekt. Das ist aber ein reines Designerproblem im Code kannst du die Picturebox doch zum Parent der Labels machen.

    Code:
    meinePictureBox.Controls.Add(meinLabel);
    Es würde sich vielleicht auch noch lohnen die Kanten des Textes zu glätten.
    Auf dem kleinen Bild sehe ich aber nicht genau wie das aussieht.

    Dazu eigenes Label vom Winforms Label ableiten OnPaint überschreiben und dort das schreiben des Textes selbst übernehmen wie folgt.

    Code:
    e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
    e.Graphics.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), 0, 0);

    Comment


    • #3
      so direkt kann ich nichts beisteuern aber mir gefällt es nicht wie du deinen Splashscreen aufmachst. Thread.Sleep ist unschön. Mach das ganze doch mit einer einfachen Schleife nach dem Motto: (tut mir leid ist VB aber dient ja nur der verdeutlichung
      [highlight=vbnet]
      Private Sub Show_Start_Monitor
      Dim Start As New grafic_window
      Dim Beginn as DateTime = DateTime.Now.AddSeconds(2.5R)
      Start.Show()
      Do While DateTime.Now >= Beginn
      Loop
      Start.Close()
      End Sub
      [/highlight]
      Würdest du den Splasher nicht in einem eigenen Thread starten würde man sogar noch die Anweisung
      Application.DoEvents
      in die Schleife einfügen.
      Solltest du für dein Vorgehen Gründe haben so entschuldige meinen Beitrag
      Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

      Comment


      • #4
        Erstmal vielen Dank für die schnellen Antworten.

        Jetzt bin ich echt am verzweifeln. Das funktioniert immer noch nicht.
        Aber das wird jetzt auch noch immer komischer.
        wenn ich den Dialog mit Show() als nichtmodalen Dialog öffne, dann hab ich immernoch das gleiche Problem. wenn ich den Dialog aber mit ShowDialog() als modalen Dialog öffne, dann werden die Labels richtig angezeigt. Allerdings kann ich den Dialog dann nicht mehr so beenden wie vorher.

        Hat jemand ne Ahnung worin sich der modale und der nichtmodale Dialog unterscheiden? Also in Bezug auf die Eigenschaften beim Zeichnen des Fensters.

        meine Klassen für den Startbildschirm sieht wie folgt aus:
        Code:
        using System;
        using System.ComponentModel;
        using System.Drawing;
        using System.Windows.Forms;
        
        namespace GPS_Viewer
        {
            public class grafic_window : Form
            {
                private grafic_panel the_grafic_panel;
                private Label title;
                private Label sub_title;
                private Label text;
        
                //Angabe wie weit der Text eingerückt sein soll
                public const int TAB = 420;
        
                public grafic_window(string the_title, string the_subtitle, string the_text)
                {
                    //Fenstereigenschaften einstellen
                    this.FormBorderStyle = FormBorderStyle.None;
                    this.Text = "welcome";
                    this.TopMost = true;
                    this.StartPosition = FormStartPosition.CenterScreen;
                    this.Width = 600;
                    this.Height = 300;
        
                    
                    //Panel erstellen
                    the_grafic_panel = new grafic_panel();
                    the_grafic_panel.BackgroundImage = GPS_Viewer.Properties.Resources.bg;
                    the_grafic_panel.Location = new Point(0, 0);
                    the_grafic_panel.Size = new Size(600, 300);
                    //the_grafic_panel.BackColor = Color.Aqua;
                    this.Controls.Add(the_grafic_panel);
        
                    //Überschrift erstellen
                    title = new Label();
                    title.BackColor = Color.Green;
                    title.ForeColor = Color.Blue;
                    title.Top = 20;
                    title.Left = TAB;
                    title.Text = the_title;
                    title.Enabled = true;
                    the_grafic_panel.Controls.Add(title);
        
                    //Unterüberschrift erstellen
                    sub_title = new Label();
                    sub_title.BackColor = Color.Black;
                    sub_title.ForeColor = Color.White;
                    sub_title.Top = 50;
                    sub_title.Left = TAB;
                    sub_title.Text = the_subtitle;
                    sub_title.Enabled = true;
                    the_grafic_panel.Controls.Add(sub_title);
        
                    this.Invalidate();
                }
            }
        
            class grafic_panel : Panel
            {
                public grafic_panel()
                {
                    this.Paint += new PaintEventHandler(the_line);
                }
        
                public void the_line(object sender, PaintEventArgs e)
                {
                    Graphics g = e.Graphics;
                    g.DrawLine(Pens.White, 425, 50, 600, 50);
                }
            }
        zum Beitrag von das-d:
        Ich habe deinen Rat zu Herzen genommen. der Aufruf sieht jetzt so aus:
        Code:
                private void show_start_monitor()
                {
                    grafic_window start = new grafic_window("GPS-Logger", "Bachelor-Thesis", "text");
                    DialogResult the_result = start.Show();
                    DateTime run_until = new DateTime(DateTime.Now.AddSeconds(2.5).Ticks);
                    while (DateTime.Now.Ticks < run_until.Ticks) ;
                    start.Close();
                }
        warum ist die Anweisung "Sleep" unschön? ich dachte immer das die so was in der Art auch macht.

        Comment


        • #5
          Wenn du denn Dialog mit Show startest läufst du im folgenden entweder in den Sleep() oder den Code von das-d(). Welcher von beiden auch immer du bist in einem BusyWaiting Zustand heißt der Programmablauf hängt an dieser Stelle und damit werden keine Messages aus der Nachrichtenwarteschlange abgearbeitet. Wie eben zum Beispiel WM_Paint Messages die du zum richtigen Zeichnen des Splashscreens bräuchtest.

          Bei der Variante mit ShowModal kommst du gar nicht in den besagten Code sondern innerhalb des ShowModal Aufrufs wird die Nachrichtenschlange abgearbeitet und ein sauberes Zeichnen ist deshalb möglich.

          Deine Möglichkeiten
          - dafür sorgen das in der Warteschleife entsprechend das-d die Nachrichten abgearbeitet werden mit besagtem Application.DoEvents
          - oder du machst es gleich ohne Sleep(oder dieser Schleife) sondern benutzt einen Timer in grafic_window. Also Dialog mit ShowModal starten, dabei Timer auf diesem Dialog starten der dann nach n Millisekunden den eigenen Dialog mit Close() schließt.


          Edit: Zum Sleep.
          Bevor du eine leere Warteschleife hast solltest du eher Sleep benutzen.
          Die Schleife verbraucht einfach blöd Prozessorzeit während Sleep den aktuellen Thread anhält und keine weitere Prozessorzeit verbrät. Die Schleife hat aber den Vorteil das man darin eben noch was anderes erledigen kann während man wartet.

          Comment


          • #6
            Originally posted by Ralf Jansen View Post
            Wenn du denn Dialog mit Show startest läufst du
            Edit: Zum Sleep.
            Bevor du eine leere Warteschleife hast solltest du eher Sleep benutzen.
            Die Schleife verbraucht einfach blöd Prozessorzeit während Sleep den aktuellen Thread anhält und keine weitere Prozessorzeit verbrät. Die Schleife hat aber den Vorteil das man darin eben noch was anderes erledigen kann während man wartet.
            Danke für den Hinweis Ralf. Soweit hatte ich noch gar nie gedacht aber das gibt natürlich sinn. Wobei ich sagen muss dass ich eh noch nie eine leere Warteschleife hatte. Aber der Denkansatz ist wichtig
            Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

            Comment


            • #7
              Vielen Dank an Ralf Jansen und das-d. Ihr habt mir sehr gelholfen. Ich habe den Startscreen zunächst mit dem Application.DoEvents gelöst.
              Jedoch werde ich es (sofern mir noch zeit bleibt) auch noch mit dem Timer probieren.

              Comment

              Working...
              X