VC打开并缩放显示位图(.BMP)文件的方法
最近一个项目需要进行位图操作,网上找了一大堆资料,但发现都是以前VC6.0版本的抄来抄去,而且大多数使用了复杂的位图结构。所以自己通过查阅MSDN上面的资料,实现了相对简单的方案,本方案使用了MFC提供的来CBitmap,使用较少的代码便实现了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控件的大小。