Visual c++ 帮助更正确地重组我的文档/视图

Visual c++ 帮助更正确地重组我的文档/视图,visual-c++,mfc,docview,Visual C++,Mfc,Docview,由OP编辑。 我的计划需要大量的清理和重组 在另一篇帖子中,我询问了关于离开MFC DocView框架,转到WinProc&Message循环方式的问题(简称什么?)。目前,我在想,我应该清理我在Doc视图中的内容,也许以后会转换为非MFC,这甚至是有意义的。我的文档类目前几乎没有任何有用的内容 我认为应该从InitInstance()函数开始(发布在下面)。 在本部分: POSITION pos=pDocTemplate->GetFirstDocPosition(); CLCWDoc *

由OP编辑。
我的计划需要大量的清理和重组

在另一篇帖子中,我询问了关于离开MFC DocView框架,转到WinProc&Message循环方式的问题(简称什么?)。目前,我在想,我应该清理我在Doc视图中的内容,也许以后会转换为非MFC,这甚至是有意义的。我的文档类目前几乎没有任何有用的内容

我认为应该从InitInstance()函数开始(发布在下面)。
在本部分:

POSITION pos=pDocTemplate->GetFirstDocPosition();
CLCWDoc *pDoc=(CLCWDoc *)pDocTemplate->GetNextDoc(pos);
ASSERT_VALID(pDoc);
POSITION vpos=pDoc->GetFirstViewPosition();
CChildView *pCV=(CChildView *)pDoc->GetNextView(vpos);
这对我来说似乎很奇怪。我只有一个文档和一个视图。我觉得我是在用GetNextDoc()和GetNextView()反向操作。试图用一个愚蠢的比喻;就像我手里拿着一本书,但我必须查一下它的索引,找出书名在哪一页。我厌倦了对我的代码感到尴尬。我要么需要纠正,要么需要保证,要么两者都需要。:)

此外,所有杂项项目都没有特定顺序。我想把它们重新排列成一个更标准、更结构化或更直接的顺序

欢迎大家提出建议

BOOL CLCWApp::InitInstance()
{
 InitCommonControls();
 if(!AfxOleInit())
  return FALSE;

    // Initialize the Toolbar dll. (Toolbar code by Nikolay Denisov.)
 InitGuiLibDLL(); // NOTE: insert GuiLib.dll into the resource chain

 SetRegistryKey(_T("Real Name Removed"));

 // Register document templates
 CSingleDocTemplate* pDocTemplate;
 pDocTemplate = new CSingleDocTemplate(
  IDR_MAINFRAME,
  RUNTIME_CLASS(CLCWDoc),
  RUNTIME_CLASS(CMainFrame),
  RUNTIME_CLASS(CChildView));
 AddDocTemplate(pDocTemplate);

 // Parse command line for standard shell commands, DDE, file open
 CCmdLineInfo cmdInfo;
 ParseCommandLine(cmdInfo);

 // Dispatch commands specified on the command line
 // The window frame appears on the screen in here.
 if (!ProcessShellCommand(cmdInfo))
 {
  AfxMessageBox("Failure processing Command Line");
  return FALSE;
 }

 POSITION pos=pDocTemplate->GetFirstDocPosition();
 CLCWDoc *pDoc=(CLCWDoc *)pDocTemplate->GetNextDoc(pos);
 ASSERT_VALID(pDoc);
 POSITION vpos=pDoc->GetFirstViewPosition();
 CChildView *pCV=(CChildView *)pDoc->GetNextView(vpos);
 if(!cmdInfo.m_Fn1.IsEmpty() && !cmdInfo.m_Fn2.IsEmpty())
 {
  pCV->OpenF1(cmdInfo.m_Fn1);
  pCV->OpenF2(cmdInfo.m_Fn2);
  pCV->DoCompare(); // Sends a paint message when complete
 }
 // enable file manager drag/drop and DDE Execute open
 m_pMainWnd->DragAcceptFiles(TRUE);

 m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
 m_pMainWnd->UpdateWindow(); // paints the window background

 pCV->bDoSize=true; //Prevent a dozen useless size calculations

 return TRUE;
}

谢谢

在不知道你的程序应该做什么的情况下,很难给你提供好的建议。我只有几点一般性意见:

  • 你的
    InitInstance
    在我看来并不是很糟糕。它非常标准,有一点自定义代码
  • 另外,从应用程序类(GetDocTemplate->GetDoc->GetView)检索第一个视图的难看构造也是我所知的标准。我真的不知道另一种方法。您可能会考虑将其移动到一个单独的方法中,如
    CChildView*CLCWApp::GetFirstView()
    ,但是,只要您只在一个地方需要它,这只是一种装饰
如果您只有一个视图,那么您在做什么以及在文档类和视图类中放置哪些数据更像是一个语义问题。(无论如何,您只有一个文档,因为它是SDI应用程序。)。从技术角度来看,这两种方法通常都是可行的。 但为了(可能)在以后扩展到多个视图,并遵循文档/视图体系结构的标准模式,有一些经验法则:

  • 存在并具有独立于显示和查看方式的含义的数据(文档文件、数据库句柄等)属于文档类。我不知道你的
    pCV->OpenF1(cmdInfo.m_Fn1)是什么。。。以此类推
    确实如此,但如果它是一个文件或文件名或一个用于以任何方式访问数据的参数,
    OpenF1
    可能是文档类的一个更好的方法
  • 对基础数据进行任何类型的数据处理或修改的方法也属于document类
  • 仅以特定方式显示文档所需的数据和方法属于视图类(例如,选定的字体、颜色等)
  • 另一方面:如果有固定数量的视图随文档一起打开,则将视图特定的数据放入文档中可能不会有错,尤其是如果您希望持久化这些视图参数。例如,一个包含一些统计数据的文件(您的文档)和一个包含两个视图的拆分框架:一个视图将数据显示为网格表,另一个视图显示为饼图。例如,表格中有描述列顺序和宽度的“视图数据”,饼图中有配置饼图颜色和图例位置的数据。如果要确保用户在打开文档文件时显示最后一个视图配置,则必须将这些视图参数存储在某个位置。在我看来,将这些参数也存储在文档中,从任何永久存储中存储和检索它们,即使您只在视图类中需要它们,也不会是错误或糟糕的设计
  • 如果您的应用程序允许动态打开文档的无限多个视图,并且这些视图在应用程序运行时只是临时的,那么将所有视图配置参数直接存储在视图类中对我来说似乎更自然。否则,在文档中,您将需要管理任何类型的动态数据结构,并在此数据结构中的视图和条目(数组中的索引或映射中的键等)之间建立关系
  • 如果您不确定是否要在document或view类中放置任何数据,我会选择document,因为view类中始终有easy
    GetDocument()
    accessor来检索文档的成员或调用方法。要将数据从视图中提取到文档中,需要遍历视图列表。(请记住:文档视图是1-n关系,即使在SDI应用程序中也是如此。)

只要几美分。

如果不知道你的程序应该做什么,很难给你好的建议。我只有几点一般性意见:

  • 你的
    InitInstance
    在我看来并不是很糟糕。它非常标准,有一点自定义代码
  • 另外,从应用程序类(GetDocTemplate->GetDoc->GetView)检索第一个视图的难看构造也是我所知的标准。我真的不知道另一种方法。您可能会考虑将其移动到一个单独的方法中,如
    CChildView*CLCWApp::GetFirstView()
    ,但是,只要您只在一个地方需要它,这只是一种装饰
如果您只有一个视图,那么您在做什么以及在文档类和视图类中放置哪些数据更像是一个语义问题。(无论如何,您只有一个文档,因为它是SDI应用程序。)。从技术角度来看,这两种方法通常都是可行的。 但为了(可能)在以后扩展到多个视图,并遵循文档/视图体系结构的标准模式,有一些经验法则:

  • 数据w