VC打开并缩放显示位图(.BMP)文件的方法

VC打开并缩放显示位图(.BMP)文件的方法

最近一个项目需要进行位图操作,网上找了一大堆资料,但发现都是以前VC6.0版本的抄来抄去,而且大多数使用了复杂的位图结构。所以自己通过查阅MSDN上面的资料,实现了相对简单的方案,本方案使用了MFC提供的来CBitmap,使用较少的代码便实现了VC打开并显示位图(BMP)文件到对话框指定的控件中。程序的实现效果如下图:

VC打开位图(BMP)文件

下面分步骤详细介绍VC打开并显示位图(BMP)文件的具体方法和对应的VC源代码:

1. 使用文件对话框CFileDialog让用户选择位图(BMP)文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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());
     }
}

2. 加载位图(BMP)文件到CBitmap指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 加载位图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();
}

3. 在控件中显示加载的CBitmap对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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控件的大小。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值