请教VC++基于对话框的图片浏览器的全屏问题

chidu001 2008-12-16 03:31:40
  友情各位高位出出招  我用vc++设计了一个基于对话框的图片浏览的播放器  但是在全屏的情况下会出现问题,即在浏览过程中选中全屏时仅仅是对话框进行了全屏 图片就被隐藏了 再次点击下一张时就可以实现全屏浏览的功能 请问是什么原因 谢谢各位高手了!
代码如下:
void CPhoto::OnPhotoNext()
{

if( (++pos) == strpath.end() )
{
pos--;

CString str;
str.LoadString(IDS_PHOTO_NEXT);
MessageBox(str);
}
else
{

m_sPath = (*pos);
Paint(); //画图函数
}
}
void CPhoto::OnPhotoAhead()
{

if( pos == strpath.begin() )
{

CString str;
str.LoadString(IDS_PHOTO_AHEAD);
MessageBox(str);

}
else
{
pos--;
m_sPath = (*pos);
Paint(); //画图函数
}
}
void CPhoto::OnPhotoFullstr() : Paint()
{

this->ShowWindow(SW_SHOWMAXIMIZED);
Invalidate();
}
void CPhoto::Paint()
{

IStream *pStm; //指向包含有图像数据的流的指针
IPicture *pPic;
CFileStatus fstatus;
CFile file; //创建文件对象
LONG cb; //从流中读取的字节数

////////////////////////////////////////////////////////////////////////////////////////
/////打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中

if(file.Open(m_sPath,CFile::modeRead)&&file.GetStatus(m_sPath,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);
}
}
}
///////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////
/////调用OleLoadPicture函数从流中装载图像并绘图

if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{
//设置渲染图像用的设备环境句柄

CWnd* pWnd = GetDlgItem(IDC_PHOTO_VIEW); //得到一个指向Picture控件的句柄

CDC *pDC = pWnd->GetDC(); //转化成CDC类型的

CRect rc;


OLE_XSIZE_HIMETRIC hmWidth; //在源图像上水平拷贝的数量
OLE_YSIZE_HIMETRIC hmHeight; //在源图像上垂直拷贝的数量

pPic->get_Height(&hmHeight);
pPic->get_Width(&hmWidth);
GetDlgItem(IDC_PHOTO_VIEW)->GetWindowRect(&rc);

int nWidth,nHeight;
nWidth = rc.Width();
nHeight = rc.Height();
HRESULT hr = pPic->Render(pDC->m_hDC,nWidth,0,-nWidth,nHeight,hmWidth,hmHeight,-hmWidth,-hmHeight,&rc);

pPic->Release();

}
//////////////////////////////////////////////////////////////////////////////////

}


void CPhoto::SetPath(CString *spath, int count)
{
m_strPath=spath;
for(int i=0;i<count;i++)
{
strpath.push_back(m_strPath[i]);
}
m_iPhoCount=count;
if(strpath.empty()==FALSE)
{

m_sPath=m_strPath[0];
Paint();
}

}
...全文
219 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
a254060992 2012-03-25
  • 打赏
  • 举报
回复
楼主能把代码分享下吗 我在页在做 但是上一张下一张的代码没有实现 我QQ512868516 有时间的话可以给我发下
yanhui8610 2011-08-26
  • 打赏
  • 举报
回复
学习下,楼主能提供代码嘛?正在学习这个东西
chidu001 2008-12-17
  • 打赏
  • 举报
回复
把Paint()函数写到CPhoto类的OnPaint里面去;
这个方法管用呢 谢谢拉

麻烦再问一个问题啊 就是我的图片播放是把路径存到一个列表容器里的,第一次从数据库读取信息播放时是没有问题的,但是再次选中几项播放时不会把原来的删除,这个怎么办呢?列表容器什么的我之前都没有接触过,麻烦你了
ndchenxiaofeng 2008-12-16
  • 打赏
  • 举报
回复
up
xiewhenwe 2008-12-16
  • 打赏
  • 举报
回复
UP
Tinary3v0 2008-12-16
  • 打赏
  • 举报
回复
没有很看懂楼主的意思 大致了解了一点

void CPhoto::OnPhotoFullstr()
{
this->ShowWindow(SW_SHOWMAXIMIZED);
Invalidate();
}


楼主上面这个代码是要做什么啊?楼主的意思是不是这样?:
void CPhoto::OnPhotoFullstr()
{
Paint();
this->ShowWindow(SW_SHOWMAXIMIZED);
Invalidate();
}

你首先使用Paint()绘制了Picture控件 然后你最大化窗口 再刷新了一下窗口

如果改成:
void CPhoto::OnPhotoFullstr()
{
this->ShowWindow(SW_SHOWMAXIMIZED);
Invalidate();
Paint();
}

也许就能解决问题了。

楼主好多的地方都在用invalidate 其实按照正常的绘图程序 只要invalidate就可以更新视图了
楼主这里invalidate不管用 主要是因为楼主没有在窗口的OnPaint中写绘图代码的缘故。

所以建议楼主把Paint()函数写到CPhoto类的OnPaint里面去;
也可以继承CPicture类写一个自己的新类,在这个新类当中响应Picture控件的OnPaint 把你现在Paint()函数当中的内容移动到
它的里面去。

chidu001 2008-12-16
  • 打赏
  • 举报
回复
没有这个函数啊 能不能帮忙查一下啊 谢谢啦
「已注销」 2008-12-16
  • 打赏
  • 举报
回复
CPhoto::OnPhotoNext() 在这些操作中更新视区,INVAILWINDOWRECT吧,去搜搜这个函数,我记不清了
chidu001 2008-12-16
  • 打赏
  • 举报
回复
你别只是顶啊 帮忙想下办法啊 我在做项目实训 急得要死了。。。。。
qap22 2008-12-16
  • 打赏
  • 举报
回复
ding

19,466

社区成员

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

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