帮助更正确地重新构建我的Doc / View

时间:2010-03-23 00:10:58

标签: visual-c++ mfc docview

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

在另一篇文章中,我询问了如何离开MFC DocView框架并转到WinProc&消息循环方式(简称为什么?)。那么目前我在想我应该清理Doc View中的内容,以后可能转换为非MFC甚至是有意义的。我的Document类目前几乎没有任何用处。

我认为一个开始的地方是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;
}

由于

1 个答案:

答案 0 :(得分:5)

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

  • 你的InitInstance看起来并不是很混乱。它的标准配置包括一些自定义代码。
  • 从我的知识来看,从应用程序类(链GetDocTemplate - > GetDoc - > GetView)检索第一个视图的丑陋构造也是标准的。我实际上不知道另一种方式。您可能会考虑将其移至一个单独的方法,例如CChildView* CLCWApp::GetFirstView(),但是,只要您只在一个地方需要它,这只是化妆品。

如果您只有一个视图,那么您正在做什么以及您在Document类和View类中放置哪些数据更像是一个语义问题。 (无论如何,你只有一个文档,因为它是一个SDI应用程序。)。从技术角度来看,两者都是可能的。 但要开放(可能)以后扩展到多个视图并遵循文档/视图架构的标准模式,有一些经验法则:

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

只需几美分。