2012-03-16 23:33:28|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, MFC, 图形/图像|来源:唯设编程网
最近一个项目需要进行位图操作,网上找了一大堆资料,但发现都是以前VC6.0版本的抄来抄去,而且大多数使用了复杂的位图结构。所以自己通过查阅MSDN上面的资料,实现了相对简单的方案,本方案使用了MFC提供的来CBitmap,使用较少的代码便实现了VC打开并显示位图(BMP)文件到对话框指定的控件中。程序的实现效果如下图:
下面分步骤详细介绍VC打开并显示位图(BMP)文件的具体方法和对应的VC源代码:
void CTestApplicationDlg::OnBnClickedLoadfile() { //打开对话框,并获得要打开的位图的路径 CString szFilter=_T("位图文件(*.bmp;*.dib)|*.bmp;*.dib|All Files(*.*)|*.*||"); CFileDialog dlg( TRUE, _T("*.bmp"), _T("E:MyProjectVC2008WindowsHookDebugGIRL.BMP"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter ); if(dlg.DoModal()==IDOK) { UpdateData(true); //加载位图文件 loadBMPFile(dlg.GetPathName()); } }
// 加载位图BMP文件 void CTestApplicationDlg::loadBMPFile(CString bmpPath){ HBITMAP hbitmap; //装载资源*.bmp hbitmap=(HBITMAP)::LoadImage (::AfxGetInstanceHandle(),bmpPath, IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); //NEW资源(调用一次重新拷贝一次) if (hbmp != NULL) { delete hbmp; hbmp = NULL; } //创建位图 hbmp = CBitmap::FromHandle(hbitmap); this->Invalidate(); }
void CTestApplicationDlg::OnPaint() { if (IsIconic()) { //...... } else { CDialog::OnPaint(); //在STATIC控件中显示位图 if(hbmp!=NULL){ ////显示原始图片 ShowSrcBmp(); //执行处理函数 for(vector<pImgProcessFun>::size_type ix=0;ix!=imgProFun.size();ix++) (this->*(imgProFun[ix]))(); //显示处理后的图片 ShowDesBmp(); } } } //在Static控件内显示位图 void CTestApplicationDlg::ShowSrcBmp() { //将pStatic指向要显示的地方 CStatic *pStatic = NULL; //根据ID获取Static控件 pStatic=(CStatic*)GetDlgItem(IDC_RAWIMG); //////////////////////////////////////////////// /**这一步相当重要,否则无法实现自绘*****/ //////////////////////////////////////////////// pStatic->ModifyStyle(0,BS_OWNERDRAW); //创建DC CClientDC dc(pStatic); //获取图片内容 BITMAP bm; hbmp->GetBitmap(&bm); CDC dcMem; //创建兼容DC dcMem.CreateCompatibleDC(&dc); CBitmap *pOldBitmap=dcMem.SelectObject(hbmp); CRect lRect; //获取Static控件的大小范围 pStatic->GetClientRect(&lRect); //在Static控件上显示位图 //判断是否需要调整到适合画布 if(((CButton*)GetDlgItem(IDC_CHECK4))->GetCheck()) dc.StretchBlt( lRect.left,lRect.top ,lRect.Width(),lRect.Height(), &dcMem, 0 ,0,bm.bmWidth,bm.bmHeight, SRCCOPY ); else{ int minWidth=bm.bmWidth<lRect.Width()?bm.bmWidth:lRect.Width(); int minHeight=bm.bmHeight<lRect.Height()?bm.bmHeight:lRect.Height(); dc.StretchBlt( 0 ,0 ,minWidth,minHeight, &dcMem, 0 ,0,minWidth,minHeight, SRCCOPY ); } dcMem.SelectObject(&pOldBitmap); }
至此,便完成了显示文件对话框->打开用户选择的位图(BMP)文件->显示位图的功能,用户可以选择是否将位图缩放显示以适合CStatic控件的大小。