您的位置:首页 > 其它

mfc- Picture control显示图片

2011-10-26 10:35 429 查看
一、放一个Pictrue控件属性Type设为Owner Draw

调整大小

二、加一个按钮控件用于处理图片加载,添加事件

三、按钮单击事件

char* m_JPGBuf ;

int m_JPGLen;//头文件中定义

void Cbmlb::OnBnClickedBtnUplogpic()

{

CString PicPath;

CFileDialog fdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"JPEG图像文件|*.jpg|BMP图像文件|*.bmp||");

if (fdlg.DoModal() == IDOK)

{

PicPath = fdlg.GetPathName();

CFile file;

if(file.Open(PicPath,CFile::modeRead) && ((m_JPGLen = file.GetLength()) != -1))

{

m_JPGBuf = (char *)malloc(m_JPGLen);

file.Read(m_JPGBuf, m_JPGLen);

file.Close();

}

DisplayJPG(m_JPGBuf,m_JPGLen);

}

((CStatic*)GetDlgItem(IDC_EDIT_PicPath))->SetWindowText(PicPath);//编辑框可以显示图片路经



四、编辑图片处理方法

BOOL Cbmlb::DisplayJPG(char* JPGBuf ,int JPGLen)

{

m_JPGBuf = JPGBuf;

m_JPGLen = JPGLen;

IStream *pStm;

LPVOID pvData;

HGLOBAL hGlobal;

CRect m_DisplayRect,m_winRect;

CDC* m_pDisplayCDC;

m_pDisplayCDC = m_PersonPicBtn.GetDC();

m_PersonPicBtn.GetClientRect(&m_DisplayRect);//获取画单张图的RECT

double m_HORZRES = (double)m_pDisplayCDC->GetDeviceCaps(HORZRES);

double m_VERTSIZE = (double)m_pDisplayCDC->GetDeviceCaps(VERTSIZE);

if(JPGBuf == NULL)

{

CBrush br(RGB(0,0,0));

m_pDisplayCDC->FillRect(&m_DisplayRect, &br);

return FALSE;

}

char *pJPGBuf = JPGBuf;

int iJPGLen = JPGLen;

hGlobal = GlobalAlloc(GMEM_MOVEABLE, iJPGLen);

pvData = NULL;

if(hGlobal != NULL)

{

pvData = GlobalLock(hGlobal);

if(pvData != NULL)

{

memcpy(pvData,pJPGBuf,iJPGLen);

GlobalUnlock(hGlobal);

CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

}

}

//打开文件结束

//显示JPEG和GIF格式的图片,GIF只能显示一帧,还不能显示动画,

//要显示动画GIF请使用ACTIVE控//件。

IPicture *pPic; //load image from file stream

if(SUCCEEDED(OleLoadPicture(pStm,iJPGLen,TRUE,IID_IPicture,(LPVOID*)&pPic)))

{

OLE_XSIZE_HIMETRIC hmWidth;

OLE_YSIZE_HIMETRIC hmHeight;

pPic->get_Width(&hmWidth);

pPic->get_Height(&hmHeight);

double fX,fY;

//get image height and width

fX = m_HORZRES*(double)hmWidth/(m_HORZRES*100.0);

fY = m_VERTSIZE*(double)hmHeight/(m_VERTSIZE*100.0);

//use render function display image

if(FAILED(pPic->Render(*m_pDisplayCDC,0,0,m_DisplayRect.Width(),m_DisplayRect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL)))

{

pPic->Release();

pStm->Release();

if(hGlobal != NULL)

GlobalFree(hGlobal);

ReleaseDC(m_pDisplayCDC);

return FALSE;

}

pPic->Release();

pStm->Release();

}

else

{

pStm->Release();

if(hGlobal != NULL)

GlobalFree(hGlobal);

ReleaseDC(m_pDisplayCDC);

return FALSE;

}

if(hGlobal != NULL)

{

GlobalFree(hGlobal);

}

ReleaseDC(m_pDisplayCDC);

return TRUE;

}

五、加ONPAIN方法

void Cbmlb::OnPaint()

{

CPaintDC dc(this); // device context for painting

// TODO: 在此处添加消息处理程序代码

// 不为绘图消息调用 CDialog::OnPaint()

DisplayJPG(m_JPGBuf,m_JPGLen);

}

欢迎加入vc技术交流群:320307654
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: