65.9K
CodeProject 正在变化。 阅读更多。
Home

窗体视图的自动化

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.09/5 (2投票s)

2004 年 5 月 3 日

3分钟阅读

viewsIcon

48745

一篇关于如何为窗体视图添加自动化的文章

引言

如果你编写过应用程序,你就知道你必须测试它们。 有时,如果你可以编写脚本来控制你的应用程序,那就太好了。 我喜欢使用 COM 和 Automation 来完成这两件事。 创建具有内置脚本功能的文档/视图应用程序非常容易。 创建支持自动化的对话框也很容易。

不幸的是,关于如何利用此功能的示例数量有限。 这些示例要么是初步的,要么过于高级。 我尝试解释如何创建一个简单的 Doc/view 应用程序,你可以通过自动化来控制它。 此外,我在视图中添加了一些表单控件,你也可以控制它们。

背景

你可以自动化你的对话框和表单。 但是,如果没有宿主,你无法创建它们。 本文将讨论一种简单的方法来解决这个问题,而不会偏离文档视图架构。

有两种方法可以解决这个问题

  1. 你可以创建一个基于“工厂”CCmdTarget的类,允许你“创建”对话框以供导出,或者
  2. 在基于文档的应用程序中,你可以使用文档作为“工厂”。

我将在此处解释第二个选项,通过创建“自动化”表单视图的步骤。

创建启用自动化的 Doc/View 应用程序

创建一个新的 VC++ MFC AppWizard Exe,我将其命名为“MyMFCApp”。 点击下一步
  1. 将其设为 SDI 应用程序。
  2. 确保选中“自动化”。
  3. 将基类从CView更改为CFormView
  4. 结束

用自动化的表单视图替换默认的表单视图

默认添加的 formview 不支持自动化,你要么必须对其进行改造,要么创建一个支持自动化的表单并替换默认的表单。 在这个例子中,我将直接替换它。

  1. 添加一个新资源,插入->对话框->IDD_FORMVIEW
  2. 向表单添加一个按钮并双击它
  3. 选择“创建新类”
  4. 给它一个相对唯一的名称,我称之为CMyForm5486。 确保基类是CFormView派生的,默认是CDialog。 确保设置了“自动化”单选按钮。
  5. 为新添加的按钮添加一个按钮处理程序,并放入如下内容
    void CMyForm5486::OnButton1()  
    { 
        ::AfxMessageBox( "My Button Press" ); 
    } 
    
  6. 现在,用我们的新表单替换默认表单。
    1. 替换“MyMFCApp.cpp”中的头文件包含
      //#include "MyMFCAppView.h" 
      #include "MyForm5486.h" 
      
    2. 打开CMyMFCAppApp::InitInstance并替换下面的代码
          CSingleDocTemplate* pDocTemplate; 
          pDocTemplate = new CSingleDocTemplate( 
              IDR_MAINFRAME, 
              RUNTIME_CLASS(CMyMFCAppDoc), 
              RUNTIME_CLASS(CMainFrame),  
              RUNTIME_CLASS(CMyMFCAppView)); 
          AddDocTemplate(pDocTemplate); 
      
          CSingleDocTemplate* pDocTemplate; 
          pDocTemplate = new CSingleDocTemplate( 
              IDR_MAINFRAME, 
              RUNTIME_CLASS(CMyMFCAppDoc), 
              RUNTIME_CLASS(CMainFrame),  
              RUNTIME_CLASS(CMyForm5486)); 
          AddDocTemplate(pDocTemplate); 
      

向表单添加自动化方法。

现在,我们添加自动化代码。 这是我们的客户端将看到的接口方法。

  1. 右键单击IMyForm5846接口,然后选择添加方法。 调用它ButtonClick,返回类型为void
  2. ButtonClick中,调用事件处理程序,即。
    void CMyForm5486::ButtonClick()  
    { 
        OnButton1(); 
    } 
    
现在,COM 方法与按下按钮完全相同。

从文档公开表单

我们现在需要一种从文档公开表单的方法。
  1. 右键单击IMyMFCApp接口,然后选择添加方法。 调用它GetFormView,返回类型为LPDISPATCH。 下面的示例代码将仅返回第一个视图位置,如果需要处理多个表单,则必须对其进行修改。
    LPDISPATCH CMyMFCAppDoc::GetFormView()  
    { 
        POSITION pos = this->GetFirstViewPosition(); 
      
        if (pos != NULL) 
        { 
            CView *pView = this->GetNextView(pos); 
     
            return pView->GetIDispatch( true ); 
        } 
     
        return NULL; 
    } 
    
  2. 在单机模式下运行并测试应用程序。

自动化测试应用程序

现在是自动化测试
  1. 启动 VB 并创建一个独立的 Exe。
  2. 点击项目->引用。 选择“浏览”并导航到你的 Debug 文件夹,然后选择“MyMFCApp.tlb”并选择“打开”,然后“确定”。
  3. 按 F2 并确保你可以看到你的文档和 formview 类及其方法。
  4. 打开表单并添加一个按钮和一个处理程序。
  5. 添加以下代码
Private Sub Command1_Click() 
     
    ' Use CreateObject for DCOM 
    Dim doc As New MyMFCApp.Document 
    Dim frm As MyMFCApp.MyForm5487 
     
    If (doc Is Nothing) Then 
        MsgBox "failed to make document" 
    Else 
        Set frm = doc.GetFormView 
    End If 
     
    If (frm Is Nothing) Then 
        MsgBox "failed to get form" 
    Else 
        frm.ButtonClick 
    End If 
     
End Sub 

运行这个“客户端”应用程序将通过自动化接口调用按钮处理程序。

使用代码

请注意,你只能在 TLB 解锁时编译你的接口(ODL 文件)。 也就是说,如果你的 TLB 文件在 VB 中打开,你将无法在 VC++ 中编译你的 ODL。

© . All rights reserved.