Nevron Forum

allow the control to move with panning

https://www.nevron.com/Forum/Topic6286.aspx

By Enjoyear Guo - Thursday, March 22, 2012

I add a textbox control to the nChartControl1 as follows:
NTextBox textBox = new NTextBox();
textBox.Location = new Point(10,10);
textBox.Size = new Size(100,100);
nChartControl1.Controls.Add(textBox);
However, if I try to pan the chart left/right, the textbox control will always stays at the same place. Is it possible to allow it to move with panning.

Thank you.

Enjoyear
By Nevron Support - Friday, March 23, 2012

Hi,

We recommend you use an annotation attached to a data point for this case.

By Enjoyear Guo - Tuesday, March 27, 2012

Hi,
I am using the following way to solve my problem.

NScale2DToViewTransformation scaleToView =
new NScale2DToViewTransformation(nChartControl1.View.Context,
modelView.GetChartControl().Charts[0],
(int) StandardAxis.PrimaryX, (int) StandardAxis.PrimaryY);
NPointF point = new NPointF();
scaleToView.Transform(new NVector2DD(positionDataX, positionDataY), ref point);
TextBox.Location = new Point((int) point.X - TextBox.Size.Width/2, (int) point.Y + 5);




This could basically solve my problem when I call this method within the MouseMove event. But there is a small problem.
If the user is panning the chart too quickly(throw the chart left/right), then the position of the textbox could not updated when the mouse is released. Same problem will happen if the user zoomed into the chart. The textbox will still stay at the original place. I think the problem might be the nChartControl1.View.Context is not updated when I call the method above when the mouse is released.

So my question is:
Is there any event that will be raised if nChartControl1.View.Context is updated or the chart is shown?

Acutally, I found an event, which is nChartControl1.Paint. But I cannot figure out when this event is raised.
Thank you very much.

Enjoyear
By Nevron Support - Wednesday, March 28, 2012

Hi,

You can subscribe to a post callback on the chart (Chart Examples\Custom Painting) that is guaranteed to fire on every redraw and you can use it to update the text box position accordingly.

By Enjoyear Guo - Wednesday, March 28, 2012

Hi,

I've read that example. But I cannot find the class called NCustomPaintingBase that example inherits. It doesn't even exist in your documentation.

Actually, I find an interface which I though might work. It's called INPaintCallback. There are two methods in that interface, OnAfterPaint and OnBeforePaint. But I don't know when those events get fired.

Thank you.

Enjoyear
By Nevron Support - Thursday, March 29, 2012

Hi Enjoyear,

The NCustomPaintingBase is part of the examples shipped with the control. In general you should create a class that implements the INPaintCallback interface and pass an instance of that class to the control. Afterwards the control will call the OnBeforePaint and OnAfterPaint methods during rendering before and after the panel content has been painted respectively. Let us know if you meet any problems.

By Enjoyear Guo - Thursday, March 29, 2012

What does it mean pass an instance of the class to the control?

a) Pass it as argument of the constructor?!??!
b) Define it as a property!?!?!?
c) inherit from that class? (Can't do this because my class is already inheriting from usercontrol)
d) implement the interface (tried it and it doesn't work)

Please be more specific and I'd appreciate a quick code snippet if you could.

Thanks,
Enjoyear.
By Nevron Support - Monday, April 2, 2012

Hi,

The example shows very precisely how to install a custom paint callback. You can create your own class that implement ICustomPaintCallback and pass it to the chart:

class MyPaintCallback : INPaintCallback
{

        /// <summary>
        /// Occurs before the panel is painted.
        /// </summary>
        /// <param name="panel"></param>
        /// <param name="eventArgs"></param>
        public virtual void OnBeforePaint(NPanel panel, NPanelPaintEventArgs eventArgs)
        {
        }

        /// <summary>
        /// Occurs after the panel is painted.
        /// </summary>
        /// <param name="panel"></param>
        /// <param name="eventArgs"></param>
        public virtual void OnAfterPaint(NPanel panel, NPanelPaintEventArgs eventArgs)
        {

        }
}

somewhere in code:

nChartControl.Charts[0].PaintCallback = new MyPaintCallback();

By Enjoyear Guo - Friday, April 6, 2012

Hello experts,

Your method is working properly. Thank you very much for your code snippet.
Unfortunately it's still not solving my problem. I am afraid it might not be what I want.


Please see the attachment to better understand what I will talk about. I take a screen shot of those on the fly.

First of all, I add two textboxes to the nChartControl1. And Within the OnAfterPaint method, I update the position of all textboxes using the way I told you before.

_________ Copy those codes here ____________________

NScale2DToViewTransformation scaleToView =
new NScale2DToViewTransformation(nChartControl1.View.Context,
modelView.GetChartControl().Charts[0],
(int) StandardAxis.PrimaryX, (int) StandardAxis.PrimaryY);
NPointF point = new NPointF();
scaleToView.Transform(new NVector2DD(positionDataX, positionDataY), ref point);
TextBox.Location = new Point((int) point.X - TextBox.Size.Width/2, (int) point.Y + 5);
_____________________________________________________

But as long as the user is panning the chart only a little bit fast, what I will observe is that the chart stays at the same place, and only the position of the textboxes are updated. I guess I am not listening to the right event to update textbox positions.

Any idea how to solve this problem?
Many thanks!!

Best,
Enjoyear