我现在遇到一个问题,我认为这是MFC机制无法改变的,可是我的老总上司们认为这是一个比较严重的问题,我无法解决,特来请教各位高手。
用我编写的程序打开一个数据文件后(比如文件名为abc.abc),可以在程序窗体中显示这个数据文件的内容,然后和仪器通讯改变这个窗体中的数据,不保存,不新建,仍然再打开这个文件(abc.abc),窗体中的数据为通讯后数据,不会刷新到原来文件名为abc.abc的数据文件中的数据。
请问各位高手如何解决这个问题?

解决方案 »

  1.   

    我觉得是你的程序的问题,OnOpenDocument不会有这种错误。
    我们也有象你说的这种通讯程序,没有这种问题。你不是 Doc/View程序,新建Doc会创建新的View,这个由CDocManager保证
      

  2.   

    重新打开名为abc.abc的数据文件后,要记得触发刷新窗体的消息。
      

  3.   

    请问如何触发刷新窗体的消息?使用Invalidate()好象不能实现,因为在DOC类中不能使用Invalidate()函数。
      

  4.   

    如果没有调用CDocument::SetPathName改变Document的路径的话,CDocManager::OpenDocumentFile应该保证了不会二次打开同一个文档。
    除非你重载了OnFileOpen,并没有通过CDocManager::OpenDocumentFile打开文件。
      

  5.   

    第一种方法:
    UpdateAllViews(NULL);第二种方法:找到当前View强制刷新CMDIFrameWnd *pFrame = 
                 (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;// Get the active MDI child window.
    CMDIChildWnd *pChild = 
                 (CMDIChildWnd *) pFrame->GetActiveFrame();// Get the active view attached to the active MDI child
    // window.
    CView *pView = pChild->GetActiveView();
    pView->Invalidate();
      

  6.   

    UpdateAllView(NULL);
    不好意思,打错了
      

  7.   

    不过我觉得单单UpdateAllView(NULL);
    不够,还应该在你的doc类中加入SetModifiedFlag();设置修改标记
    要不你调用UpdateView也没用的。
      

  8.   

    谢谢各位的帮助,现在我问题已经解决了,是在通讯的时候调用OnNewDocument()函数,强制刷新。但是我觉得这样不好,还是各位的方法看起来很好,呆会儿我试试看,如果凑效,所有回答问题并且挨边的朋友均有分加!
      

  9.   

    我觉得 Shawphen2000(啸峰) 问题是:
    在 OnOpenDocument 函数里没有调用基类的函数。BOOL CYourDocument::OnOpenDocument(LPCTSTR lpszPathName)
    {
      if ( ! CDocument::OnOpenDocument(lpszPathName))
        return FALSE;  // your process
    }
      

  10.   

    最后提一下吧!无论别人回答的方法能否解决你的问题,回答的人总是花了功夫,如果在你那儿试不通的话,要尽快回应,要懂得尊重人!!有时候并不是回答的人说的不对,而是问的人有更多的错误!!已经打开的文档,再打开时没用的,被CDocManager截断了。
    还有通讯时取得的数据居然不刷新文档,你这个程序有意思。通讯的时候或在第一次读完文档“abc.abc”后
    调用SetPathName(NULL); 骗过CDocManager