ThinkGeo.com    |     Documentation    |     Premium Support

Left align text in custom style

Hello, I am creating a custom style and I am overriding the DrawCore of Style (For other reasons I am using Style and Not TextStyle). I am able to draw my text on the screen but it is always centered on the point. I want the text to be left aligned and not centered. How can I do this with the canvas.DrawText( ) ?



I would appreciate any thoughts you have on this.



I have:


GeoFont font = new GeoFont(fontFamily, fontSize, fontStyle);
GeoSolidBrush brush = new GeoSolidBrush(customColor);
GeoPen geoPen = new GeoPen(GeoColor.SimpleColors.Black);
RectangleShape worldExtent = canvas.CurrentWorldExtent;
ScreenPointF screenPoint = ExtentHelper.ToScreenCoordinate(worldExtent, CurrentFeature, canvas.Width,
                                                  canvas.Height);
ScreenPointF[] screenPoints = new[] { new ScreenPointF(screenPoint.X, screenPoint.Y) };
 
canvas.DrawText(text, font, brush, geoPen, screenPoints, DrawingLevel.LabelLevel,
                0, 0, (float)rotation);

The code above centers the text but I want it left aligned.

Hi Scott, 



Would you please try to follow the below codes: 



 DrawingRectangleF textRectangle = canvas.MeasureText(text, font);


 ScreenPointF[] screenPoints = new[] { new ScreenPointF(screenPoint.X - textRectangle.Width * 0.5, screenPoint.Y) };




Hope it helps. 

Regards, 

Troy

Hello Troy, 
  
 Thank you for your response. I tried your suggestion and it placed the text to the left of the point so I changed it to 
 ScreenPointF[] screenPoints = new[] { new ScreenPointF(screenPoint.X + textRectangle.Width * 0.5, screenPoint.Y) }; 
  
 this does move it a little to the right side of the point but it is always out a little. It is like the measure string is not correctly taking into account the size of the string.  
  
 I have been playing around with this the majority of the day and I still cannot get it to place the text start against the right side of the point.

Hi Scott, 
  
 I created a simple sample, it looks the text works follow your requirement. 
  
 Could you please try my code for make sure that? 
  
 Regards, 
  
 Don 
  
  

namespace CSHowDoISamples
{
    public class MyStyle : ThinkGeo.MapSuite.Core.Style
    {
        protected override void DrawCore(System.Collections.Generic.IEnumerable<Feature> features, GeoCanvas canvas, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInThisLayer, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInAllLayers)
        {
            GeoFont font = new GeoFont(“Arial”, 12);
            GeoSolidBrush brush = new GeoSolidBrush(GeoColor.FromArgb(128, 255, 192, 203));
            GeoPen geoPen = new GeoPen(GeoColor.SimpleColors.Black);
            RectangleShape worldExtent = canvas.CurrentWorldExtent;

            string text = “It’s a test string”;

            ScreenPointF screenPoint = ExtentHelper.ToScreenCoordinate(worldExtent, (features as Collection<Feature>)[0], canvas.Width,
                                                              canvas.Height);

            DrawingRectangleF textRectangle = canvas.MeasureText(text, font);
            ScreenPointF[] screenPoints = new[] { new ScreenPointF((float)(screenPoint.X + (textRectangle.Width * 0.5)), screenPoint.Y) };

            canvas.DrawText(text, font, brush, geoPen, screenPoints, DrawingLevel.LabelLevel,
                            0, 0, (float)0);
        }
    }

    public partial class DisplayASimpleMap : UserControl
    {
        public DisplayASimpleMap()
        {
            InitializeComponent();
        }

        private void WpfMap_Loaded(object sender, RoutedEventArgs e)
        {
            Map1.MapUnit = GeographyUnit.DecimalDegree;
            Map1.CurrentExtent = new RectangleShape(-155.733, 95.60, 104.42, -81.9);
            InMemoryFeatureLayer inlayer = new InMemoryFeatureLayer();
            inlayer.InternalFeatures.Add(new Feature(10, 10));
            inlayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(new MyStyle());
            inlayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(PointStyles.City1);
            inlayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            LayerOverlay overlay = new LayerOverlay();
            overlay.Layers.Add(inlayer);
            Map1.Overlays.Add(overlay);
            Map1.Refresh();
        }
    }
}


Hi,







Here is the screen shot.



Regards,



Don

I have created a test project and your piece works fine. It looks like there is another issue on my end I need to track down.  
  
 On a side note I notice there is a canvas.DrawLine() and canvas.DrawArea() etc… but there is no canvas.DrawPoint() where you can choose one of the point type. Is there a way to add a point from the style override?

Hi Soctt, 
  
 Our draw point logic is a little complex and we don’t have a canvas.DrawPoint function, sometimes it calls canvas.DrawWorldImage or canvas.DrawArea, but I think canvas.DrawEllipse should be better for your override. 
  
 Regards, 
  
 Don

Sample source code to input valid data and generate linear Code 128 images in C# .NET. Code 128 Overview for C# .NET development ; Code 128 Data Encoding C#