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控件的大小。