您的位置:首页 > 其它

VC将BMP图片显示在屏幕上(用图片作背景)

2008-11-28 12:09 393 查看

VC将BMP图片显示在屏幕上(用图片作背景)

1、通过点击浏览按钮选择BMP图像文件

点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录。

关键代码如下:


void CShowBMPDlg::OnButtonSelectiamge()




...{


char szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";


CFileDialog dlg( 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图像文件到内存中。

关键代码如下:


BOOL CShowBMPDlg::LoadShowBMPFile(const char *pPathname)




...{


CFile file;


if( !file.Open( pPathname, CFile::modeRead) )


return FALSE;


DWORD m_nFileLen;


m_nFileLen = file.GetLength();


m_pBMPBuffer = new char[m_nFileLen + 1];


if(!m_pBMPBuffer)


return FALSE;


if(file.Read(m_pBMPBuffer,m_nFileLen) != m_nFileLen)


return FALSE;


return TRUE;


}

3、将内存中的BMP文件内容转换到HBITMAP

将内存中的BMP文件内容转换成位图句柄。

关键代码如下:


HBITMAP CShowBMPDlg::BufferToHBITMAP()




...{


HBITMAP hShowBMP;


LPSTR hDIB,lpBuffer = m_pBMPBuffer;


LPVOID lpDIBBits;


BITMAPFILEHEADER bmfHeader;


DWORD bmfHeaderLen;




bmfHeaderLen = sizeof(bmfHeader);


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




if (bmfHeader.bfType != (*(WORD*)"BM")) return NULL;


hDIB = lpBuffer + bmfHeaderLen;


BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;


BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;


m_bmW = bmiHeader.biWidth;


m_bmH = bmiHeader.biHeight;


lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;


CClientDC dc(this);


hShowBMP = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);


return hShowBMP;


}



4、在屏幕上显示BMP图像

双缓冲实现BMP位图显示在屏幕上。

关键代码如下:


void CShowBMPDlg::DrawImage(int x, int y, CDC *pDC)




...{


HBITMAP OldBitmap;


CDC MemDC;


MemDC.CreateCompatibleDC(pDC);


OldBitmap=(HBITMAP)MemDC.SelectObject(m_hBitmap);




CBitmap* pBitmap = CBitmap::FromHandle(m_hBitmap);


if(m_bmW == 0 || m_bmH == 0)


return ;


CRect rect;


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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: