當流程過於復雜,流程環節過多時,在一個屏幕中不能完全顯示整個流程圖,需要拖拽滾動條來顯示。這對於了解整個流程的概況有些不便,聯想到一些看圖軟件的縮放功能,如果可以給流程增加縮放,那麼就可以很好的解決流程圖過於復雜而不便查看的問題了。
十、增加流程圖縮放功能
流程縮放要考慮活動和規則的縮放,對於活動和規則,他們的縮放方式稍有不同。
對於活動,縮放會影響兩個地方,一個是活動的位置,也就是相對於容器的Top和Left屬性。另一個是活動本身的圖形的大小。
對於規則,縮放只會影響到規則的位置。如果規則關聯到活動,那麼規則的位置不進行縮放計算,而是跟隨關聯的活動進行位置的改變。
首先要給IElement接口增加一個縮放方法,void Zoom(double zoomDeep),這個方法中的參數zoomDeep說明了縮放的比例。下面分別在活動和規則中實現這個方法。
10.1 活動縮放
上面講到了,活動的縮放影響到兩個方面,一個是活動的位置,一個是活動的大小。對於給定的縮放比例大小(zoomDeep),只需要將這個zoomDeep應用到位置和大小即可。但有一點非常重要的是,縮放指的是對原圖進行的縮放,因此需要記錄一下活動的原始大小,以及原始位置(每位位置發生變動,例如活動被拖拽時,重新記錄一下位置信息)。
使用下面的方法對活動進行縮放處理
//圖片原始寬
double origPictureWidth = 0;
//圖片原始高
double origPictureHeight = 0;
//圖片原始位置
Point origPosition;
//位置是否發生改變
boopositionIsChange = true;
public void Zoom(double zoomDeep)
{
if (origPictureWidth == 0)
{
origPictureWidth = sdPicture.PictureWidth;
origPictureHeight = sdPicture.PictureHeight;
}
if (positionIsChange)
{
origPosition = this.Position;
positionIsChange = false;
}
sdPicture.PictureHeight = origPictureHeight * zoomDeep;
sdPicture.PictureWidth = origPictureWidth * zoomDeep;
this.Position = new Point(origPosition.X * zoomDeep, origPosition.Y * zoomDeep);
}