2015-12-30 65 views
1

我正在研究包含大型地圖圖像(5500像素×2500像素)的Winforms應用程序。我已經設置好了,因此地圖以全尺寸開始,但用戶可以縮小到幾個不同的比例以查看更多地圖。用戶可以拖動地圖來改變他們正在查看的內容(如Google地圖,必應地圖,文明等)。在C#Winforms中放大時計算圖像寬度

當地圖是全尺寸(比例= 1.0)時,我可以防止用戶滾動圖像的邊界。我通過計算這樣做,如果他們想搬過去0,或過去的圖像寬度 - 當前窗口的大小,與此類似:

if (_currHScroll <= 0) { 
    _currHScroll = 0; 
} 

這一切工作就好了。但是,當我縮小地圖(因此縮小圖像)時,地圖底部和右側的限制就會崩潰。我知道爲什麼會發生這種情況 - 因爲執行的變換基本上會「壓縮」地圖一點點,所以以前的5000像素圖像現在更小,這取決於比例尺。但是,我的限制器基於圖像大小。

因此,用戶可以滾動瀏覽地圖的末尾,只看到空白區域。更糟糕的事情發生了,我意識到,但如果可能的話,我想阻止他們這樣做。

我確定有一個簡單的方法來做到這一點,但我還沒有弄明白。我試着簡單地將我的計算乘以比例尺,但似乎並不奏效(似乎最初低估了尺寸,然後高估了最小尺寸)。我試過計算圖像右下角的變換位置,然後使用它,但事實證明,這個數字是倒置的,我找不到它與之相關的內容。

我在這裏包含了我的轉換點方法。它工作得很好。它告訴我,無論縮放級別如何,原始圖像上點擊了哪個像素。因此,如果有人點擊200,200點,但圖像的縮放比例爲.5,則它會顯示類似於點擊400,400的東西(但是,正如我所說的,我認爲比例值不是乘數 - 使用這僅用於演示目的)。

public Point GetTransformedPoint(Point mousePoint) { 
    Matrix clickTransform = _mapTransform.Clone(); 
    Point[] xPoints = { new Point(mousePoint.X, mousePoint.Y) }; 
    clickTransform.Invert(); 
    clickTransform.TransformPoints(xPoints); 

    Debug.Print("Orig: {0}, {1} -- Trans: {2}, {3}", mousePoint.X, mousePoint.Y, xPoints[0].X, xPoints[0].Y); 

    return xPoints[0]; 
} 

非常感謝提前。我敢肯定,這是相對容易的,我忽略了,但幾個小時後,我只是沒有找到它。

+0

您已經保留了矩陣,也很好計算有效的滾動範圍。你需要知道的使用它是完全不清楚的,你的片段與滾動沒有任何關係。 –

+0

目前尚不清楚你有什麼樣的數據。你在使用GDI +嗎?你能否獲得圖像的新尺寸並將其用作新的邊界? – bashis

回答

0

如果我理解正確,您可以使用您的方法GetTransformedPoint通過使用您的圖像作爲點的寬度和高度來計算最大值。結果然後可以在您的支票中使用...

順便說一句,您是對的,比例值是用作乘數的因子。唯一的是,您必須將結果轉換爲整數。

+0

我很欣賞評論。不幸的是,我還沒有得到它的工作,至少不是普遍的。我認爲我已經在一個點上解決了問題,但它只適用於特定的縮放級別。其他縮放級別失敗。我確信有關係,我只是還沒有看到它。 – user3645486

+0

好的,你可以編輯你的問題,並提供最小但完整的代碼,所以我們可以看看它... –