首页 > 解决方案 > 如何在 SDI 应用程序的视图中插入多个 FormView

问题描述


我在论坛上搜索并没有找到解决我的问题的方法。所以我希望你能帮助我:)
我从事一个用于 SFC 设计(顺序功能图)的个人项目,我正在 SDI 中使用 Visual Studio(我正在使用 MFC 库)。
如果您看到 SFC 的“设计”,您可以看到组成它所需的不同元素。因此,您可以找到 Step、Transition 等。
如果我采取一个步骤来解释我的问题,双击该步骤后会打开一个弹出对话框,其中包含定义此步骤的元素(此步骤的操作等)。问题就在这里,我不能同时看到两个或多个步骤元素。我想在其他软件上重用现有的概念,看这个。
步骤关闭
步骤打开
对话框添加

我的问题是,如何在大型机中实现与我的图形元素的对话框(在这种情况下,是一个步骤)?
我不知道如何用我的元素插入对话框,我想我需要使用 CFormView,但我不知道。
此对话框需要调整大小并直接按步骤图形缩小。任何想法?

先感谢您!对不起我的英语不好 ..

抱歉,我认为我的要求不清楚..(谢谢您的回答)
上下文,它是一个具有文档/视图架构的 SDI 应用程序。实际上视图是从 CScrollView 派生的。因此,在文档类中,您拥有用于制作 SFC 的不同组件列表(步骤、转换和符号 ..)。我今天在 Step 元素上工作。用户插入一个新步骤,该步骤在视图上绘制如下:
在此处输入图像描述

现在用户想要更改此步骤上的事件,为此,双击该步骤后,事件编辑器将在步骤绘制的右侧打开,如下所示:
在此处输入图像描述

为此,我创建了一个新的对话框资源并通过 CForwView 派生类中的向导创建类。在步骤属性中,您可以找到该派生类的一个实例(对话框的派生类)。

但这不能正常工作,我认为我的方法很糟糕。在第一次尝试时,我已将当前文档的指针发送到“CFormView::Create”函数,以激活“保存”按钮,并将焦点放在 FormView 上。但是在销毁该步骤后,FormView 的实例被销毁并且带有 formview 实例的文档......

没问题,您可以在 CCreateContext 中使用“创建”一个空指针。但是有没有这个文件我有很多问题(FormView中的图形设计不正确,经常(不系统我在Proc交换上断言失败(出于不同的原因))。但是“概念”很好,编辑遵循如果我滚动,我可以随时在任何元素上打开或关闭编辑器。

对于旧捕获,它是我的 SFC 设计师“模型”。我的应用程序是对这个应用程序的补充,所以我想要一个类似的设计。我不知道我的模型应用程序是如何工作的。在我的应用程序上,所有内容都是由 MFC GDI 绘制的,我不使用 ActiveX 或其他工具。

那么通过 step 实例实现一个编辑器实例的正确方法是什么?

对于这个 FormView 的实现,我有:
- 在资源中创建新对话框
- 使用创建的对话框创建 CFormView 的派生类
- 在 Step 元素的属性中添加一个实例
- “OnDbClickOnStep” -> 以良好的位置调用“创建”/大小,主视图指针(在我的情况下是 CSrollView 派生类)
- 完成,FormView 插入主视图,我可以编辑我的步骤事件。
? 没有完成,我丢失了保存按钮和其他链接到文档的功能,重点放在 FormView 中的一个控件上。该应用程序想要一个具有此视图的文档,如何覆盖它?
? Proc交换中的错误,出于不同的原因......

你有想法吗?

标签: c++visual-c++mfcdialogmain

解决方案


您通常不会在“主框架”(或“MDI clild 框架”,在 MDI 应用程序的情况下)中绘制任何内容,这是由库完成的,而且 imo 也足够了。CView您在派生类中显示您的数据。

CView是所有其他 MFC 视图类的基类。这是一个简单的图形类 - 你需要自己在OnDraw()成员中绘制它。

CScrollView是 的后代CView,添加滚动功能(如果可滚动区域大于可见窗口区域,则会自动显示滚动条)。

CFormView是 的后代CScrollView,显示一个对话框资源脚本,包含“控件”(编辑框、复选框、图像、ActiveX 等)。

在您的情况下,“控件”最初不会是已知的(可能除了一些特殊情况)而是以编程方式创建的,资源脚本很可能是空的,因此使用其中一个CFormViewCScrollView基本上是相同的。我建议从 开始CFormView,然后将其“降级”到CScrollView如果CFormView没有必要或给您带来麻烦。

图片中显示的那些“步骤”项目是什么?ActiveX 控件,子对话框可能吗?这些最适合作为对话窗口上的子控件。它们是否已经实现,或者它们只是其他一些软件的图片?BtwActiveX是一种定义控件的方法,该控件也可以在其他项目中使用,而不必将它们包含在项目源中。


推荐阅读