模式和无模式窗体在进程外如何运转

在“显示 CoffeeManager 类的窗体”中曾谈到,由进程外部件显示的与由进程内部件显示的模式和无模式窗体同客户应用程序的窗体的关系不同。运行 CoffeeWatch 将演示这点。

注意 本主题是逐步创建 ActiveX EXE 示例过程的一部分。选择“创建 ActiveX EXE 部件”,开始本主题。

要演示进程外 Coffee 部件的模式和无模式窗体的行为,请按照以下步骤执行:

  1. 按 F5 键运行 CoffeeWatch 测试程序。

  2. 单击“显示模式窗体”,显示 Coffee 部件的模式窗体。

    由于系统配置、程序启动的顺序等原因,模式窗体也许出现在 CoffeeWatch 之前,或者会看到类似这样的东西:

  3. 相对于 CoffeeWatch 窗体,TestForm 不是真正的模式的。在 “CoffeeWatch”窗体上单击任何地方,可以看到这一点。如下所示,出现“部件要求挂起”对话框:

    对话框的出现是由于 CoffeeWatch 在等待其对 CoffeeMonitor.ShowForm 的调用,它在模式 TestForm 中等待。然而,如果 TestForm 相对于 Form1 真是模式的,则单击 Form1 窗体会使系统发出声音,表示 Form1 被禁用。

  4. 单击“切换到”,把“TestForm”调到前面。

    注意 由于系统配置和程序装入的顺序等原因,运行 Coffee 的 Visual Basic 副本也许会和 TestForm 一起出现在最前面,这样就遮住了 CoffeeWatch。

  5. 再次单击“CoffeeWatch”,把它调到最前面并再次显示“部件要求挂起”对话框。

    注意 如果看不见“CoffeeWatch”(是窗体而不是工程),使用任务栏(或按 Alt+Tab 键)把它调到最前面。

    在严格意义上来说,TestForm 对于 CoffeeWatch 是模式的。也就是,在 TestForm 被取消之前不能对 CoffeeWatch 做任何事情,然而,因为两个窗体是在不同的进程中,所以 CoffeeWatch 可以出现在 TestForm 之上。

  6. 单击“切换到”,把“TestForm”调到最前面,然后单击“TestForm”的“关闭”,取消模式窗体。

  7. 单击“显示无模式窗体”,把“TestForm”作为无模式窗体显示。

    TestForm 运转起来象不属于 CoffeeWatch 的无模式窗体,也就是,它不在 CoffeeWatch 之上。可分别单击这两个窗体,使其交替出现在最前面来证明这一点。

    重点 因为 TestForm 与 CoffeeWatch 不在同一进程中,不能象在一个进程中那样,使 CoffeeWatch 成为 TestForm 的所有者,也就是不能在 TestForm 的 OwnerForm 参数中引用 CoffeeWatch。详细信息请参阅“建立代码部件”中的“从代码部件显示窗体”。

  8. 不要取消无模式的“TestForm”。而改成单击“关闭”框关闭“CoffeeWatch”。

    TestForm 没有关闭。(它也许隐藏在包含 CoffeeWatch 工程的 Visual Basic 实例的后面,用任务栏或 ALT+TAB 键把它调到最前面)。

    这说明了重要的两点:首先,进程外部件显示的窗体不依赖于客户应用程序。它的生命期也不依赖于客户的生命期。

    其次,加载的窗体可以防止进程外部件的可执行程序被卸载。详细信息请参阅“部件设计的一般准则”中的“启动和结束部件”。

    在 Terminate 事件中,CoffeeMonitor 应当卸载它显示的所有窗体。

  9. 单击“关闭”框取消“TestForm”。Coffee 部件仍保持运行状态。要使 Coffee 返回设计状态,单击“结束”按钮,或从“运行”菜单中选择“结束”。

    一旦把 ActiveX EXE 工程放到运行状态,它就一直保持运行状态。这对于测试是非常方便的,但它的运转不同于做好的 .exe 文件。当最后的客户释放了最后的对由部件提供的对象的引用时,进程外部件的可执行程序就卸载了,这一点在“启动和结束部件”中讨论。

    注意 只能通过测试做好的可执行程序来测试进程外部件的关闭行为。

从以上得出的结论是进程外代码部件一般不是显示窗体的最好方法。

循序渐进

本主题是逐步创建 ActiveX EXE 示例过程的一部分。

要到 请参阅
下一步 提供异步通知事件
从头开始 创建 ActiveX EXE 部件