我正在研究包含大型地圖圖像(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];
}
非常感謝提前。我敢肯定,這是相對容易的,我忽略了,但幾個小時後,我只是沒有找到它。
您已經保留了矩陣,也很好計算有效的滾動範圍。你需要知道的使用它是完全不清楚的,你的片段與滾動沒有任何關係。 –
目前尚不清楚你有什麼樣的數據。你在使用GDI +嗎?你能否獲得圖像的新尺寸並將其用作新的邊界? – bashis