打开JPG格式的程序出了点有关问题,望高手指正
打开JPG格式的程序出了点问题,望高手指正?
希望在一个对话框中打开JPG格式的图片,可是打开后图片只是闪烁了一下,就没有影子了。。。。。 代码如下:
void CEndTuDlg::OnButtonOpen()
{
// TODO: Add your control notification handler code here
CString m_sPath;
CFileDialog dlg(TRUE, "jpg ", "*.jpg ",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif|| ",NULL);
if(dlg.DoModal()==IDOK)
{
m_sPath=dlg.GetPathName();
Invalidate();
}
this-> ShowPic(m_sPath,m_hWnd,250,250);
}
HRESULT CEndTuDlg::ShowPic(CString lpstrFile, HWND hWnd, int nScrWidth, int nScrHeight)
// lpstrFile:文件名(最好是包含路径在内)
// hWnd
// nScrWidth:输出图片的宽度
// nScrHeight:输出图片的高度
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸
{
HDC hDC_Temp;
hDC_Temp=::GetDC(hWnd);
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) return E_FAIL;
}
else
{
return E_FAIL;
}
//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;
if (hGlobal == NULL) return E_FAIL;
if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
return E_FAIL;
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
if(FAILED(bResult)) return E_FAIL;
OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic-> get_Width(&hmWidth);
pPic-> get_Height(&hmHeight);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic-> Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);
pPic-> Release();
CloseHandle(hFile);//关闭打开的文件
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}
------解决方案--------------------
放到OnPaint()。当然如果你不调用Invalidate(),图片也可以显示稍微长一点时间。
------解决方案--------------------
在OnPaint()中进行画图显示,打开图片的时候对数据进行保存,然后可以调用Invalidate()或者InvalidateRect()函数
------解决方案--------------------
你的问题是,在OnDraw中,不进行该图片绘制,当然成了一闪就没得效果。
你要把图片显示和图片保存区分开来。
建议如下:
1.在OPEN函数中保存图片数据到IPicture *pPic;(把它作为成员变量)。
2.在OPEN函数末尾调用Invalidate()或者FORWARD_WM_PAINT(hwnd, WM_PAINT),来进行刷屏。
3.在OnDraw中(即WM_PAINT消息的响应函数),调用pPic-> Render(hDC_Temp,0,0,nScrWidth,nScrHeight,0,hmHeight,hmWidth,-hmHeight,NULL)。
希望在一个对话框中打开JPG格式的图片,可是打开后图片只是闪烁了一下,就没有影子了。。。。。 代码如下:
void CEndTuDlg::OnButtonOpen()
{
// TODO: Add your control notification handler code here
CString m_sPath;
CFileDialog dlg(TRUE, "jpg ", "*.jpg ",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif|| ",NULL);
if(dlg.DoModal()==IDOK)
{
m_sPath=dlg.GetPathName();
Invalidate();
}
this-> ShowPic(m_sPath,m_hWnd,250,250);
}
HRESULT CEndTuDlg::ShowPic(CString lpstrFile, HWND hWnd, int nScrWidth, int nScrHeight)
// lpstrFile:文件名(最好是包含路径在内)
// hWnd
// nScrWidth:输出图片的宽度
// nScrHeight:输出图片的高度
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸
{
HDC hDC_Temp;
hDC_Temp=::GetDC(hWnd);
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) return E_FAIL;
}
else
{
return E_FAIL;
}
//分配全局存储空间
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
LPVOID pvData = NULL;
if (hGlobal == NULL) return E_FAIL;
if ((pvData = GlobalLock(hGlobal)) == NULL)//锁定分配内存块
return E_FAIL;
ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件读入内存缓冲区
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
//装入图形文件
bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
if(FAILED(bResult)) return E_FAIL;
OLE_XSIZE_HIMETRIC hmWidth;//图片的真实宽度
OLE_YSIZE_HIMETRIC hmHeight;//图片的真实高度
pPic-> get_Width(&hmWidth);
pPic-> get_Height(&hmHeight);
//将图形输出到屏幕上(有点像BitBlt)
bResult=pPic-> Render(hDC_Temp,0,0,nScrWidth,nScrHeight,
0,hmHeight,hmWidth,-hmHeight,NULL);
pPic-> Release();
CloseHandle(hFile);//关闭打开的文件
if (SUCCEEDED(bResult))
{
return S_OK;
}
else
{
return E_FAIL;
}
}
------解决方案--------------------
放到OnPaint()。当然如果你不调用Invalidate(),图片也可以显示稍微长一点时间。
------解决方案--------------------
在OnPaint()中进行画图显示,打开图片的时候对数据进行保存,然后可以调用Invalidate()或者InvalidateRect()函数
------解决方案--------------------
你的问题是,在OnDraw中,不进行该图片绘制,当然成了一闪就没得效果。
你要把图片显示和图片保存区分开来。
建议如下:
1.在OPEN函数中保存图片数据到IPicture *pPic;(把它作为成员变量)。
2.在OPEN函数末尾调用Invalidate()或者FORWARD_WM_PAINT(hwnd, WM_PAINT),来进行刷屏。
3.在OnDraw中(即WM_PAINT消息的响应函数),调用pPic-> Render(hDC_Temp,0,0,nScrWidth,nScrHeight,0,hmHeight,hmWidth,-hmHeight,NULL)。