1.0 通过类向导添加WM_PAINT 即OnPaint函数
2.0 头文件
BOOL ShowPic(CDC* pDC, CString lpstrFile, int sx, int sy, int nScrWidth, int nScrHeight);
3.0 C文件
//CBLToolsDlg继承DialogEx
//添加下面调用函数
void CBLToolsDlg::OnPaint()
{
CPaintDC dc(this);
ShowPic(&dc, "C:\author.bmp", 0, 0, 100, 200);
}
4.0 实现代码
/*
* sx x轴
* sy y轴
* nScrWidth 图像宽度
* nScrHeight 图像高度
*/
BOOL CBLToolsDlg::ShowPic(CDC* pDC, CString lpstrFile, int sx, int sy, int nScrWidth, int nScrHeight)
{
IPicture* pPic;
IStream* pStm;
BOOL bResult;
HANDLE hFile = NULL;
DWORD dwFileSize, dwByteRead;
//打开硬盘中的图形文件
hFile = CreateFile(lpstrFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
dwFileSize = GetFileSize(hFile, NULL);//获取文件字节数
if (dwFileSize == 0xFFFFFFFF)
{
CloseHandle(hFile);
return FALSE;
}
}
else
{
return FALSE;
}
//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
if (hGlobal == NULL) return FALSE;
LPVOID pvData = GlobalLock(hGlobal);
if (pvData == NULL)//锁定分配内存块
{
GlobalFree(hGlobal);
return FALSE;
}
ReadFile(hFile, pvData, dwFileSize, &dwByteRead, NULL);//把文件读入内存缓冲区
CloseHandle(hFile);//关闭打开的文件
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//装入图形文件
bResult = OleLoadPicture(pStm, dwFileSize, TRUE, IID_IPicture, (LPVOID*)&pPic);
GlobalFree(hGlobal);
if (FAILED(bResult)) return FALSE;
long hmWidth;//图片的真实宽度
long hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//将图形输出到屏幕上(有点像BitBlt)
bResult = pPic->Render(pDC->m_hDC, sx, sy, nScrWidth, nScrHeight, 0, hmHeight, hmWidth, -hmHeight, NULL);
pPic->Release();
return TRUE;
}