1. 程式人生 > 實用技巧 >MFC 圖在PictureControl控制元件的中間顯示

MFC 圖在PictureControl控制元件的中間顯示

效果如下:

原理,以寬高比影象(紅色)<控制元件(藍色)為例,即圖更豎長。讓l移到l'處、r移到r'處,即求下圖中x即可。

注意,圖中除x以外,都指的是畫素位置(上下左右的意思,而不是邊長)。

程式碼如下:CImage image在標頭檔案裡,m_IDCpic是Picture Control控制元件滑鼠右鍵建立的關聯變數。

    CFileDialog fileDlg(TRUE, _T("bmp"), NULL, 0, _T("image Files(*.bmp; *.jpg;*.png)|*.JPG;*.PNG;*.BMP|All Files (*.*) |*.*||"), this
); if (fileDlg.DoModal()!=IDOK) { return; } if (!image.IsNull()) //防止再次載入報錯 { image.Destroy(); } CString strFilePath = fileDlg.GetPathName(); ////獲取圖片全路徑,如"D:\1.bmp" image.Load(strFilePath); CRect rect; //如果最後一段顯示的程式碼放到OnPaint()中,則此行放到標頭檔案裡,全域性。 float
kImg=(1.0*image.GetWidth())/(1.0*image.GetHeight()); //避免整型相除得整型。 m_IDCpic.GetClientRect(rect); //控制元件區域 float kPicControl=(1.0*rect.Width())/(1.0*rect.Height()); if (kImg>kPicControl)//按比例圖比控制元件更寬,則rect的上、下往中間縮x。左右不變 { int x=((rect.bottom-rect.top)-(rect.right-rect.left)/kImg)/2; rect.top
=rect.top+x; rect.bottom=rect.bottom-x; } else //按比例圖比控制元件更高,則rect的左右往中間縮x。上下不變 { int x=((rect.right-rect.left)-kImg*(rect.bottom-rect.top))/2; rect.left=rect.left+x; rect.right=rect.right-x; } //控制元件呈現原始的灰色,防止圖片重疊 m_IDCpic.ShowWindow(FALSE); m_IDCpic.ShowWindow(TRUE); //顯示(注意,以下程式碼最好放到OnPaint()的else中,以便重繪) if (!image.IsNull()) { CDC *pDc=m_IDCpic.GetWindowDC();//獲得顯示控制元件的DC SetStretchBltMode(pDc->m_hDC, STRETCH_HALFTONE); //設定縮放,否則圖片顯示會失真 image.Draw(pDc->m_hDC, rect); //將圖片繪製到Picture控制元件表示的矩形區域 ReleaseDC(pDc);//釋放資源 }