15,979
社区成员
发帖
与我相关
我的任务
分享
//图片加载
HRESULT CPicture_Disp5Dlg::LoadFromBuffer(BYTE* pBuff, int nSize)
{
bool bResult = false;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize);
void* pData = GlobalLock(hGlobal);
memcpy(pData, pBuff, nSize);
GlobalUnlock(hGlobal);
IStream* pStream = NULL;
if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK)
{
HRESULT hr;
if ((hr = OleLoadPicture(pStream, nSize, FALSE,IID_IPicture,(LPVOID *)&m_pPicture)) == S_OK)
bResult = true;
pStream->Release();
}
return bResult;
}
//图片显示函数
BOOL CPicture_Disp5Dlg::DrawFormFile(CString fileName,CDC *pDC)
{
CFile cFile;
CFileException e;
if(cFile.Open(fileName, CFile::modeRead | CFile::typeBinary, &e))
{
BYTE* pBuff = new BYTE[cFile.GetLength()];
if (cFile.Read(pBuff, cFile.GetLength()) > 0)
LoadFromBuffer(pBuff, cFile.GetLength());
delete [] pBuff;
//得到图象尺寸
long hmWidth;
long hmHeight;
m_pPicture->get_Width(&hmWidth);
m_pPicture->get_Height(&hmHeight);
int nWidth = MulDiv(hmWidth, pDC->GetDeviceCaps(LOGPIXELSX), 2540);
int nHeight = MulDiv(hmHeight, pDC->GetDeviceCaps(LOGPIXELSY), 2540);
//在内存中画
CDC MemDC;
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDC,nWidth,nHeight);
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&bmp);
m_pPicture->Render(MemDC.m_hDC,0,0,nWidth,nHeight,0,hmHeight,hmWidth,-hmHeight,NULL);
//到此为止已经把图象画在内存dc上了
//剩下就是copy到显示dc上了,可以BitbBlt直接copy,也可以用StretchBlt缩放copy
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
}
return true;
}
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CString filename;
filename = "ye.bmp";//绝对路径,图像在工程目录下
DrawFormFile(filename,&dc);
CDialog::OnPaint();
}
}
void ShowPic(CDC *pDC,UINT nID,int sx,int sy,int nScrWidth, int nScrHeight)
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),_T("JPG")); // type
if (!hRsrc)
return;
// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
return;
IPicture *pPic = NULL;
IStream *pStm = NULL;
//分配全局存储空间
HGLOBAL hGlobal=GlobalAlloc(GMEM_FIXED,len);
if(hGlobal==NULL)
return;
BYTE* pvData = (BYTE*)GlobalLock(hGlobal);
if(pvData==NULL)//锁定分配内存块
{
GlobalFree(hGlobal);
return;
}
memcpy(pvData,lpRsrc,len);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
//装入图形文件
OleLoadPicture(pStm,len,TRUE,IID_IPicture,(LPVOID*)&pPic);
pStm->Release();
pStm = NULL;
GlobalFree(hGlobal);
if(NULL == pPic)return;
long hmWidth;//图片的真实宽度
long hmHeight;//图片的真实高度
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
//将图形输出到屏幕上(有点像BitBlt)
pPic->Render(pDC->m_hDC,sx,sy,nScrWidth,nScrHeight,0,hmHeight,hmWidth,-hmHeight,NULL);
pPic->Release();
}
调用的时候
CPaintDC dc(this);
ShowPic(&dc,IDR_JPG1,0,0,300,300);
class CPicture
{
public:
CPicture();
virtual ~CPicture();
public:
void Show(CDC *pDC, int xSrc, int ySrc, int wSrc, int hSrc);
BOOL LoadPicture(LPCTSTR lpFileName);
void Release();
private:
IPicture * m_Pic;//如果这里用链表,还可以保存多张图片,实现GIF等效果就方便了
};
至于显示,直接多加几种显示方式,比如带半透明等基本不废吹灰之力
如果你有闲工夫;再改造一下
装载到IPicture 的方法更进一步,直接装载到DDC位图和内存DC,就更成熟了
class CPicture
{
public:
CPicture();
virtual ~CPicture();
public:
void Show(CDC *pDC, int xSrc, int ySrc, int wSrc, int hSrc);
BOOL LoadPicture(LPCTSTR lpFileName);
void InitDC(CDC *pDC,int w, int h);
void Release();
private:
CDC *xDC;
CBitmap *xBMP;
};
void CPicture::InitDC(CDC *pDC,int w, int h)
{
xDC=创建兼容DC(pDC);
xBMP=创建兼容位图(pDC,w,h);
xDC->选择对象(xBMP);
}
那么,显示方法可以用Bltbit等直接实现,半透明,缩放等就更好控制了
在窗口初始话的地方InitDC(GetDC(),w,h),并LoadPicture
剩下显示就可以了[/quote]
哥你高估我了,我喜欢收集好的实现,然后需要的时候直接用,较少像你这样去研究
多多休息啊,熬夜这么晚还在搞技术?class CPicture
{
public:
CPicture();
virtual ~CPicture();
public:
void Show(CDC *pDC, int xSrc, int ySrc, int wSrc, int hSrc);
BOOL LoadPicture(LPCTSTR lpFileName);
void Release();
private:
IPicture * m_Pic;//如果这里用链表,还可以保存多张图片,实现GIF等效果就方便了
};
class CPicture
{
public:
CPicture();
virtual ~CPicture();
public:
void Show(CDC *pDC, int xSrc, int ySrc, int wSrc, int hSrc);
BOOL LoadPicture(LPCTSTR lpFileName);
void InitDC(CDC *pDC,int w, int h);
void Release();
private:
CDC *xDC;
CBitmap *xBMP;
};
void CPicture::InitDC(CDC *pDC,int w, int h)
{
xDC=创建兼容DC(pDC);
xBMP=创建兼容位图(pDC,w,h);
xDC->选择对象(xBMP);
}
那么,显示方法可以用Bltbit等直接实现,半透明,缩放等就更好控制了