From d0ac160eeed14a9803233c367962c8245be8dd79 Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Sat, 22 Aug 2026 13:27:47 +0200 Subject: [PATCH] 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. --- CLAUDE.md | 30 +++++++++++++++++++++++++++ mql5/SR_Levels.mq5 | 51 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 9ab89d5..43a3713 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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. diff --git a/mql5/SR_Levels.mq5 b/mql5/SR_Levels.mq5 index 8b0e282..3db8204 100644 --- a/mql5/SR_Levels.mq5 +++ b/mql5/SR_Levels.mq5 @@ -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]; @@ -415,7 +451,8 @@ void BtnDraw() { if(!BtnClaim()) return; // eine andere Instanz zeichnet if(!InpShowButtons) { ObjectsDeleteAll(0, BPFX); return; } - int h = MathMax(10, InpBtnHoehe); + 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.