两个对话框间数据交换问题,连续显示jpg图片 本帖最后由 qq152688854 于 2011-05-18 14:45:31 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为什么要把定时器放在A中?放在A中的话,在OnTimer里给B发WM_PAINT消息不行的么?在OnTimer里面重绘B本来就是多线程模式的 放在A中,是为了保证图片连续读取,无论B是否弹出怎么样在OnTimer里给B发WM_PAINT消息? 麻烦能不能用代码写出来 我是新手,没试过向对话框发送WM,我也去查查MSDN看看。 你现在是使用的单线程,如果你在OnTimer里做会阻塞的磁盘操作,当然会让界面卡了,要解决卡的问题你就要创建个工作线程去读取图片,通过一个定长队列保存图片,工作线程往里面存,界面线程从里面取。至于队列状态的同步,可以参考各种线程通讯机制。 窗口定时器不会创建任何线程,OnTimer是窗口线程处理的 通过B对话框的CWnd*指针调用Invalidate/InvalidateRect(); 大家有没遇过 对话框的重绘问题,我已经在OnPaint里调用了 Invalidate()或者 UpdateWindow(),居然没有产生重绘。 不用多线程不可能解决卡的问题,两个窗口之间发消息通讯已经是很简单的方法了话说你用非模态对话框,主对话框的消息循环不会停吧,定时器照样可以运作。交互数据刚才说了,也可以用一个两个窗口类都能访问到的变量。我也是这样做,数据也交换了,现在问题是 对话框B不能重绘,手动关闭B,再打开B,却能正常更换图片 同时进行啊,读取是在A,显示是在B。 A通过一个成员变量交换图片名称到B 对话框B要定时刷新的话,那就在对话框B里面再建一个定时器,只用来调用Invalidate刷新自身。或者对话框A有对话框B的窗口句柄的话,也可以由对话框A调用Invalidate刷新B。不过最好是减少耦合性,让对话框B自己去定时刷新了。 @Fireway2008//static std::string m_showstr; 图片名称void SHOWDLG::OnPaint(){ CPaintDC dc(this); // device context for painting CImage img; CString Cstr; Cstr=m_showstr.c_str(); img.Destroy(); img.Load(Cstr+".jpg"); // MessageBox(Cstr); HDC hdc = ::GetDC(m_hWnd); ::SetStretchBltMode(hdc,HALFTONE); ::SetBrushOrgEx(hdc,0,0,NULL); img.Draw(hdc,0,0); RECT rectDest,rectSource; rectSource.left = 0; rectSource.top = 0; rectSource.right = img.GetWidth(); rectSource.bottom = img.GetHeight(); GetClientRect(&rectDest); BOOL rc = img.StretchBlt(hdc,rectDest,rectSource,SRCCOPY); ::ReleaseDC(m_hWnd,hdc); Sleep(2000); //Invalidate(); UpdateWindow(); //无论是Invalidate还是UpdateWindow,都不能自动刷新窗口} 你这个A不是读取图片,是读取图片名称。B是既读取图片,又显示图片,还都在OnPaint里,我想一定不会快。看你的函数中有“img.LoadCstr+".jpg");”应该放在别处读。 解决了,原来不能在OnPaint里调用了 Invalidate()或者 UpdateWindow(),我在B中设置了计时器来调用 Invalidate(),完成刷新了。 谢谢各位指教:) VC完全打开窗口后就执行某个操作应该写在什么事件中? Gdi+绘图效率的问题! 如何让一个程序同时运行多个 大家看下偶的帖子撒,偶好有个方向!!!!! 如何解决CFile::Write ()中第一个参数与CString类型的转换问题 InstallShield For VC++两问 请教各位,关于控件的问题! 请问:一单文档工程,怎样可以一运行就开始打印? ACM中 AcmStreamConvert()是调用后立即返回,还是转换完成后返回 重要的抉择?我的走向? OnMouseWheel里面的点的问题 中、英文操作系统,程序界面上显示效果上的差异,请高手来指点。
怎么样在OnTimer里给B发WM_PAINT消息?
麻烦能不能用代码写出来 我是新手,没试过向对话框发送WM,我也去查查MSDN看看。
窗口定时器不会创建任何线程,OnTimer是窗口线程处理的
话说你用非模态对话框,主对话框的消息循环不会停吧,定时器照样可以运作。交互数据刚才说了,也可以用一个两个窗口类都能访问到的变量。我也是这样做,数据也交换了,现在问题是 对话框B不能重绘,手动关闭B,再打开B,却能正常更换图片
或者对话框A有对话框B的窗口句柄的话,也可以由对话框A调用Invalidate刷新B。
不过最好是减少耦合性,让对话框B自己去定时刷新了。
void SHOWDLG::OnPaint()
{
CPaintDC dc(this); // device context for painting CImage img;
CString Cstr;
Cstr=m_showstr.c_str();
img.Destroy();
img.Load(Cstr+".jpg");
// MessageBox(Cstr);
HDC hdc = ::GetDC(m_hWnd);
::SetStretchBltMode(hdc,HALFTONE);
::SetBrushOrgEx(hdc,0,0,NULL); img.Draw(hdc,0,0);
RECT rectDest,rectSource;
rectSource.left = 0;
rectSource.top = 0;
rectSource.right = img.GetWidth();
rectSource.bottom = img.GetHeight();
GetClientRect(&rectDest);
BOOL rc = img.StretchBlt(hdc,rectDest,rectSource,SRCCOPY);
::ReleaseDC(m_hWnd,hdc); Sleep(2000);
//Invalidate();
UpdateWindow(); //无论是Invalidate还是UpdateWindow,都不能自动刷新窗口}
B是既读取图片,又显示图片,还都在OnPaint里,我想一定不会快。看你的函数中有“img.LoadCstr+".jpg");”应该放在别处读。