/* ** Draws the string or calculates it's size ** */ bool MeterString::DrawString(Gfx::Canvas& canvas, RectF* rect) { if (!m_TextFormat->IsInitialized()) return false; LPCWSTR string = m_String.c_str(); UINT stringLen = (UINT)m_String.length(); canvas.SetTextAntiAliasing(m_AntiAlias); m_TextFormat->SetTrimming( m_ClipType == CLIP_ON || (m_ClipType == CLIP_AUTO && (m_NeedsClipping || (m_WDefined && m_HDefined)))); Gdiplus::Rect meterRect = GetMeterRectPadding(); if (rect) { rect->X = (REAL)meterRect.X; rect->Y = (REAL)meterRect.Y; if (canvas.MeasureTextW(string, stringLen, *m_TextFormat, *rect) && m_ClipType == CLIP_AUTO) { // Set initial clipping m_NeedsClipping = false; REAL w, h; bool updateSize = true; if (m_WDefined) { w = (REAL)meterRect.Width; h = rect->Height; m_NeedsClipping = true; } else if (m_HDefined) { if (m_ClipStringW == -1) { // Text does not fit in defined height, clip it if (rect->Height > (REAL)meterRect.Height) { m_NeedsClipping = true; } rect->Height = (REAL)meterRect.Height; updateSize = false; } else { if (rect->Width > (REAL)m_ClipStringW) { w = (REAL)m_ClipStringW; m_NeedsClipping = true; } else { w = rect->Width; } h = (REAL)meterRect.Height; } } else { if (m_ClipStringW == -1) { // Clip text if already larger than ClipStringH if (m_ClipStringH != -1 && rect->Height > (REAL)m_ClipStringH) { m_NeedsClipping = true; rect->Height = (REAL)m_ClipStringH; } updateSize = false; } else { if (rect->Width > (REAL)m_ClipStringW) { w = (REAL)m_ClipStringW; m_NeedsClipping = true; } else { w = rect->Width; } h = rect->Height; } } if (updateSize) { UINT lines = 0; RectF layout((REAL)meterRect.X, (REAL)meterRect.Y, w, h); if (canvas.MeasureTextLinesW(string, stringLen, *m_TextFormat, layout, lines) && lines != 0) { rect->Width = w; rect->Height = layout.Height; if (m_HDefined || (m_ClipStringH != -1 && rect->Height > (REAL)m_ClipStringH)) { rect->Height = m_HDefined ? (REAL)meterRect.Height : (REAL)m_ClipStringH; } } } } } else { RectF rcDest((REAL)meterRect.X, (REAL)meterRect.Y, (REAL)meterRect.Width, (REAL)meterRect.Height); m_Rect = rcDest; if (m_Angle != 0.0f) { const float baseX = (float)Meter::GetX(); canvas.RotateTransform(CONVERT_TO_DEGREES(m_Angle), baseX, (REAL)meterRect.Y, -baseX, -(REAL)meterRect.Y); } if (m_Effect != EFFECT_NONE) { SolidBrush solidBrush(m_EffectColor); RectF rcEffect(rcDest); if (m_Effect == EFFECT_SHADOW) { rcEffect.Offset(1, 1); canvas.DrawTextW(string, (UINT)stringLen, *m_TextFormat, rcEffect, solidBrush); } else //if (m_Effect == EFFECT_BORDER) { rcEffect.Offset(0, 1); canvas.DrawTextW(string, (UINT)stringLen, *m_TextFormat, rcEffect, solidBrush); rcEffect.Offset(1, -1); canvas.DrawTextW(string, (UINT)stringLen, *m_TextFormat, rcEffect, solidBrush); rcEffect.Offset(-1, -1); canvas.DrawTextW(string, (UINT)stringLen, *m_TextFormat, rcEffect, solidBrush); rcEffect.Offset(-1, 1); canvas.DrawTextW(string, (UINT)stringLen, *m_TextFormat, rcEffect, solidBrush); } } SolidBrush solidBrush(m_Color); canvas.DrawTextW(string, (UINT)stringLen, *m_TextFormat, rcDest, solidBrush); if (m_Angle != 0.0f) { canvas.ResetTransform(); } } return true; }