如何快速的在CScrollView中显示jpg图片

level1979 2005-07-21 10:30:54
rt
在这个论坛找到了显示jpg文件的帖子,不过显示的速度实在太慢了,一张7xxK的文件刷新要3~5秒。就算把文件读取改到OnUpdate之外也一样。这是什么问题?

图片的大小:759K
尺寸:3732*4380
显示程序:
CRightView::CRightView()
{
if (file.Open("map.jpg",CFile::modeRead)
&& file.GetStatus("map.jpg", fstatus)
&& ((cb = fstatus.m_size) != -1))
{
hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
pvData = NULL;
}
}
void CRightView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: 在此添加绘制代码
ASSERT_VALID(pDoc);
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.Read(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
}
}
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID* )&pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;

pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);

double fX,fY;
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
pPic->Release();
}
else
AfxMessageBox("Error Loading Picture From Stream!");
}
部分定义如下:
public:
IPicture *pPic;
IStream *pStm;

CFileStatus fstatus;
CFile file;
LONG cb;
HGLOBAL hGlobal;
LPVOID pvData;
protected:
CFile f_map;
...全文
240 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
level1979 2005-07-25
  • 打赏
  • 举报
回复
问题解决了,使用了一个封装了IPicture控件类
level1979 2005-07-22
  • 打赏
  • 举报
回复
up
一条晚起的虫 2005-07-21
  • 打赏
  • 举报
回复
可能是你使用的jpg2bmp的效率低,使用一下其它的库,比如GDI+,IPicture之类的
Hopping 2005-07-21
  • 打赏
  • 举报
回复
你直接用GDI+不就行了嘛
level1979 2005-07-21
  • 打赏
  • 举报
回复
我现在就是把图片载入放到了构造函数里面,应该只要读盘一次就可以了,可是现在刷新客户区的时候很慢(但是没有读盘)不知道为什么。
我是第一次接触vc图片方面的编程。能不能请大家给个快速显示图片的 简单的例子,先谢谢了
蒋晟 2005-07-21
  • 打赏
  • 举报
回复
不会吧,每次画的时候重新从磁盘读?载入之后每次使用载入之后的picture对象画出来就行了
//以下假设你已经配置好VC6的GDI+环境 1.新建一个基于CScrollView的单文档程序, 2.在stdafx.h内添加如下代码: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(lib,"gdiplus.lib") 3.在GdiApp.h里的CGdiAppApp加入两个成员: GdiplusStartupInput m_gdiplusStartupInput;// ULONG_PTR m_pGdiToken;// 4.在GdiApp.cpp的CGdiAppApp构造函数CGdiAppApp()添加如下代码: GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);// 5.在GdiApp.h里给CGdiAppApp添加一个析构函数~CGdiAppApp(); 6.在GdiApp.cpp添加CGdiAppApp的析构函数~CGdiAppApp(): CGdiAppApp::~CGdiAppApp()// { GdiplusShutdown(m_pGdiToken);// } 7.在GdiAppView.h的CGdiAppView添加成员变量: Bitmap* m_pbmp; 并在GdiAppView.cpp的GdiAppView构造函数和析构函数添加如下代码: CGdiAppView::CGdiAppView():m_pbmp(0)// { // TODO: add construction code here } CGdiAppView::~CGdiAppView() { delete m_pbmp;// m_pbmp=0;// } 8.按Ctrl+W,在弹出的对话框里选择Message Maps选项卡 class name选择CGdiAppView Object IDs里选ID_FILE_OPEN 然后在Message里双击COMMAND 弹出的对话框选择Ok 这时会在Member functions:里多出一条刚添加进去的消息映射函数 双击它会自动跳转进入GdiAppView.cpp的void CGdiAppView::OnFileOpen()函数处 然后添加如下代码: void CGdiAppView::OnFileOpen() { //见源码处 } 9.为了使8处代码有用,还需要: 在GdiAppView.h里添加两个函数声明: int A2U(const char* szA,wchar_t* szU,size_t cnt);// std::wstring A2U(const char* szA);// 并#include 然后在GdiAppView.cpp里加入这两个函数的实现 10.在GdiAppView.cpp的OnDraw函数添加显示代码: void CGdiAppView::OnDraw(CDC* pDC) { //见源码处 } 11.结束.有问题联系hastings1986@163.com //可能你Debug版本编译不过,则打开Gdi+的头文件GdiPlusBase.h //并修改为如下(其实就加了两个重载版本的new和delete): #ifndef _GDIPLUSBASE_H #define _GDIPLUSBASE_H class GdiplusBase { public: void (operator delete)(void* in_pVoid) { DllExports::GdipFree(in_pVoid); } void* (operator new)(size_t in_size) { return DllExports::GdipAlloc(in_size); } void (operator delete[])(void* in_pVoid) { DllExports::GdipFree(in_pVoid); } void* (operator new[])(size_t in_size) { return DllExports::GdipAlloc(in_size); } //////////////////////////////// void* (operator new)(size_t in_size,

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧