请大家帮忙看看这两个问题如何解决

xiaohyy 2002-07-14 09:09:32

1。我在滚动视图中显示jpeg,当拖动滚动条时,屏幕闪烁很厉害,我的做法是在视图中的ondraw函数中显示图象,这样速度很慢,闪烁也很厉害,显示jpeg时可否用bitblt?
2。我切割视图需要固定切割条的位置,我的做法是从csplitterwnd类继承,但是在vc的classwizard中的new class中的base class选项中没有csplitterwnd,如果我直接建立h文件和cpp文件又行不通。

请问这两个问题如何解决?
...全文
85 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohyy 2002-07-16
  • 打赏
  • 举报
回复
显示图片的函数如下,但是没有作用,请问是什么问题?好象是hbitmap没获得值?
void CViewImageView::ShowItem()
{
IPicture *pPic;
IStream *pStm;
CDC* pDC = GetDC();
CFileStatus fstatus;
CFile file;
LONG cb;

if (file.Open("item.gif",CFile::modeRead)&&file.GetStatus("item.gif",fstatus)&& ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);

if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
OLE_HANDLE phandle;
HRESULT hr = pPic->get_Handle(&phandle);
HBITMAP hBitmap;
if(!SUCCEEDED(hr)) return;
hBitmap = (HBITMAP)CopyImage(&phandle,IMAGE_BITMAP,100,130,LR_COPYDELETEORG);
HBITMAP OldBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
OldBitmap=(HBITMAP)MemDC.SelectObject(hBitmap);
pDC->BitBlt(0,0,100,130,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
pPic->Release();
}
else
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
else
AfxMessageBox("Can't Open Image File!");
}
mfkzj 2002-07-16
  • 打赏
  • 举报
回复
void CShowJpgView::OnDraw(CDC* pDC)
{
CShowJpgDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(m_ok==false)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open("test.jpg",CFile::modeRead)&&file.GetStatus("test.jpg",fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(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)))
double fX,fY;
fX = 640;
fY = 480;
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
// pPic->Release();
m_ok=true;
}
else
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
else
AfxMessageBox("Can't Open Image File!");
}
else
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
fX = 640;
fY = 480;
pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL);
}
// TODO: add draw code for native data here
}
mfkzj 2002-07-16
  • 打赏
  • 举报
回复
void CShowJpgView::OnDraw(CDC* pDC)
{
CShowJpgDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(m_ok==false)
{
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open("test.jpg",CFile::modeRead)&&file.GetStatus("test.jpg",fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(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)))
double fX,fY;
fX = 640;
fY = 480;
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
// pPic->Release();
m_ok=true;
}
else
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
else
AfxMessageBox("Can't Open Image File!");
}
else
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(&hmWidth);
pPic->get_Height(&hmHeight);
double fX,fY;
fX = 640;
fY = 480;
pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL);
}
// TODO: add draw code for native data here
}
xiaohyy 2002-07-15
  • 打赏
  • 举报
回复
关键是我是从数据库中读出的,是二进制数据
xiaohyy 2002-07-15
  • 打赏
  • 举报
回复
to kimryo(里叁百拾六式 豺华) :
>>fuType=LR_COPYRETURNORG
fuType是fuFlags?那uType呢?是IMAGE_BITMAP?
kimryo 2002-07-15
  • 打赏
  • 举报
回复
。。。。。。


get_Handle要有IPicture*->get_Handle三...

CopyImage的参数自己添以下.

fuType=LR_COPYRETURNORG
xiaohyy 2002-07-15
  • 打赏
  • 举报
回复
to kimryo(里叁百拾六式 豺华) :
我显示图片的代码如下:
OLE_HANDLE phandle;
HRESULT hr = get_Handle(&phandle);
HBITMAP hBitmap;
if(SUCCEEDED(hr))
hBitmap = (HBITMAP)CopyImage(phandle);
HBITMAP OldBitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
OldBitmap=(HBITMAP)MemDC.SelectObject(hBitmap);
pDC->BitBlt(0,0,100,130,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);

编译出现以上两个错误,CopyImage的原型如下:
HANDLE CopyImage(
HANDLE hImage, // handle to the image to copy
UINT uType, // type of image to copy
int cxDesired, // desired width of new image
int cyDesired, // desired height of new image
UINT fuFlags // copy flags
);
其中第二个参数呢?指定为IMAGE_BITMAP?请指教。。。
xiaohyy 2002-07-15
  • 打赏
  • 举报
回复
error C2065: 'get_Handle' : undeclared identifier
error C2660: 'CopyImage' : function does not take 1 parameters
kimryo 2002-07-15
  • 打赏
  • 举报
回复
应该是这样:

OLE_HANDLE phandle;
HRESULT hr = get_Handle(&phandle);
HBITMAP hBitmap;
if(SUCCESS(hr)) {
hBitmap = (HBITMAP)CopyImage(phandle);
}
kimryo 2002-07-15
  • 打赏
  • 举报
回复
应该是这样:

OLE_HANDLE phandle;
HRESULT hr = get_Handle(&phandle);
HBITMAP hBitmap;
if(SUCCESS(hr)) {
hBitmap = (HBITMAP)CopyImage(phandle);
}
flyingjust 2002-07-15
  • 打赏
  • 举报
回复
只重画需要刷新的区域会快一点
xiaohyy 2002-07-15
  • 打赏
  • 举报
回复
to kimryo(里叁百拾六式 豺华) :
get_Handle返回的是HRESULT值,而不是HANDLE,phandle是OLE_HANDLE
我在运行下列代码时有个warning,说phandle为初始化。请问下列代码还有什么问题?
OLE_HANDLE* phandle ;
HRESULT hr = get_Handle(phandle );
HBITMAP hBitmap;
if(SUCCESS(hr)) {
hBitmap = (HBITMAP)CopyImage(phandle);
}
kimryo 2002-07-15
  • 打赏
  • 举报
回复
hBitmap = (HBITMAP)CopyImage(phandle);


记得deleteobject
kimryo 2002-07-15
  • 打赏
  • 举报
回复
CopyImage的第一个参数HANDLE hImage又如何得到???


你前面get_Handle是干什么吃的??
xiaohyy 2002-07-15
  • 打赏
  • 举报
回复
Thank webber84(糕鱼昏) !这个问题已经解决,谢谢!!
webber84 2002-07-15
  • 打赏
  • 举报
回复
关于第二个问题,你只要从generic CWnd派生,然后把CWnd改成CSplitterWnd就行了.我记得要改两个地方,一个是类定义的时候:public CSplitterWnd;另一个是
BEGIN_MESSAGE_MAP(..,CSplitterWnd)
xiaohyy 2002-07-15
  • 打赏
  • 举报
回复
To kimryo(里叁百拾六式 豺华):
OLE_HANDLE* phandle ;
HRESULT hr = get_Handle(phandle );
HBITMAP hBitmap;
if(SUCCESS(hr)) {
hBitmap = CopyImage(........);
}

这段程序可有问题?
CopyImage的第一个参数HANDLE hImage又如何得到?请指教。。。

xiaohyy 2002-07-15
  • 打赏
  • 举报
回复
To kimryo(里叁百拾六式 豺华):
HRESULT get_Handle(
OLE_HANDLE* phandle //Receives a pointer to GDI handle
);
其中的参数phandle是一个unsign int*,该如何得到?
Crazy_Abyss 2002-07-14
  • 打赏
  • 举报
回复
数据->Blt至内存DC缓冲->窗口HDC,决不会闪烁,双缓冲,这跟游戏是一个道理
kimryo 2002-07-14
  • 打赏
  • 举报
回复
IPicture::get_Handle,再CopyImage成HBITMAP.
加载更多回复(22)

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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