ThinkGeo.com    |     Documentation    |     Premium Support

WinformsMap Override rectangle with Shift key Zoom behavior

I am still a relative newcomer to MapSuite and I do not have a good understaning of  all the events and handlers built into winformsMap in the Desktop Edition.  I am hoping someone can point me in the right direction to save me a lot of trial and error.


We have been using the built in functions of the winformsMap to provide pan and zoom functionality on the Map.  We use the click and drag to pan. We also use the DoubleClick to zoom in and out.  We have also been using the click and Drag with the Shift key down to select a rectangle area and zoom to that extent.  We would like to refine the extent for this last zoom function so that it will zoom to include all of the rectangle selected instead of just a "best fit".  We have found that if the rectangle selected with the shift key down is not in a similar proportion to the window that the extent of the zoom does not always cover all of the rectangle.


I need to know how to override this built in zoom in the winformsMap. I have been searching and it appears we may need to use the InteractiveOverlay but I have tried to set breakpoints in the MapDownCore, MapUpCore, MouseClickCore.  I can capture the MouseDownCore but I do not get the MouseUpCore or MouseClickCore.


Can anyone give me some hints of a method to intercept the mouse clicks with the shift key in order to override the calculations on the extent on winformsMap?  If any of the sample applications do this type of behavior it would be a great help.


Any help would be greatly appreciated.


Thanks in advance


Richard


 


 


 


 



Hi Richard,  
  
 Thanks for your question! 
 Let me provide you a bit of background on what is happening. 
  
 Basically the behavior you are seeing is a result of the Map Control attempting to utilize all its available area and also a Snapping mechanism that is enabled by default for the Map. Say that you draw a rectangle that does not match the ratio of the Map Controls height/width. The map checks out what the largest value of your rectangle is and creates a square using that value for the height and width. The control then determines which of our 20 ZoomLevels (or scales)  in the ZoomLevel set work best for this newly created square. We then snap up the closest zoomlevel.  
  
 So you have two elements that have the ability to modify the extent that is returned after a TrackZoom. The first is that we need to return a map that matches the height/width ratio of map control so we have to get a square map if the map control’s ratio is 1, and that we need to snap up to one of the 20 Scales/ZoomLevels that makes up the ZoomLevel set which can increase the actual extent of the map that is returned. 
  
 Thus the map you are returned should always contain the data you outlined with your TrackZoom rectangle, but might also include some data to the sides or above/below the area you defined.

Ryan,


Thanks for the quick response.  You guys are very good at getting back quickly with answers and I appreciate that because we are usually in a deadline when I encounter problems that I can't solve.


You said:


"Thus the map you are returned should always contain the data you outlined with your TrackZoom rectangle, but might also include some data to the sides or above/below the area you defined."


That is the problem we need to solve.  When I use the "TrackZoom rectangle", the extent that displays does not include all the area selected by the "TrackZoom rectangle".   It appears to zoom too far as if it snaps to a closer zoom scale.  After the "TrackZoom Rectangle" zoom completes, if I zoom back out to the previous level, the map is much closer to the "TrackZoom Rectangle" area.  I thought  If I could override the handler for the "TrackZoom Rectangle" , I would be able to control the zoom level.


Richard


 


 



Ryan,


It is so helpful to have someone to sound these things out on.


I believe I have found the problem in my code.  We have a trackbar control that also is used to zoom the map.  I had two event handler defined:


trackBar1_ValueChanged and winformsMap_CurrentScaleChanged.


In the currentScaleChanged event I am setting the trackbar1.Value so that the Trackbar thumb will stay in sync with the current zoom level of the Map when the zoom has occured due to event such as the TrackZoom Rectangle.  Setting the trackbar1.Value was causing the event to handle trackbar1_ValueChanged which in turn does a winformsMap.ZoomToScale. 


Therefore when the TrackZoom Rectangle was processed it was also firing the trackbar1_ValueChanged which was doing a second zoom in to the next zoom scale level.  Now I disable the trackbar1_ValueChanged in the CurrentScaleChanged handler and reenable it again after I change the trackbar1.Value.  This stops the second zoom the the TrackZoom Rectangle zooms to the area selected by the rectangle. 


Thanks for the tips as it was helpful in getting me to narrow down the behavior in order to discover the double zoom.  I believe I have solved the issue but I will need to do more intensive testing to verify that I haven't introduces other issues.


Thanks again.


Richard


 


 



Hi Richard, 
  
 Glad to hear that your problem has been solved, if you have any questions please let us know. 
  
 Regards, 
 Edgar