|
|
Hello everybody.
I'm creating a C# application that uses the Visio Drawing Control and Visio SDK.
Basically, I have a windows form with the Visio control on it and the user and drag and drop objects from the Visio stencil. I am managing the OnShapeAdd and the OnShapeDelete just fine.
My problem is I don't know how to detect the event when the user just moves a shape. I need to do this due to the logic of this application. I don't see anything like 'move' or 'drag' in VisEventCodes.
Any help will be greatly appreciated.
Thanks in advance.
|
|
|
|
|
The documentation isn't specific on whether or not the ShapeChanged event is fired when a shape is moved, but since this would change the location properties of the shape then it's possible. Try handling the ShapeChanged event and see if that works.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thank you very much, but the ShapeChanged event never seems to get triggered!
Much as I move of reshape or edit the text in a shape, I never get it triggered! ????
|
|
|
|
|
I'm doing this inside my AddAdvise method:
newEvent = documentEvents.AddAdvise(<br />
(short)VisEventCodes.visEvtMod +<br />
(short)VisEventCodes.visEvtShape,<br />
(IVisEventProc)this, sink, targetArgs);
And it doesnt seem to work.
However, this works perfectly:
newEvent = documentEvents.AddAdvise(<br />
(unchecked((short)VisEventCodes.visEvtAdd) +<br />
(short)VisEventCodes.visEvtShape),<br />
(IVisEventProc)this, sink, targetArgs);
???
|
|
|
|
|
Use the PIA for Visio (Microsoft.Office.Interop.Visio.dll, which you can download from MSDN[^] for Office XP and which comes with Office 2003 Professional) and just handle the event like so:
ApplicationClass app = new ApplicationClass();
app.ShapeChanged += new EApplication_ShapeChangedEventHandler(OnShapeChanged);
private void OnShapeChanged(object sender, IntPtr args)
{
} I'm not sure if this will work, however. You mentioned in a previous reply that it doesn't seem to be firing. It was only an educated guess, since no other event really seems to be appropriate.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
|
Thank you very much, it works great.
I have another question, though:
HOw can I produce an 'undo' programmatically?
|
|
|
|
|
I have tried:
Shape.Application.Undo();
and simply nothing happens.
And:
this.VisioContainerDesign.Window.Application.Undo();
And nothing happens either!
????
|
|
|
|
|
You have to use Visio's Undo Manager to begin and end an undo unit scope. See Chapter 25, Using the Visio Undo Manager in Your Program[^] in the MSDN Library. This is in referene to the OLE automation interfaces exposed by Visio, which is what the .NET interop assemblies (RCWs) wrap. For instance, the ApplicationClass has a BeginUndoScope mentioned in the link above.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
It works, but if I move a shape once the event is fired MANY times (ten or more). How can I make this event be caught only once for everytime i move a shape?
I could add a counter, but then I wouldn't be able to distinguish when the event is fired correctly from when it is fired because of this weird behavior of visio sdk, so how can I control this?
This is needed because what I do when the shape moves is a heavy process and this eats up time like crazy.
ANY help would be greatly appreciated!
|
|
|
|
|
You can't prevent it from being fired so many times, but you could use a simple state variable to help performance and determine when the last event was fired over a period of time (using a timer, for example, a common approach to many such problems).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I'm having problems with another event:
how can I detect a doubleclick on a Shape?
How about a rightclick on a shape?
....
(Any help would be greatly appreciatted)
Thanks a lot
|
|
|
|
|
If these are not Control derivatives, then you have to implement the events yourself from their container. The container would receive these events and you'd have to use the MousePosition static property of a Control (and call PointToClient on that control with the coordinates from MousePosition since those are in screen coordinates). Using the returned Point you need to have a way to figure out which shape was clicked, and then cause it to fire it's own Click or DoubleClick events (which you'd have to implement) using the same timer concept I mentioned before.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Do you know how to obtain a shape's coordinated programmatically????
I can DROP a shape at particular coordinated, but not obtain a shapes coordinates....???
|
|
|
|
|
What I know is all from the object model documentation in MSDN Library. You should try reading it.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I got it!
[CODE]
double iDropLocationX = myShape.get_Cells("PinX").get_Result(VisUnitCodes.visInches)+1;
double iDropLocationY = myShape.get_Cells("PinY").get_Result(VisUnitCodes.visInches)-0.5;
[/CODE]
|
|
|
|
|
Got another question, tho'
I am creating a method that receives two shapes and connects them programmatically.
How can I do that?
Is there any visio function that can draw that connection given the two shapes?
|
|
|
|
|
I'm using the methods Shape.SetBegin and Shape.SetEnd. But they don't seem to connect just fine.
|
|
|
|
|
This works:
Cell vsoCellGlueFromBegin = oShapeConnector.get_Cells("BeginX");
Cell vsoCellGlueFromEnd = oShapeConneor.get_Cells("EndX") ;
Cell vsoCellGlueToObject = oShape1.get_Cells("Connections.X");
Cell vsoCellGlueToObject2 = oShape2.get_Cells("Geometry1.X1");
vsoCellGlueFromBegin.GlueTo(vsoCellGlueToObject);
vsoCellGlueFromEnd.GlueTo(vsoCellGlueToObject2);
For whom it may concern.
|
|
|
|
|
This works:
Cell vsoCellGlueFromBegin = oShapeConnector.get_Cells("BeginX");
Cell vsoCellGlueFromEnd = oShapeConneor.get_Cells("EndX") ;
Cell vsoCellGlueToObject = oShape1.get_Cells("Connections.X1");
Cell vsoCellGlueToObject2 = oShape2.get_Cells("Connections.X1");
vsoCellGlueFromBegin.GlueTo(vsoCellGlueToObject);
vsoCellGlueFromEnd.GlueTo(vsoCellGlueToObject2);
For whom it may concern.
|
|
|
|
|
hi
i have problem in matrix determinant in 3d matrix so i want
to know how can i solve this programme of finding the
determinant in 3d matrix
bye
matrix determinant in 3*3d
|
|
|
|
|
|
Are you taking about a 3x3 matrix or a matrix of type 3x3x3? For that later you wuold have to approach the process through the Gram-Schmit Orthonormalization method. A google search reveals various articles on how to work with matrices of three dimensions.
|
|
|
|
|
I have a translation program called .net Framwork1.1. If it's running in .net Framwork 1.1, would there any error ocurr ?
does .net Framwoek is compatibled
study everyday
|
|
|
|