本帖最后由 qq152688854 于 2011-05-18 14:45:31 编辑

解决方案 »

  1.   

    为什么要把定时器放在A中?放在A中的话,在OnTimer里给B发WM_PAINT消息不行的么?在OnTimer里面重绘B本来就是多线程模式的
      

  2.   

    放在A中,是为了保证图片连续读取,无论B是否弹出
    怎么样在OnTimer里给B发WM_PAINT消息? 
    麻烦能不能用代码写出来  我是新手,没试过向对话框发送WM,我也去查查MSDN看看。
      

  3.   

    你现在是使用的单线程,如果你在OnTimer里做会阻塞的磁盘操作,当然会让界面卡了,要解决卡的问题你就要创建个工作线程去读取图片,通过一个定长队列保存图片,工作线程往里面存,界面线程从里面取。至于队列状态的同步,可以参考各种线程通讯机制。
      

  4.   


    窗口定时器不会创建任何线程,OnTimer是窗口线程处理的
      

  5.   

    通过B对话框的CWnd*指针调用Invalidate/InvalidateRect();
      

  6.   

    大家有没遇过 对话框的重绘问题,我已经在OnPaint里调用了 Invalidate()或者 UpdateWindow(),居然没有产生重绘。
      

  7.   

    不用多线程不可能解决卡的问题,两个窗口之间发消息通讯已经是很简单的方法了
    话说你用非模态对话框,主对话框的消息循环不会停吧,定时器照样可以运作。交互数据刚才说了,也可以用一个两个窗口类都能访问到的变量。我也是这样做,数据也交换了,现在问题是 对话框B不能重绘,手动关闭B,再打开B,却能正常更换图片
      

  8.   

    同时进行啊,读取是在A,显示是在B。 A通过一个成员变量交换图片名称到B
      

  9.   

    对话框B要定时刷新的话,那就在对话框B里面再建一个定时器,只用来调用Invalidate刷新自身。
    或者对话框A有对话框B的窗口句柄的话,也可以由对话框A调用Invalidate刷新B。
    不过最好是减少耦合性,让对话框B自己去定时刷新了。
      

  10.   

    @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,都不能自动刷新窗口}
      

  11.   

    你这个A不是读取图片,是读取图片名称。
    B是既读取图片,又显示图片,还都在OnPaint里,我想一定不会快。看你的函数中有“img.LoadCstr+".jpg");”应该放在别处读。
      

  12.   

    解决了,原来不能在OnPaint里调用了 Invalidate()或者 UpdateWindow(),我在B中设置了计时器来调用 Invalidate(),完成刷新了。 谢谢各位指教:)