VC界面显示图片(BMP)

1、通过点击浏览按钮选择BMP图像文件
点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录。
关键代码如下:
void CShowBMPDlg::OnButtonSelectiamge()
... {
charszFilter[]="BMPFiles(*.bmp)|*.bmp|AllFiles(*.*)|*.*||";
CFileDialogdlg(TRUE,
"BMP",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal()==IDOK)
...{
strPathName
=dlg.GetPathName();
LoadShowBMPFile(strPathName);
m_hBitmap
=BufferToHBITMAP();
Invalidate();
}

}
2、加载BMP文件到内存
通过得到的BMP图像文件路径目录,加载BMP图像文件到内存中。
关键代码如下:
BOOLCShowBMPDlg::LoadShowBMPFile( const char * pPathname)
... {
CFilefile;
if(!file.Open(pPathname,CFile::modeRead))
returnFALSE;
DWORDm_nFileLen;
m_nFileLen
=file.GetLength();
m_pBMPBuffer
=newchar[m_nFileLen+1];
if(!m_pBMPBuffer)
returnFALSE;
if(file.Read(m_pBMPBuffer,m_nFileLen)!=m_nFileLen)
returnFALSE;
returnTRUE;
}
3、将内存中的BMP文件内容转换到HBITMAP
将内存中的BMP文件内容转换成位图句柄。
关键代码如下:
HBITMAPCShowBMPDlg::BufferToHBITMAP()
... {
HBITMAPhShowBMP;
LPSTRhDIB,lpBuffer
=m_pBMPBuffer;
LPVOIDlpDIBBits;
BITMAPFILEHEADERbmfHeader;
DWORDbmfHeaderLen;

bmfHeaderLen
=sizeof(bmfHeader);
strncpy((LPSTR)
&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);

if(bmfHeader.bfType!=(*(WORD*)"BM"))returnNULL;
hDIB
=lpBuffer+bmfHeaderLen;
BITMAPINFOHEADER
&bmiHeader=*(LPBITMAPINFOHEADER)hDIB;
BITMAPINFO
&bmInfo=*(LPBITMAPINFO)hDIB;
m_bmW
=bmiHeader.biWidth;
m_bmH
=bmiHeader.biHeight;
lpDIBBits
=(lpBuffer)+((BITMAPFILEHEADER*)lpBuffer)->bfOffBits;
CClientDCdc(
this);
hShowBMP
=CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);
returnhShowBMP;
}

4、在屏幕上显示BMP图像
双缓冲实现BMP位图显示在屏幕上。
关键代码如下:
void CShowBMPDlg::DrawImage( int x, int y,CDC * pDC)
... {
HBITMAPOldBitmap;
CDCMemDC;
MemDC.CreateCompatibleDC(pDC);
OldBitmap
=(HBITMAP)MemDC.SelectObject(m_hBitmap);

CBitmap
*pBitmap=CBitmap::FromHandle(m_hBitmap);
if(m_bmW==0||m_bmH==0)
return;
CRectrect;
GetClientRect(
&rect);
/**//*str.Format("%d%d",rect.Width(),rect.Height());
MessageBox(str);
*/

pDC
->BitBlt(x,y,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);

GetRGB(MemDC);

MemDC.SelectObject(OldBitmap);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值