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:
@@ -9704,3 +9704,33 @@ Praxis nicht.
|
|||||||
löschen). Der Code-Guard verhindert nur den sichtbaren Schaden, nicht die
|
löschen). Der Code-Guard verhindert nur den sichtbaren Schaden, nicht die
|
||||||
dreifache Last.
|
dreifache Last.
|
||||||
✅ `0 errors, 0 warnings`, `.ex5` frisch, Spiegel bitgleich.
|
✅ `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.
|
||||||
|
|||||||
+46
-5
@@ -12,7 +12,7 @@
|
|||||||
//| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). |
|
//| 4) Der Bot muss laufen (schreibt die CSV alle ~5 s). |
|
||||||
//+------------------------------------------------------------------+
|
//+------------------------------------------------------------------+
|
||||||
#property copyright "Oil Trading Bot"
|
#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
|
// 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
|
// Faktor 1,8 aus v1.41 war nur die naechste Schaetzung; jetzt liefert
|
||||||
// TextGetSize die TATSAECHLICHE Pixelhoehe (LabelH). Ausserdem wird Y bei
|
// 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.
|
// Spalten-Rueckfall in BtnDraw() faengt zu hohe Stapel ab.
|
||||||
input int InpBtnBreite = 132; // Knopfbreite (px)
|
input int InpBtnBreite = 132; // Knopfbreite (px)
|
||||||
input int InpBtnHoehe = 34; // Knopfhoehe (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 InpBtnAnFarbe = C'58,116,84'; // Hintergrund AN
|
||||||
input color InpBtnAusFarbe = C'64,64,68'; // Hintergrund AUS
|
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)
|
void BtnPaint(int i)
|
||||||
{
|
{
|
||||||
string nm = BPFX + g_bkey[i];
|
string nm = BPFX + g_bkey[i];
|
||||||
@@ -415,7 +451,8 @@ void BtnDraw()
|
|||||||
{
|
{
|
||||||
if(!BtnClaim()) return; // eine andere Instanz zeichnet
|
if(!BtnClaim()) return; // eine andere Instanz zeichnet
|
||||||
if(!InpShowButtons) { ObjectsDeleteAll(0, BPFX); return; }
|
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;
|
// ⚠⚠ SPALTEN-RUECKFALL. Mit der 200-%-Groesse ist der Stapel 490 px hoch;
|
||||||
// auf einem niedrigen Chartfenster liefen die obersten Knoepfe aus dem
|
// auf einem niedrigen Chartfenster liefen die obersten Knoepfe aus dem
|
||||||
// sichtbaren Bereich — und weil GENAU DIESE Knoepfe die einzige
|
// sichtbaren Bereich — und weil GENAU DIESE Knoepfe die einzige
|
||||||
@@ -434,7 +471,7 @@ void BtnDraw()
|
|||||||
bool falsch = (ObjectFind(0, nm) >= 0)
|
bool falsch = (ObjectFind(0, nm) >= 0)
|
||||||
&& ((int)ObjectGetInteger(0, nm, OBJPROP_XSIZE) != InpBtnBreite
|
&& ((int)ObjectGetInteger(0, nm, OBJPROP_XSIZE) != InpBtnBreite
|
||||||
|| (int)ObjectGetInteger(0, nm, OBJPROP_YSIZE) != h
|
|| (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(falsch) ObjectDelete(0, nm);
|
||||||
if(ObjectFind(0, nm) < 0)
|
if(ObjectFind(0, nm) < 0)
|
||||||
{
|
{
|
||||||
@@ -448,7 +485,11 @@ void BtnDraw()
|
|||||||
}
|
}
|
||||||
ObjectSetInteger(0, nm, OBJPROP_XSIZE, InpBtnBreite);
|
ObjectSetInteger(0, nm, OBJPROP_XSIZE, InpBtnBreite);
|
||||||
ObjectSetInteger(0, nm, OBJPROP_YSIZE, h);
|
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
|
// Stapelrichtung so, dass der ERSTE Knopf immer OBEN steht — bei
|
||||||
// CORNER_LEFT_LOWER waechst YDISTANCE nach oben, die Liste liefe
|
// CORNER_LEFT_LOWER waechst YDISTANCE nach oben, die Liste liefe
|
||||||
// sonst verkehrt herum.
|
// sonst verkehrt herum.
|
||||||
|
|||||||
Reference in New Issue
Block a user