Schrifthöhe/Breite rausbekommen oder CRectgröße anpassen
-
virtual void Draw(CDC* pDC){ CString sztemp="Max Mustermann!"; pDC->DrawText(sztemp,Pos,DT_CENTER|DT_VCENTER|DT_CALCRECT); };Das CRect sollte durch das Flag DT_CALCRECT dem Text angepasst werden so das "Max Mustermann!" dargestellt wird. Nur Wenn ich das Flag setze verschwindet der Text. Ohne das Flag hat ds CRect eine standardgröße und stellt nicht den gesamten Text dar.

-
virtual void Draw(CDC* pDC) { CString szString = TEXT("Max Mustermann!"); CRect rcString(10, 10, 20, 20); pDC->DrawText(szString, rcString, DT_CENTER | DT_VCENTER | DT_CALCRECT); }http://msdn2.microsoft.com/en-us/library/a6x7y2a4(vs.71).aspx
-
Pos ist ein CRect und eine Fix Position ist nicht vorgesehen, da die Elemente Per Maus verschoben werden können.
Ob ich deine Version nehme oder meine ist egal, bei beiden wird der Text nicht dargestellt wenn ich die Option DT_CALCRECT mit drinnne habe. Ausserdem kommt bei deiner Version nur Pixelmatsch raus an der CRect Position.
Mit
CString sztemp="Max Mustermann!"; Pos.InflateRect(100,20); pDC->DrawText(sztemp,Pos,DT_CENTER|DT_VCENTER);kann ich zwar durch InflateRect das Fenster vergrößern, aber der Text ist ja noch variabel und die Länge steht ja nicht fest.
-
Hat einer eine Idee wieso trotz Flag DT_CALCRECT der Text nicht dargestellt wird?
Draw aus dem Object CMyFontObject
virtual void Draw(CDC* pDC){ pDC->DrawText(sztemp,&Pos,DT_LEFT|DT_EXPANDTABS|DT_WORDBREAK); };Hier in der OnMouseMove wird die Position neugesetzt.
void CMy07AufgabeView::OnMouseMove(UINT nFlags, CPoint point) { if( GetCapture() == this ) // hier wird nochmal getestet ob der Capture innerhalb meiner Programminstanz anfing { // move an object CMy07AufgabeDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); POSITION pos = pDoc->DrawObjectList.GetTailPosition(); if( pos != NULL ) { // get topmost object CMyDrawObject *pDrawObject = pDoc->DrawObjectList.GetAt(pos); // remember previous position CRect OldPos( pDrawObject->GetPos() ); // move it if(m_nDefType!=DRW_FONT){ pDrawObject->SetPos( point, 1 ); // geht nur für festen Elementgrößen }else{ pDrawObject->SetPos( point, 0 ); } // redraw only changed area CRect RedrawRect; RedrawRect.UnionRect( OldPos, pDrawObject->GetPos() ); // zeichnet nur den alten bereich und den neuen bereich neu --> weniger geflacker // redraw changed area of the view RedrawWindow( RedrawRect ); } // if( pos != NULL ) } // if( GetCapture() == this ) CView::OnMouseMove(nFlags, point); }SetPos befindet sich in der Basisklasse CMyDrawObject von MCyFontObject
inline void SetPos(CPoint nPos, int version){ CRect rect(nPos, nPos); if(version!=0){ rect.InflateRect(20,20); }else{ rect.InflateRect(100,20); } Pos=rect; };genau hier in der SetPos kann ich durch InflateRect auch die Größe Variieren, aber das ist ja nicht Sinn und Zweck. sztemp in der Methode Draw vom CMyFontObject erhalte ich nach der Eingabe in meinem Dialog. Da Aber das Flag DT_CALCRECT von DrawText nicht funzt ist jetzt die Höhe/Breite des verwendeten Fonts interessant. Wieso das Flag nicht geht weiß ich noch nicht. Wenn ich das Flag setze wird der Text nicht dargestellt, nehme ich es wieder raus klappt es wieder, aber halt auch nur bis die grenzen vom CRect erreicht sind.
http://mcsnoop.mc.funpic.de/MFC/immernoch_Problem.JPG

-
pDC->DrawText(sztemp,&Pos,DT_LEFT|DT_EXPANDTABS|DT_WORDBREAK|DT_NOCLIP|DT_CALCRECT); pDC->DrawText(sztemp,&Pos,DT_LEFT|DT_EXPANDTABS|DT_WORDBREAK|DT_NOCLIP);Wenn ich das so schreibe, gehts obwohl ich das schon ziemlich dämlich finde, wenn das so wirklich von den DrawText Machern vorgesehen ist.
Jetzt wird das CRect Pos richtig dem Text angepasst.

Falls trotzdem einer eine Idee hat wieso das nur so geht immer her damit. Denn schön schauen die beiden Zeilen so nicht aus.
-
Naja das du durch DT_CALCRECT nur das Rect zurück bekommst ist klar ... wenn dir aber die pure Breite in Pixel den Textes ohne irgendwelches Ausrichten reicht, geht auch pDC->GetTextExtent um die Breite und Höhe zu bekommen.
-
Warum liefert dann aber um nochmal auf DrawText zurückzukommen das Flag DT_CALCRECT nur die Größe zurück und es muss nochmal ausgeführt werden ohne Flag. Flags sind doch dazu da um Funktion sowieso mit einem speziellen Parameter auszuführen oder versteh ich da was falsch?
-
Jo und durch dieses Flag veranlast du die Funktion dazu anstelle zu zeichnen einfach nur die von ihr berechneten Koordinaten in einen der übergebenen Parameter zu packen und feddisch.
-
Finde das trotzdem nicht besonders praktisch. Aber schön ist das nun alles geht so wie ich mir das denke und nun gehts weiter im Context. *g*