MQL5 v1.51: Knopf-Schrift an die Breite anpassen (messen statt schaetzen)

User: "die Groesse stimmt jetzt aber der text ist viel zu gross fuer die
buttons" - die Beschriftungen waren abgeschnitten (Zoner, Kana, Muste).

Von der Punktgroesse auf die Pixelbreite zu schliessen geht nicht: das
Verhaeltnis haengt an der DPI-Skalierung des Rechners und ist aus dem
Quelltext nicht bekannt. Font 16 sieht auf 100 % passend aus und laeuft auf
150 % ueber. Derselbe Fall wie der Zeilenabstand der Meldungen in v1.44.

BtnFontFit() sucht die groesste Schrift, bei der ALLE 13 Beschriftungen in den
Knopf passen - ueber TextSetFont + TextGetSize, also am echten Renderer.
InpBtnFont ist damit eine Obergrenze, kein Festwert.

- TextSetFont mit NEGATIVER Groesse = 1/10 pt; nur diese Form wird DPI-korrekt
  skaliert.
- Gemessen wird MIT dem "* "-Vorsatz des aktiven Zustands, sonst passte der
  Text nur im ausgeschalteten Zustand.
- Auch die Hoehe wird geprueft, sonst schneidet der Knopf oben/unten ab.
- OBJPROP_FONT wird jetzt ausdruecklich gesetzt (InpBtnSchrift, Arial):
  gemessen wurde mit dieser Schrift, gezeichnet sonst mit MT5s Vorgabe - zwei
  verschiedene Schriften waeren zwei verschiedene Breiten.

Die Schriftgroesse gilt fuer alle Knoepfe und richtet sich nach der laengsten
Beschriftung. Wer groessere Schrift will, macht die Knoepfe breiter
(InpBtnBreite) - das ist der ehrliche Regler.

0 errors 0 warnings, .ex5 frisch, Spiegel bitgleich. Das Schriftbild selbst ist
NICHT verifiziert - dafuer braucht es den Blick auf den Chart.
This commit is contained in:
Axel Hocks
2026-08-22 13:27:47 +02:00
parent 7800b2cf05
commit d0ac160eee
2 changed files with 76 additions and 5 deletions
+30
View File
@@ -9704,3 +9704,33 @@ Praxis nicht.
löschen). Der Code-Guard verhindert nur den sichtbaren Schaden, nicht die
dreifache Last.
`0 errors, 0 warnings`, `.ex5` frisch, Spiegel bitgleich.
### ⚠⚠ „Der Text ist viel zu groß für die Buttons" — Schrift MESSEN statt schätzen (2026-08-22, v1.51)
Die Beschriftungen waren abgeschnitten (`Zoner`, `Kana`, `Muste`, `Meldur`).
⚠⚠ **Von der Punktgröße auf die Pixelbreite zu schließen geht nicht** — das
Verhältnis hängt an der **DPI-Skalierung** des Rechners und ist aus dem
Quelltext nicht bekannt. Font 16 sieht auf 100 % passend aus und läuft auf
150 % über. **Exakt derselbe Fall wie der Zeilenabstand der Meldungen in v1.44**,
wo dieselbe Schätzung zweimal danebenlag, bevor gemessen wurde.
**`BtnFontFit()`** sucht die größte Schrift, bei der **alle 13** Beschriftungen
in den Knopf passen — über `TextSetFont` + `TextGetSize`, also am echten
Renderer. `InpBtnFont` ist damit eine **Obergrenze**, kein Festwert.
`TextSetFont` mit **negativer** Größe = 1/10 pt; nur diese Form wird
DPI-korrekt skaliert.
⚠ Gemessen wird **mit dem `"* "`-Vorsatz** des aktiven Zustands — sonst passte
der Text nur im ausgeschalteten und liefe beim Einschalten über.
⚠ Auch die **Höhe** wird geprüft, sonst schneidet der Knopf oben/unten ab.
**`OBJPROP_FONT` wird jetzt ausdrücklich gesetzt** (`InpBtnSchrift`, Arial):
gemessen wurde mit dieser Schrift, gezeichnet sonst mit MT5s Vorgabe — zwei
verschiedene Schriften wären zwei verschiedene Breiten. Dieselbe
Zwei-Quellen-Falle wie bei der P(break)-Formulierung in v1.35.
⚠ Die Schriftgröße ist für **alle** Knöpfe gleich und richtet sich nach der
LÄNGSTEN Beschriftung (`Meldung`). Wer eine größere Schrift will, macht die
Knöpfe breiter (`InpBtnBreite`) — das ist der ehrliche Regler, nicht die
Schriftgröße.
`0 errors, 0 warnings`, `.ex5` frisch, Spiegel bitgleich.
**Das Schriftbild selbst ist NICHT verifiziert** — dafür braucht es den Blick
auf den Chart. Belegt sind Compile und Verdrahtung, nicht das Ergebnis.
+45 -4
View File
@@ -12,7 +12,7 @@
//| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). |
//+------------------------------------------------------------------+
#property copyright "Oil Trading Bot"
#property version "1.50"
#property version "1.51"
// v1.42 (2026-08-19): Y-Stapel oben rechts GEMESSEN statt geschaetzt. Der
// Faktor 1,8 aus v1.41 war nur die naechste Schaetzung; jetzt liefert
// TextGetSize die TATSAECHLICHE Pixelhoehe (LabelH). Ausserdem wird Y bei
@@ -307,7 +307,8 @@ input int InpBtnY = 22; // Abstand vom Rand (px)
// Spalten-Rueckfall in BtnDraw() faengt zu hohe Stapel ab.
input int InpBtnBreite = 132; // Knopfbreite (px)
input int InpBtnHoehe = 34; // Knopfhoehe (px)
input int InpBtnFont = 16; // Schriftgroesse
input int InpBtnFont = 16; // Schriftgroesse (OBERGRENZE, s. BtnFontFit)
input string InpBtnSchrift = "Arial"; // Schriftart der Knoepfe
input color InpBtnAnFarbe = C'58,116,84'; // Hintergrund AN
input color InpBtnAusFarbe = C'64,64,68'; // Hintergrund AUS
@@ -399,6 +400,41 @@ void BtnInit()
}
}
//+------------------------------------------------------------------+
//| Groesste Schrift, bei der ALLE Beschriftungen in den Knopf passen.|
//| ⚠⚠ GEMESSEN, nicht geschaetzt (User 2026-08-22: "der Text ist viel|
//| zu gross fuer die Buttons" — die Labels waren abgeschnitten: |
//| "Zoner", "Kana", "Muste"). Von Punktgroesse auf Pixel zu |
//| schliessen geht nicht: das Verhaeltnis haengt an der |
//| DPI-Skalierung des Rechners und ist aus dem Quelltext nicht |
//| bekannt. Genau derselbe Fall wie der Zeilenabstand der Meldungen |
//| in v1.44. |
//| ⚠ `TextSetFont` mit NEGATIVER Groesse = 1/10 pt — nur diese Form |
//| wird DPI-korrekt skaliert. |
//| ⚠ Gemessen wird MIT dem "* "-Vorsatz des aktiven Zustands, sonst |
//| passte der Text nur im ausgeschalteten Zustand. |
//| `InpBtnFont` ist damit eine OBERGRENZE, kein Festwert. |
//+------------------------------------------------------------------+
int BtnFontFit()
{
int platz = MathMax(20, InpBtnBreite - 12); // Innenrand beidseitig
uint w = 0, hh = 0;
for(int fs = MathMax(6, InpBtnFont); fs > 6; fs--)
{
TextSetFont(InpBtnSchrift, -fs * 10);
uint maxw = 0;
for(int i = 0; i < BTN_N; i++)
{
TextGetSize("* " + g_blbl[i], w, hh);
if(w > maxw) maxw = w;
}
// Auch die Hoehe muss passen, sonst schneidet der Knopf oben/unten ab.
if((int)maxw <= platz && (int)hh <= MathMax(10, InpBtnHoehe) - 4)
return fs;
}
return 6;
}
void BtnPaint(int i)
{
string nm = BPFX + g_bkey[i];
@@ -416,6 +452,7 @@ void BtnDraw()
if(!BtnClaim()) return; // eine andere Instanz zeichnet
if(!InpShowButtons) { ObjectsDeleteAll(0, BPFX); return; }
int h = MathMax(10, InpBtnHoehe);
int fs = BtnFontFit(); // passt sich der Knopfbreite an
// ⚠⚠ SPALTEN-RUECKFALL. Mit der 200-%-Groesse ist der Stapel 490 px hoch;
// auf einem niedrigen Chartfenster liefen die obersten Knoepfe aus dem
// sichtbaren Bereich — und weil GENAU DIESE Knoepfe die einzige
@@ -434,7 +471,7 @@ void BtnDraw()
bool falsch = (ObjectFind(0, nm) >= 0)
&& ((int)ObjectGetInteger(0, nm, OBJPROP_XSIZE) != InpBtnBreite
|| (int)ObjectGetInteger(0, nm, OBJPROP_YSIZE) != h
|| (int)ObjectGetInteger(0, nm, OBJPROP_FONTSIZE) != InpBtnFont);
|| (int)ObjectGetInteger(0, nm, OBJPROP_FONTSIZE) != fs);
if(falsch) ObjectDelete(0, nm);
if(ObjectFind(0, nm) < 0)
{
@@ -448,7 +485,11 @@ void BtnDraw()
}
ObjectSetInteger(0, nm, OBJPROP_XSIZE, InpBtnBreite);
ObjectSetInteger(0, nm, OBJPROP_YSIZE, h);
ObjectSetInteger(0, nm, OBJPROP_FONTSIZE, InpBtnFont);
ObjectSetInteger(0, nm, OBJPROP_FONTSIZE, fs);
// ⚠ Schriftart AUSDRUECKLICH setzen: gemessen wird mit
// `InpBtnSchrift`, gezeichnet sonst mit MT5s Vorgabe — zwei
// verschiedene Schriften waeren zwei verschiedene Breiten.
ObjectSetString(0, nm, OBJPROP_FONT, InpBtnSchrift);
// Stapelrichtung so, dass der ERSTE Knopf immer OBEN steht — bei
// CORNER_LEFT_LOWER waechst YDISTANCE nach oben, die Liste liefe
// sonst verkehrt herum.