Text beim Zeichnen mit DrawText verschoben



  • Ich versuche mich an einer von CStatic abgeleiteten Klasse.
    Ziel des Ganzen ist, das der Text mittig gezeichnet wird.
    Doch aus irgend einem Grund ist der Text immer nach unten verschoben.
    Die Pixelanzahl ist dabei abhängig von der Größe des Fensters und der Größe der Schrift.

    Weis jemand wie man das beheben kann bzw. wie man an den Wert kommt um den der Text verschoben wird?

    void CColorStaticEx::OnPaint()
    {
    	CPaintDC dc(this); // device context for painting
    
    	// Farben und Schrift setzen
    	CBrush *cOldBrush = dc.SelectObject(&m_brBkgnd);
    	CPen *cOldPen = dc.SelectObject(&m_peBkgnd);
    	CFont *cOldFont = dc.SelectObject(&m_cFont);
    
    	// Den zu Zeichnenden Bereich holen
    	CRect cRect;
    	GetClientRect(&cRect);
    
    	// Den zu zeichnenden Textholen
    	CString strText;
    	GetWindowText(strText);
    	// Den Hintergrund transparent setzen damit der Schatten nicht überschrieben wird
    	dc.SetBkMode(TRANSPARENT);
    
    	// Den Hintergund malen -> Soll später auf Doppelbuggering erweitert werden
    	dc.Rectangle(cRect.left,cRect.top,cRect.right,cRect.bottom);
    	// Die "Schattenfarbe" setzen 
    	dc.SetTextColor(m_colTextColor2);
    	// Den Schattentext zentrisch zeichnen
    	dc.DrawText(strText,&cRect,DT_CENTER | DT_VCENTER |DT_SINGLELINE );
    	// Die Schriftfarbe setzen
    	dc.SetTextColor(m_colTextColor);
    	// Den Zeichenbereich versetzen um den Schatteneffekt zu erzielen
    	cRect.OffsetRect(iSchattenoffsetX,iSchattenoffsetY);
    	// Die eigentliche Schrift zentrisch (mit Offset) zeichnen
    	dc.DrawText(strText,&cRect,DT_CENTER | DT_VCENTER |DT_SINGLELINE );
    
    	// Die vorher aktiven Farben & Schrift setzen
    	dc.SelectObject(cOldBrush);
    	dc.SelectObject(cOldPen);
    	dc.SelectObject(cOldFont);
    }
    

    Kann mir bitte jemand sagen was ich da falsch mache?



  • Da du zu iSchattenoffsetX,iSchattenoffsetY keine angaben machst und die auch nicht in der Source stehen kann man jetzt schlecht dioe Verschiebung nachvollziehen. Aber ich würde an deiner stelle wenn du den Text Zentrisch haben willst logischerweisse den Schatten verschieben und den eigentlichen text zentrieren und nich wie du es gemacht hast, den schatten zu zentrieren und den Text zu verschieben. Vielleicht liegt auch da schon der Fehler begraben?



  • iSchattenoffsetX und iSchattenoffsetY ist der Wert um den der 2. Schriftzug vom 1. versetzt wird.
    Je nach Fenstergröße können iSchattenoffsetX und iSchattenoffsetY zwischen +5 und -5 liegen.

    Das hat aber keine Auswirkung, da schon der 1. gezeichnete Schriftzug um ca. 1/8 der Fensterhöhe nach unten fersetzt ist.
    Der 2. Schriftzug wird ja nur ein wenig berschoben um den Schatteneffekt zu erzielen.

    Wenn ich iSchattenoffsetX und iSchattenoffsetY auf 0 setze wird nur der Schatten komplett überschrieben und die Schrift ist schattenlos nach Unten versetzt.

    Wenn die Schrift nach oben versetzt währe würde ich es ja verstehen, da dass dann die Kompensation für p,g,... währe.

    Aber so ist das wirklich lästig, vor allem weil ich noch nicht weis was das verursacht und wie man es ordentlich bei der Veränderung der Fenstergröße kompensiert.



  • Was ich vergessen habe:
    Ja, ich weis das es besser währe den Schatten zu verschieben.
    Aber die paar Pixel fallen nicht ins Gewicht.

    Es ist halt lästig, wenn bei größerer Schrift diese außerhalb des Zeichenbereichs geschoben wird, obwohl man den Zeichenbereich ansich an die Funktion zum Malen der Schrift übergibt.


  • Mod

    Dann benutze eben nicht DrawText mit DT_CENTER. Errechne die Textgröße selbst mit DT_CALCRECT. Bestimme das Zielrectangle und male direkt.

    Evtl. bekommst Du dann auch das Problem heraus. Ich vermute es liegt am Font bzw. am einem leading... und damitliegt es liegt evtl. an Deinem Font!

    Was passiert beim Standardfont?



  • Das mit dem Errechnen der Größe und manuellen Platzieren hatte ich schon versucht.

    Leider rutscht der Text auch tiefer wenn ich den Text links oben oder sonst irgendwie ausrichte.

    Ich verwende die standardmäßig verwendete Schrift "MS Shell Dlg 2"
    Ich passe sie nur in OnSize folgendermaßen an den Zeichenbereich an:

    if(m_bInit)
    {
    	LOGFONT logfFont;
    	m_cFont.GetLogFont(&logfFont);
    	logfFont.lfQuality = DRAFT_QUALITY;
    	logfFont.lfHeight = -MulDiv(cy-abs(iSchattenoffsetY), GetDeviceCaps(GetDC()->GetSafeHdc(), LOGPIXELSY), 72);
    
    	m_cFont.DeleteObject();
    	m_cFont.CreateFontIndirect(&logfFont);
    }
    


  • Merkwürdig.
    Ich habe die Schrift in Arial geändert und jetzt passt alles.

    Danke für den Hinweis.


Log in to reply