COM 使用OleLoadPicture加载在MFC对话框中显示JPG图像
2022-02-23
27
0
在C盘放一张名为aa.jpg,使用MFC运行程序,点击按钮1在对话框中显示JPG图像
源代码如下:
void CTTDlg::OnBnClickedButton1()
{
CDC* pDC = GetDC();
CoInitialize(NULL); //COM 初始化
HRESULT hr;
CFile file;
file.Open(L"c:\\aa.jpg", CFile::modeRead | CFile::shareDenyNone); //读入文件内容
DWORD dwSize = file.GetLength();
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, dwSize);
LPVOID lpBuf = GlobalLock(hMem);
file.Read(lpBuf, dwSize);
file.Close();
GlobalUnlock(hMem);
IStream* pStream = NULL;
IPicture* pPicture = NULL;
//由HGLOBAL得到 IStream,参数 TRUE表示释放IStream的同时,释放内存
hr = CreateStreamOnHGlobal(hMem, TRUE, &pStream);
ASSERT(SUCCEEDED(hr));
hr = OleLoadPicture(pStream, dwSize, TRUE, IID_IPicture, (LPVOID*)&pPicture);
ASSERT(hr == S_OK);
long nWidth, nHeight; //宽高,MM_HIMETRIC 模式,单位是0.01毫米
pPicture->get_Width(&nWidth); //宽
pPicture->get_Height(&nHeight); //高
//=========原大显示=========
CSize sz(nWidth, nHeight);
pDC->HIMETRICtoDP(&sz); //转换 MM_HIMETRIC 模式单位为 MM_TEXT 像素单位
pPicture->Render(pDC->m_hDC, 0, 0, sz.cx, sz.cy, 0, nHeight, nWidth, -nHeight, NULL);
//======按窗口尺寸显示======
//CRect rect; GetClientRect(&rect);
//pPicture->Render(pDC->m_hDC,0,0,rect.Width(),rect.Height(),0,nHeight,nWidth,-nHeight,NULL);
if (pPicture)pPicture->Release(); //释放 IPicture 指针
if (pStream)pStream->Release(); //释放 IStream 指针,同时释放了 hMem
CoUninitialize();
}