.Net提供的PictureBox控件當(dāng)圖片大于顯示區(qū)域時沒有滾動條供滾動查看。不過好在這個功能可以很簡單的通過Panel來實現(xiàn)。我們需要使用一個Panel來裝PictureBox,再將Panel的AutoScroll設(shè)置為True,PictureBox的SizeMode設(shè)置為AutoSize。這樣PictureBox的大小就由圖片來決定了,而當(dāng)PictureBox的大小超過了Panel時就會出現(xiàn)滾動條了(來自于Panel)。但值得注意的是不要將PictureBox控件Dock在Panel上,不然不會出現(xiàn)滾動條,只要將PictureBox的Location設(shè)置為0,0即可。Dock在父容器上時寬高就由父容器決定了,這和我們想要的AutoSize是相悖的,其實微軟控件的一些屬性是相悖的,但是在設(shè)計器中并沒有體現(xiàn)出來而是在運行時體現(xiàn),這就給我們帶來了不少的困惑,需要慢慢的總結(jié)。
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比欽州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式欽州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋欽州地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。
現(xiàn)在運行起來查看大圖片就會出現(xiàn)滾動條了,但是你會發(fā)現(xiàn)鼠標(biāo)滾輪不管用。看來我們還要加入一些代碼來支持鼠標(biāo)滾輪。我們可以利用Form上的MouseWheel事件來處理這個事情,只是進(jìn)行一下區(qū)域判斷,如果鼠標(biāo)在Panel的區(qū)域內(nèi)則改變Panel的垂直滾動數(shù)值即可。
private void mainForm_MouseWheel(object sender, MouseEventArgs e) { // get screen point Point mousePoint = _mainForm.PointToScreen(e.Location); // whether in panel if (this.pnlImage.RectangleToScreen(this.pnlImage.ClientRectangle).Contains(mousePoint)) { this.pnlImage.AutoScrollPosition = new Point(this.pnlImage.HorizontalScroll.Value, pnlImage.VerticalScroll.Value - e.Delta); } }
e.Location就是鼠標(biāo)在form中的位置,以窗口左上角為0,0來計算的。通過PointToScreen方法可以將其轉(zhuǎn)化為屏幕坐標(biāo),以屏幕左上角為0,0來計算的。同樣的將Panel的顯示區(qū)域的坐標(biāo)也轉(zhuǎn)化為屏幕坐標(biāo),接下來就是判斷一下當(dāng)前的鼠標(biāo)是否在Panel的顯示區(qū)域就好了。
但是滾輪只能改變垂直滾動條,如果你還想更完美一些支持鼠標(biāo)拖動來同時改變水平和垂直滾動條的話。還需要在PictureBox的MouseDown、MouseMove和MouseUp上來做點事情。大體的思路就是在MouseDown時記住一個坐標(biāo),在MouseMove時用當(dāng)前坐標(biāo)和記住的坐標(biāo)進(jìn)行比較從而得知鼠標(biāo)的變化方向,并以此來改變滾動條的位置。
private Point _startLocation; private void pbImage_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { _startLocation = e.Location; Cursor = Cursors.SizeAll; } } private void pbImage_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int xOffset = _startLocation.X - e.X; int yOffset = _startLocation.Y - e.Y; this.pnlImage.AutoScrollPosition = new Point(this.pnlImage.HorizontalScroll.Value + xOffset, pnlImage.VerticalScroll.Value + yOffset); } } private void pbImage_MouseUp(object sender, MouseEventArgs e) { Cursor = Cursors.Default; }
如果你有更好的解決方案歡迎留言。