图像重叠显示时的刷新闪动问题

bluemoona 2007-10-28 03:35:10
我编了一个多文档界面,以DIB形式打开图像并在文档里显示。但是当我打开两三幅图像后,这几幅图像交叉重叠着的时候,就会出现剧烈闪动现象,标题栏里不断闪烁着这几幅图像的名字,有时还会像死机一样!不知是为什么?
另外我想问的是,我见过别人在视类里添加了对话框界面和滚动条等资源,还给每个控件定义了控件变量。我试了几次都不能在我现有程序的视类里加上,他们是怎么加的呢?
...全文
375 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluemoona 2007-11-05
  • 打赏
  • 举报
回复
我的问题解决了!我设了个标志变量只在打开图像时设置窗口大小,其他时候不管,闪动没有了。还是谢谢大家的参与,我很高兴问题终于解决了!
菜牛 2007-11-02
  • 打赏
  • 举报
回复
应该是你有些特别的代码,最好检查一下发些代码看看,或者发到我的信箱:Mackz@sina.com
bluemoona 2007-11-02
  • 打赏
  • 举报
回复
顺便说明一下,m_hDIB是我打开的图像文件的句柄。
bluemoona 2007-11-02
  • 打赏
  • 举报
回复
我检查了代码,你说的没错,的确是我写的问题。我为了让图像打开时文档就是图像的大小。所以在视类的OnDraw里加了下面一句来重置窗口大小。
GetParentFrame()->SetWindowPos(&wndTop, 0, 0, width, height, SWP_NOMOVE);
我想可能是我一拖动图像,多幅图像都一起刷新,也就是多幅图像都在重置和重画窗口!
但是我要限制图像显示窗口的大小又不会闪动该怎么办呢?呜呜,终于找到原因了,感动的不行!
我的代码如下:
void CMYView::OnDraw(CDC* pDC)
{
//显示等待光标
BeginWaitCursor();
//获取文档对象
CGeneralTestBenchDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获取DIB
HDIB hDIB=pDoc->GetHDIB();
//判断DIB是否为空
if(hDIB!=NULL)
{
LPSTR lpDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
int cxDIB=(int)::DIBWidth(lpDIB);
int cyDIB=(int)::DIBHeight(lpDIB);
int width = 360;
int height = 140;
::GlobalUnlock((HGLOBAL)hDIB);
//定义DIB图像矩形区域
CRect rcDIB,ClientRect,WindowRect;
rcDIB.top=rcDIB.left=0;
rcDIB.right=cxDIB;
rcDIB.bottom=cyDIB;
GetParentFrame()->GetWindowRect(WindowRect);
GetClientRect(ClientRect);
//定义打印输出设备的图像矩形区域
CRect rcDest;
rcDest=rcDIB;
width=(WindowRect.Width() - ClientRect.Width() + cxDIB);
height=(WindowRect.Height() - ClientRect.Height() +cyDIB);

//就是这句代码,呜呜...困惑了我这么长时间
GetParentFrame()->SetWindowPos(&wndTop, 0, 0, width, height, SWP_NOMOVE);********
//输出DIB
::PaintDIB(pDC->m_hDC, &rcDest, pDoc->GetHDIB(),
&rcDIB, pDoc->GetDocPalette());
// pDC->BitBlt(rcDest.left,rcDest.top,cxDIB, cyDIB,&memDC, 0, 0, SRCCOPY );
}
//恢复正常光标
EndWaitCursor();
......
}
bluemoona 2007-11-01
  • 打赏
  • 举报
回复
我发现在主框架下显示多幅图像(即打开多个文档)时,当我拖动一幅图像(文档)从另一幅图像(文档)上面经过,就会出现两幅图像交替显示的现象(拖动时),如果有三幅图像重叠就有三幅图像交替闪动,看别人的程序也没发现有这种情况,不知是我什么地方有问题!
bluemoona 2007-11-01
  • 打赏
  • 举报
回复
的确是一个视图显示一幅图像,一个图像就是一个文档。
菜牛 2007-11-01
  • 打赏
  • 举报
回复
不明白你的意思,你是不是一个视图显示一幅图片?
bluemoona 2007-10-31
  • 打赏
  • 举报
回复
双缓冲的资料我也查过,不过多个视类对象同时显示,我在哪写他们的双缓冲代码呢!有点晕!希望你尽快尝试成功,我也借鉴借鉴!这个问题困扰我很久了,我现在只能忽视这一点写其他部分代码。不过总要解决的啊!
charleslove 2007-10-30
  • 打赏
  • 举报
回复
用双缓冲,具体的到网络上搜下就有.我也在尝试呢
WM_EARSEBKGND 返回TRUE,应该是和双缓冲搭配用吧
bluemoona 2007-10-30
  • 打赏
  • 举报
回复
用WM_EARSEBKGND 怎么返回TRUE啊,他不是有一个默认的返回语句吗?我试了不行!
bluemoona 2007-10-29
  • 打赏
  • 举报
回复
载入图象或移动图像时都应该刷新啊!我试着在PreCreateWindow里设置窗口的WS_CLIPSIBLINGS和WS_CLIPCHILDREN属性,也没效果。
不过,我发现当我拖动一幅图像从另外一幅图像上经过时,就会有两幅图像交替显示的现象,不知是我哪个参数没设置好?

关于那个视类里的资源,是我看到一个采集卡的例子,它把图像缓存和显示分别做成控件,在文档类里使用图像缓存控件,在视类里使用图像显示控件。而且它的程序*view.h里有如下段:
//AFX_DATA
enum{IDD=IDD_DOCUMENT_DLG};
CTATIC m_Message;
CScrollBar m_VScroll;
CScrollBar m_HScroll;
CDISPLAY m_Display;
....
//AFX_DATA

*view.cpp里有如下代码:
//AFX_DATA_MAP
DDX_CONTROL(pDX,IDC_MESSAGE,m_Message);
DDX_CONTROL(pDX,IDC_VSCROLLBAR,m_VScroll);
DDX_CONTROL(pDX,IDC_HSCROLLBAR,m_HScroll);
DDX_CONTROL(pDX,IDC_DISPLAY,m_Display1);
....
//AFX_DATA_MAP
其他我再找不出关于这个对话框资源的什么痕迹来,找到那个对话框资源,按右键选ClassWizard,也弹出是否生成新类的对话框。但在ClassWizard的视类里明显有这些资源和变量设置。所以,我很迷惑,他怎么把资源加到视类里的?
不知我说明白了吗,本人还是初涉VC领域,盼望大家的帮忙,不胜感激!

youyifang 2007-10-29
  • 打赏
  • 举报
回复
响应WM_EARSEBKGND 消息,返回true就可以了,我从书上看的,不知道对你的那个情况适不适用,试试看。
redleafe 2007-10-28
  • 打赏
  • 举报
回复
你是不是每次载入一幅图后都全部刷新视图?控制你的刷新区域,减少无用刷新,可能会好点。
视图类添加了添加了对话框界面和滚动条等资源?不是很明白,你是不是看到的是用类似于BCG的接面包生成的Dock窗口呀?
你查查BCG,应该会明白一些,至少会把问题描述的详细些才能解决。

15,978

社区成员

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

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