Label Size berechnen über Width-Wert



  • ich habe ein TImage in dessen mitte ich mit einem Label etwas reinschreiben will.
    da die grösse meines TImage aber sehr varrieren kann, möchte/muss ich die grösse/size meines Labels auch dynamisch anpassen. Da sonst der fall auftreten kann, dass der test länger als das image ist, was nicht vorkommen darf.
    kann ich irgendwie im Stil von

    Label1->Font->Size = Image->Width/(x*LAbel1->Caption.Length);
    

    das berechnen?
    habe es mit MaxHeight und MaxWidth schon probiert, geht aber leider nicht, oder ich mache etwas falsch..

    falls es noch jemandem hilft es sich vorzustellen, hier noch den entsprechenden CodeAusschnitt

    for (int iCounter = 1; iCounter <(strlHeatingBands->Count+1); iCounter++)
       {
          code...
          code...
    
          imgHZ.Length++;                           //dynamisches array vergrössern
          imgHZ[iCounter] = new TImage(this);
          imgHZ[iCounter]->Parent = frmHeizbandTest->grbPaint;    //GroupBox
          imgHZ[iCounter]->Stretch = true;
          imgHZ[iCounter]->Height = iImgHeight;
          imgHZ[iCounter]->Width = iImgWidth;
          imgHZ[iCounter]->Top = iImgTop;
          imgHZ[iCounter]->Left = iImgLeft;
          imgHZ[iCounter]->Picture->LoadFromFile("Images\\heizungblau.bmp");
    
          iImgLeft +=imgHZ[iCounter]->Width;
    
          labHZ.Length++;                       //dynamisches array vergrössern
          labHZ[iCounter-1] = new TLabel(this);
          labHZ[iCounter-1]->Parent = frmHeizbandTest->grbPaint;
          labHZ[iCounter-1]->Caption = strlHeatingBands->Strings[iCounter-1];
          //labHZ[iCounter-1]->Constraints->MaxWidth = imgHZ[iCounter]->Width-8;   // -----hier möchte ich die grösse einschränken
          //labHZ[iCounter-1]->Constraints->MaxHeight = imgHZ[iCounter]->Height-8;
          labHZ[iCounter-1]->Font->Size = 24;
          labHZ[iCounter-1]->Transparent = true;
    
          labHZ[iCounter-1]->Top = imgHZ[iCounter]->Top+(imgHZ[iCounter]->Height-labHZ[iCounter-1]->Height)/2;
          labHZ[iCounter-1]->Left = imgHZ[iCounter]->Left+(imgHZ[iCounter]->Width-labHZ[iCounter-1]->Width)/2;
       }
    

    schonmal thx im voraus
    BigNeal



  • Hoi,

    hilft Dir vielleicht TCanvas::TextWidth() weiter? Noch eine Schleife drum, um bei Bedarf die Fontgröße zu verringern. Sollte doch gehen.



  • verstehe das jetzt richtig mit TextWidth dass ich eine grösse festlegen soll, testen ob der Text ins bild passt, wenn nicht grösse eins kleiner und wieder testen bis es passt?
    wenn ja, auf diesen gedanken bin ich auch schon gekommen, wollte aber lieber eine schlaufe umgehen 😞
    dan könnte ich aber auch gleich Label1->Width verwenden

    falls ich jedoch falsch liege, klähr mich bitte auf.

    jedenfalls thx für die antwort
    BigNeal



  • Hi BigNeal,

    ich denke um irgendeine Art von Test + Schleife wirst Du nicht herumkommen. Mir ist zumindest keine Funktion bekannt, die einem die maximale Fontgröße für einen bestimmten Text, bei einer bestimmten Breite zurückgibt.
    Aber meine Kenntnisse der WIN-Api sind nahezu nicht-existent. Ob es da was in der VCL gibt weiß ich auch nicht. Zumindest ist mir bisher nichts entsprechnedes untergekommen. Manchmal funktionieren auch 'Workarounds' recht brauchbar. 😉

    Sorry...

    Ach so, bezüglich Label->Width: Wenn AutoSize des Labels = true ist, dann ja. Aber ich denke, dass die Schleife mit direkten Canvas-Operationen schneller ausgeführt wird. Probier's aus, oder hoffe dass jemand mehr weiß.



  • ?????????BCB- Hilfe???????

    Die Methode TextExtent liefert die Breite und Höhe eines in der aktuellen Schrift dargestellten Strings. Als Maßeinheit gelten Pixel.

    typedef struct TSize

    {
    long cx;
    long cy;
    }

    TSize __fastcall TextExtent(const AnsiString Text);

    ?????????BCB- Hilfe?????????



  • @DerAltenburger: Ja, soweit ist das klar, aber es geht darum, dass man die maximale Fontgröße aus dem Text und der maximal zur Verfügung stehenden Breite hat. Also nicht überprüfen ob Text passt, sondern Textbreite (und somit Fontgröße) ermitteln. Wenn Dir noch was einfällt...



  • thx für euren einsatz.. mir ist noch was eingefallen..
    hat jemand eine ahnung, wie die "Schrift" die höhe und breite des buchstabens berechnet?
    so zB:

    ein 'R'
    Size 10: 
    Width = 5 Pixel
    Height = 10 Pixel
    
    Size 15:
    Width = 5Pixel *1.5
    Height = 10 Pixel *1.5
    

    ich hab da keine ahnung wie das genau erstellt wird und die Daten sind völlig aus der luft gegriffen.
    kann man das nciht irgendwie auf diese art berechnen?
    BigNeal



  • Tja, da das von der ausgewählten Schirftart abhängt, müßtest Du zuerst einmal die Schriftartdaten interpretieren. Wenn es dann noch eine proportionale Schrift ist, mußt Du dann die Breite für die einzelnen Buchstaben berechnen. Zusätzlich mußt Du natürlich prüfen, welcher Schriftgrad in Windows eingestellt ist. Du wirst dort keine 'einfache Formel' verwenden können.



  • hmmmmm... ich denke, ich muss da wohl doch auf ne schleife zurück greifen.. oder eine tabelle oder so machen.. jedenfalls danke für die auskunft..
    bin aber immernoch für neue ideen offen..



  • ich kam jetzt dazu das mit der schleife auszutesten..
    hatte eigentlich auch genau im kopf wie es funktionieren müsste

    ich habe das zuerst einfach mit einem int iSize getestet, welches nicht funktionierte..
    jetzt habe ich mir eine neue font gemacht und diese dem label zugewiesen..
    klapt leider immer noch nicht.
    mache ich einen prinzipiellen fehler?

    TFont *fontHZ = new TFont();
       ...
       ...
    
          for (fontHZ->Size = 1; fontHZ->Size < 99; fontHZ->Size++)
          {
             labHZ[iCounter-1]->Font = fontHZ;
    
            // Label1->Caption = IntToStr(fontHZ->Size);
             ShowMessage(IntToStr(Canvas->TextWidth(labHZ[iCounter-1]->Caption))+"/"+IntToStr(labHZ[iCounter-1]->Font->Size));
    
             if (Canvas->TextWidth(labHZ[iCounter-1]->Caption) > imgHZ[iCounter]->Width)
             {
                ShowMessage("Schriftgrösse wurde gefunden");
                labHZ[iCounter-1]->Font->Size--;
                //Label1->Caption = IntToStr(labHZ[iCounter-1]->Font->Size);
                fontHZ->Size = 99;
             }
          }
    

    bei der ersten ShowMessage bekomme ich immer das:

    36/1
    36/2
    36/3
    36/4
    ...
    36/x

    d.h. die grösse(size) ändert sich im label, aber die länge (TextWidth) bleibt immer gleich!?!

    😕 😕 bin verwirrt...

    thx
    BigNeal



  • for (labHZ->Font->Size = 1; labHZ->Font->Size < 99; labHZ->Font->Size++)
    {
    ShowMessage(IntToStr(labHZ->Canvas->TextWidth(labHZ->Caption))+"/"+IntToStr(labHZ->Font->Size));
    }

    Du mußt den Canvas des Labels nehmen, oder dem verwendeten Canvas den Font und die Größe zuweisen.



  • thx..
    habe wohl vor lauter wälder den baum nicht mehr gesehen...
    oder so irgendwie..
    😃 thx


Anmelden zum Antworten