Is there a method on a DgnButtonEvent to accomplish the same thing?
UpdatePosition(DgnButtonEventCR ev) { DPoint3d screenPt3D = { 0 }; ev.GetViewport()->ViewToScreen(&screenPt3D, ev.GetViewPoint(), 1); // Transfrom an array of points in DgnCoordSystem::View into DgnCoordSystem::Screen. Point2d globalPt = { (int)screenPt3D.x, (int)screenPt3D.y }; Point2d screenPt2d = { 0 }; // Can I do this somehow directly without calling mdlWindow_globalPointToScreen() ? mdlWindow_globalPointToScreen(&screenPt2d, mdlWindow_viewWindowGet(ev.GetViewNum()), &globalPt); // Converts a point in global coordinates to a point in screen coordinates for the screen number specified by windowP. }
Bruce
How about ViewPort::ViewToScreen()?
ViewPort::ViewToScreen()
Regards, Jon Summers LA Solutions
Jon Summers said:How about ViewPort::ViewToScreen()?
That's the first call I make, which converts the cursor location from DGN units to a "window" location. The second call ( mdlWindow_globalPointToScreen() ) coverts that "window" location to a "screen" location (I have three monitors), so I think the MDL call return the position relative to the collection/arrangement of monitors, not the "window". I'm wondering if the API has a method to do that so I can skip calling the MDL function. Ultimately, I'm using a WIndows API function, so it needs the position in what I'm calling "screen" coordinates (which is not the definition of "screen" that MicroStation is using).
It would be helpful to have a summary of the concept of "location" types used by MicroStation (Screen, Global, NPT?, etc) and how they relate to the concept of Windows positioning.
// note: you can use the following corrected code piece to get pure windows screen point for the button event.
// both pointInMDLclient and globlePoint are in a window coordinates which is relative to a window rect.
// as you said, Viewport::ViewToScreen don't return screen point in fact.
// please focus on the using of mdlWindow_globalPointConversionIncrease which is the key point here.
// other changes just rename the variable names to make it's meaning more accurate.
//
// ev.GetViewPoint returns the mouse position of client area of the view window,
// Viewport::ViewToScreen returns the point which is relative to left-up corner of a special client window which
// is the gray area to contain the 8 view windows. The special client window is like the Win32
// MDClient for multi-document program.
DPoint3d pointInMDLclient3D = { 0 };
ev.GetViewport ()->ViewToScreen (&pointInMDLclient3D, ev.GetViewPoint (), 1);
Point2d pointInMDLclient = { (int)pointInMDLclient3D.x, (int)pointInMDLclient3D.y };
// in CE, because there is ribbon bar, we must convert the pointInMDLclient to global point which is relative to
// the left-up corner of the main frame window.
Point2d globlePoint = { 0 };
MSDialogP viewWindow = mdlWindow_viewWindowGet (ev.GetViewNum ());
if (mdlWindow_isGlobalPointConversionRequired (viewWindow->GetScreenNumber ()))
mdlWindow_globalPointConversionIncrease (&globlePoint, viewWindow, &pointInMDLclient);
else
globlePoint = pointInMDLclient;
// now use mdlWindow_globalPointToScreen to convert the global point to screen point which is pure windows concept
// but not the Microstation concept, and I don't think there is equivalent C++ method in DgnButtonEvent or other class
Point2d screenPt2d = { 0 };
mdlWindow_globalPointToScreen (&screenPt2d, mdlWindow_viewWindowGet (ev.GetViewNum ()), &globlePoint);
That is what I'm currently doing. You have confirmed my suspicions:
dorlig na said:I don't think there is equivalent C++ method in DgnButtonEvent or other class
Thanks !!
Answer Verified By: Bruce Reeves SRNS