Announcement

Collapse
No announcement yet.

Schriftgröße dem Label anpassen?

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

  • Schriftgröße dem Label anpassen?

    Hallo,

    mal nur ne kurze Frage für zwischendurch:

    Bei Labels kann man ja das Label dem Text anpassen (mit AutoSize), nur wie geht es andersrum? Ich möchte einem Label eine Größe zuweisen und der Text darin, soll sich dementsprechend verhalten. Ist nur 1 Buchstabe, soll dieser riesig sein, ist es ein Wort, dementsprechend kleiner, so dass alles angezeigt wird...! Wie kann ich denn das machen? Hab schon gegooglet, die SDK durchforstet und nun bin ich (mal wieder ) hier gelanted!

    Danke schon mal!

  • #2
    Hallo,

    dafür dürfte das Control.Paint-Ereignis passen: Zunächst musst Du in einer Schleife (berechnet auf Font.Size) ausrechnen, wie groß ein bestimmter Text bei einer bestimmten Schriftgröße wird und wie lange er in den zur Verfügung stehenden Platz passt; dann musst Du den Text mit der so gefundenen Schriftgröße zeichnen.

    Stichworte: das Beispiel zum Control.Paint-Ereignis in der SDK-Doku, eine der Überladungen der Graphics.MeasureString-Methode oder (was wahrscheinlich besser ist) die Variante der TextRenderer.MeasureText-Methode (String, Font, Size) zum Berechnen der Textgröße.

    Gruß Jürgen

    Comment


    • #3
      Vielen Dank für die Antwort, das wird mir schon weiterhelfen. Wusste nur nicht mehr, nach was ich noch suchen soll. Werd mich heut Abend mal an die Arbeit daran machen..!

      Comment


      • #4
        OK, soviel zum Thema "das wird mir schon weiterhelfen"...!
        Ich bin gerade am Experimentieren und rumprobieren, habe mir die entsprechenden Teile raus gesucht und komm nicht weiter. Ich glaub ich muss näher erläutern, was ich vor habe:

        Das Programm ist ein kleines Tool um Maustasten ab zu fragen und dann, je nach dem welche gedrück wurde eine entsprechende Aktion aus zu führen. Falls es jemanden Interessiert, es ist ein Programm für die sog. Unterstütze Kommunikation und soll behinderten Kindern dienen, sich mit zu teilen. Zu diesem Zweck wurde eine Maus umgebaut und die Maustasten auf große Schalter adaptiert. Das Program kann Bilder anzeigen (Symbole), Töne wiedergeben (.wav) und eben einen Text anzeigen, derzeit als Label gelöst. Der Text soll aber die volle zur verfügung stehende Fläche von 944x424 nutzen. Je nach dem wieviel angezeigt wird, so muss sich auch der Text anpassen. Der Text wird während der Laufzeit geändert, so dass man mit der einen Taste "Ma" schreibt und mit der 2. "ma" und stehen soll nacher "Mama" (als Beispiel). Das ganze muss also sehr dynamisch reagieren....
        Und nun sitz ich da und mir raucht die Birne. Ich programier nur zum Hobby, nicht kommerziell oder so und ich habe nicht viel Zeit um Bücher durch zu welzen. Ich würde behaupten, ich kann C#, beherrschen ist aber wieder was anderes. Ein anderes Programm in c# habe ich bereits geschrieben und auch bis zu diesem Punkt ist das jetzige so wie ich will, aber der Punkt passt noch nicht...
        Bitte Hilfe!!!

        Comment


        • #5
          Originally posted by Hurtz2k View Post
          Ich bin gerade am Experimentieren und rumprobieren, habe mir die entsprechenden Teile raus gesucht und komm nicht weiter.
          Das ist natürlich im Gesamtzusammenhang etwas komplexer, aber meine Hinweise sollten trotzdem helfen. Ich könnte Dir jetzt eine Methode GetMaxFontSize(String, Font, maxWidth) schreiben, die aus dem Paint-Ereignis heraus aufgerufen wird, und zusätzlich das Beispiel zum Paint-Ereignis umschreiben. Aber Du hast doch mehr davon, wenn Du es selbst probierst.

          Offensichtlich hast Du etwas versucht, womit Du nicht weiterkommst. Was denn? Vielleicht kann ich Dir dabei Hinweise geben? Jürgen

          Comment


          • #6
            Aber Du hast doch mehr davon, wenn Du es selbst probierst.
            Da haste recht, ich muss das wirklich selbst machen, weil ich wirklich so ein Lerntyp bin - try and error! Aber der Hinwes zu GetMaxFontSize is schon mal sehr gut, das leuchtet mir gerade ein und nun ist der Rest auch ziemlich logisch! Die Anderen Teile zum Puzzel hab ich ja schon, soll heißen, den Text an einen vorhandenen hängen während der Laufzeit, auf Tastendruck der Maus reagieren usw usw usw, das war alles kein Problem, nur die Schriftgröße! Also, noch ein Versuch...! Vielen Dank für die Hilfe!

            Comment


            • #7
              Hallo,

              ich hab eben nochmal deinen ersten Beitrag gelesen und mir fiel auf, dass ich im falschen Ansatz gearbeitet habe! Ich wollte die max. Font-Größe ermitteln, was mir natürlich so nicht gelang, weil ich ja die Größe nicht als Font sonder in Pixeln bekomme. Nun is mir das schon mal klarer. Jetzt weiß ich nur auch ned weiter, wie ich die Schleife am blödesten schreibe, weil ich das noch nie gemacht habe. Ich bin gerade auf der Suche nach einem passenden Beispiel für mich. Wenn ich das Richtig verstanden habe, muss ich das, was geschrieben werden soll durch die Schleife jagen, wobei dann die Größe in Höhe und Länge gemessen wird. Diese muss ich dann vergleichen mit der mir zur verfügung stehenden Größe, passt es rein, soll er es nehmen, passt es nicht, soll er die Schriftgröße anpassen. So richtig oder!? In meiner "unwissenheit" über Schleifen hätt ich jetzt ne ewigkeits-ifAbfrage gemacht, wobei ich natürlich bei einem mir zu verfügung stehendem Platz von groben 800x400 Pixeln ne Zeitlang beschäftigt wäre. Denn dort müsste ich ja jetzt abfragen nach dem Motto: Schreib mir den Text in Arial, 16, schau wie lang ist er, passt er?, passt er nicht, nimm Arial 15 - spiel von Vorne! Wenn ich aber mit nur einem Buchstaben arbeiten will, muss ich ja bei Arial 90 anfangen..... ne oder!?
              Oder steh ich bei deiner Beschreibung auf dem Schlauch?
              Die Länge bekomm ich ja mit
              Code:
                          SizeF stringSize = new SizeF();
                          stringSize = e.Graphics.MeasureString(measureString, stringFont, layoutSize);
              Diese Länge kann ich ja dann mit der Max. zur verfügung stehenden Länge vergleichen. Aber geht das einfacher und schöner? Vor allem, wie weiß ich, bzw der Rechner, dass alles angezeigt wird bei einer bestimmten Größe?

              Pow, ich komm mir grad echt blöd vor, aber als Hobbyprogrammierer muss das wohl mal so sein!

              Achso, weils mir einfällt, kann ich statt einem Font die Größe einfach auch in Pixel angeben? Da hab ich bisher noch nichts gefunden. Also nicht Arial, 16 sonder Arial, 200px z.B.!

              Comment


              • #8
                Im Prinzip hast Du es richtig verstanden, und es geht auch nicht besser. Du kannst nur versuchen zu optimieren:

                1. Benutze nicht Graphics, sondern TextRenderer.
                2. Mache zunächst eine grobe Schätzung: wieviel Platz wird für 10 pt benötigt, wieviel für 90 pt, wieviel Platz steht zur Verfügung, per Dreisatz bekommst Du einen Näherungswert für die mögliche Schriftgröße.
                3. Berechne in einer Schleife gemäß Font.Size den Maximalwert.

                Achso, weils mir einfällt, kann ich statt einem Font die Größe einfach auch in Pixel angeben?
                Ich verstehe überhaupt nicht, wozu es eigentlich die SDK-Doku gibt. Bei einem Dutzend Font-Konstruktoren gibt es mehrere mit GraphicsUnit, und was ist damit wohl möglich? Nein, sowas!

                Jürgen

                Comment


                • #9
                  Originally posted by Jürgen Thomas View Post
                  Ich verstehe überhaupt nicht, wozu es eigentlich die SDK-Doku gibt. Bei einem Dutzend Font-Konstruktoren gibt es mehrere mit GraphicsUnit, und was ist damit wohl möglich? Nein, sowas!
                  OK OK, hast gewonnen! Aber wenn ich doch den Font in Pixeln angeben kann, dann brauch ich doch gar nicht nach dem passenden Font suchen, sondern übergebe gleich diese Größe...! Achso, ne das geht ja auch ned, weil ich ja das ja auch wieder in mein Label bekommen muss und darum ja auch "austesten" muss...! Wobei, wenn ich doch ne einfache Rechnung mache, dann gehts. Wenn ich die max Höhe und Breite des Rahmens durch die Anzahl der Buchstaben teilen lasse, dann bekomme ich doch den Platz, den jeder Buchstabe haben kann und kann dann so den Font einstellen!? ODER!?
                  Ich probier das mal aus, ansonsten muss ich wohl in den sauren Apfel beißen und die Abfrage machen...! Wobei ich mir ja bei der Abfrage, das umrechnen in Pixel sparen kann, weil ich da ja auch einfach nach der Zeichenlänge gehen kann und dann dementsprechend verkleinern (also bei 1 Zeichen Font 90, ab 4 Zeichen, Font 80 usw), dann spar ich mir die Umrechnerei!

                  Also ich probiers jetzt mal auf meine mir eben beim schreiben und dank deines Hinweises eingefallene Methode und hoffe mal auf ein ansehnliches Ergebnis. Ansonsten wohl die Andere Methode, hätt ja gehofft es geht viel einfacher...!

                  Danke nochmal für die super Hilfe!

                  Comment


                  • #10
                    Hallo,

                    Du kannst es zwar so machen, wirst damit aber nicht zufrieden sein. Bedenke, dass 'W' und 'i' unterschiedliche Breiten haben. Dein Verfahren funktioniert also nur bei FixedPitch-Fonts.

                    Jürgen

                    Comment


                    • #11
                      OK, meine Lösung (bis jetzt) schaut mal so aus:

                      Code:
                      private void GetMaxFontSize(object sender, PaintEventArgs e)
                              {
                                  if (this.label1.Text != "")
                                  {
                                      string measureString = this.label1.Text;
                      
                                      SizeF layoutSize = new SizeF(944, 424);
                                      float size = layoutSize.Height / this.label1.Text.Length;
                                      Font stringFont = new Font("Arial", size, FontStyle.Regular, GraphicsUnit.Pixel);
                      
                                      e.Graphics.DrawString(measureString, stringFont, Brushes.Black,new PointF(0,0));
                                  }
                              }
                      Die erste If-Abfrage hab ich rein machen müssen, weil sonst die Rechnung, welche mir den Pixel-Wert geben soll, nicht funktioniert da ich bei Programmstart dort ja nichts drinnen habe. Der Rest ist schon mal ganz anschaulich, zumindest halbwegs so wie ich mir das gewünscht habe. Was ich jetzt vor allem noch gerne hätte, wäre das ganze irgendwie mittig. Ich kann die Starposition schon in die Mitte schieben (mit dem PointF) aber wenn dann noch ein Zeichen dazu kommt, dann rutscht das ja nur daran und bleibt nicht zentriert. Wie ist das noch möglichst schön zu lösen? Gibt es dafür wenigstens eine einfache Lösung? Bei meiner (oder eher "unserer", weil du da sehr viel geholfen hast) Lösung mit der Zeichengröße muss ich noch ein wenig experimentieren, um die Richtige Formel für die Größe zu finden. So kann ich ja zumindest in der Theorie 5 gleichgroße Zeichen anzeigen, aber wenn ich ja durch die Anzahl der Zeichen Teile, geht das noch ned. Aber da werd ich wohl ne If rein machen müssen.

                      Aber an sich geht es schon mal und darüber bin ich schon wieder tierisch froh. Und dazu gelernt hab ich auch wieder - DANKE!!!!!

                      Ciao Chris

                      Comment


                      • #12
                        Na, ich bin ja gar ned so schlecht (selbst-auf-Schulter-klopfen)!!
                        Hab das ganze jetzt Zentriert hinbekommen, denn, wie du schon sagtes: Wofür is die SDK-Doku!?

                        Hier also meine Schlussendliche Lösung, welche wunderbar funzt:
                        [Code]
                        private void GetMaxFontSize(object sender, PaintEventArgs e)
                        {
                        SizeF layoutSize = new SizeF(944, 424);


                        if (this.label1.Text.Length <= 2)
                        {
                        StringFormat strformat = new StringFormat();
                        strformat.Alignment = StringAlignment.Center;
                        strformat.LineAlignment = StringAlignment.Center;

                        float size = layoutSize.Height;
                        Font stringFont = new Font("Arial", size, FontStyle.Regular, GraphicsUnit.Pixel);
                        string measureString = this.label1.Text;
                        e.Graphics.DrawString(measureString, stringFont, Brushes.Black, layoutSize.Width/2, layoutSize.Height/2, strformat);
                        }
                        else
                        {
                        if (this.label1.Text.Length <= 4)
                        usw.....
                        [/Quote]

                        Danke nochmal für die Hilfe!!!

                        Comment

                        Working...
                        X