/** * @file ShowImg.cpp * @brief 对CImage的简单封装,使得在VC.net的MFC编程下显示各种格式的图片更简洁。 * @author 冷却 * @date 2010-8-15 */ #include <atlimage.h> /** * @brief 将图片显示到对话框的指定控件上 * @param[in] pszFileName 图片文件的完整路径 * @param[in] hDlg 对话框句柄 * @param[in] nIDDlgItem 控件ID * @param[in] rectDest 源矩形区域 * @param[in] rectSrc 目的矩形区域 * @return 成功:S_OK,失败:E_FAIL * @warning 如果rectDest为NULL,则其值默认为控件客户区域大小; 如果rectSrc为NULL,则其值默认为图片原始大小。 */ HRESULT ShowImg(LPCTSTR pszFileName, HWND hDlg, int nIDDlgItem, RECT* rectDest=NULL, RECT* rectSrc=NULL) { if ( NULL == pszFileName || NULL == hDlg ) return E_FAIL; HWND hImgArea = GetDlgItem(hDlg, nIDDlgItem); if ( NULL == hImgArea ) return E_FAIL; CImage cImg; if ( S_OK != cImg.Load(pszFileName) ) return E_FAIL; RECT rectD; if ( NULL != rectDest ) { memcpy((void*)&rectD, (void*)rectDest, sizeof(RECT)); } else { RECT RectImgArea; GetClientRect(hImgArea, &RectImgArea); memcpy((void*)&rectD, (void*)&RectImgArea, sizeof(RECT)); } RECT rectS; if ( NULL != rectSrc ) { memcpy((void*)&rectS, (void*)rectSrc, sizeof(RECT)); } else { RECT rectImg = {0, 0, cImg.GetWidth(), cImg.GetHeight()}; memcpy((void*)&rectS, (void*)&rectImg, sizeof(RECT)); } return (cImg.Draw(GetDC(hImgArea), rectD, rectS)) ? S_OK : E_FAIL; } //Demo void CSimpleShowPicDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here CRect rDst(0, 0, 98, 140); if ( S_OK == ShowImg("D://t.jpg", this->GetSafeHwnd(), IDC_STATIC_PIC, LPRECT(rDst)) ) { } else { AfxMessageBox("Err"); } }