演练:使用 MFC 创建胖客户端应用程序

下面的演练描述创建基于 MFC 的胖客户端应用程序的一个过程,并描述 Visual Studio .NET 的其他各种功能。

在本演练中,将完成以下操作:

  • 设计一个基于 MFC 的解决方案,该解决方案显示现有数据库中的数据,并使用几个对话框显示下列功能:

    • 承载一个无窗口的 ActiveX 控件

    • 使用动态 HTML (DHTML) 对话框

    • 使用现有的 XML Web services 验证应用程序用户。

为完成本演练,必须提供一个现有数据库和至少一个可搜索的表。

备注

本演练使用 pubs 数据库和 authors 表作为示例数据库和示例表。

创建 MFC 胖客户端应用程序

创建 MFC 应用程序

  1. 在**“文件”菜单上单击“新建”,然后单击“项目”**。

    出现“新建项目”对话框。

  2. 在“项目类型”窗格中单击“Visual C++ 项目”,并在“模板”窗格中单击“MFC 应用程序”图标。

  3. 在“名称”框中,输入 MyProject

  4. 单击“确定”关闭对话框,并打开“MFC 应用程序向导”。

使用“MFC 应用程序向导”,将修改项目以支持数据库访问并显示胖客户端应用程序的功能。

备注

本演练假设被访问的服务器为一个 SQL Server,并且此服务器中存在 pubs 数据库。

实现数据库支持

  1. 在“MFC 应用程序向导”中,选择“数据库支持”。

  2. 选择“支持文件的数据库视图”选项。

  3. 单击“数据源”按钮。

  4. 从**“OLE DB 提供程序”**列表框中,单击“Microsoft OLE DB Provider for SQL Server”项,然后单击“下一步”。

  5. 输入或选择一个现有服务器的名称。

  6. 选择“使用 Windows NT 集成安全性”。

  7. 选择 pubs 数据库。

  8. 单击“确定”按钮,建立连接。

  9. 在“选择数据库对象”对话框中,选择 authors 表。

  10. 选择“确定”,关闭对话框。

  11. 单击“完成”创建框架应用程序。

  12. 创建项目后,需要从 MyProjectSet.h 中移除 #error 行。

创建框架应用程序后,即可添加主要的功能。

访问和显示现有数据库中的数据

在这部分,您将使用简单的窗体和控件演示如何访问和显示 authors 表中的数据。由于这只是一个演示,所以查询和显示操作很简单。查询结果(表中的所有作者)显示在一个列表框中。

MyProject 应用程序已包含一个窗体对象(称为 IDD_MYPROJECT_FORM),该对象位于“资源视图”中的“对话框”节点下面。修改此窗体以显示 authors 表中的作者的简单列表。

修改窗体

  1. 在“资源视图”中展开项目,展开“Dialog”节点,然后双击默认的窗体对象 (IDD_MYPROJECT_FORM)。

  2. 将“列表框”(ListBox) 控件拖到默认窗体上。

  3. 右击此**“列表框”(ListBox)** 控件,在快捷菜单上单击“添加变量”。

    出现“添加成员变量向导”。

  4. 在“变量名”框中输入 m_DataList,单击“完成”。

  5. Button 控件拖动到默认窗体上。在“属性”窗口中,将 Caption 框更改为 Control Host

  6. Button 控件拖动到默认窗体上。在“属性”窗口中,将 Caption 框更改为 DHTML Dialog

    备注

    在本演练的后面部分将使用这两个控件访问应用程序的其他功能。

显示查询结果

  1. 在“类视图”中,展开项目节点并双击 CMyProjectView 类的 OnInitialUpdate 方法。

  2. 在此函数中的所有现有代码之后,添加下面的代码:

       HRESULT hr = S_OK;
       TCHAR szAuthor[80];
    
       CMyProjectSet &dbset = GetDocument()->m_MyProjectSet;
       [db_command(name="cmd", source_name="dbset", hresult=hr)
       {
          SELECT au_lname
          ([bindto]szAuthor)
          FROM AUTHORS
       }];
    
       while(cmd.MoveNext() == S_OK)
          m_DataList.InsertString(-1, szAuthor);
    

    这些代码使用 db_command 属性,用表中当前所有作者的姓氏初始化文档对象 (m_MyProjectSet) 的数据集。

  3. 在“生成”菜单上单击“生成解决方案”。

  4. 在**“调试”**菜单上,单击“开始执行(不调试)”。

    查询结果将显示在子视图窗体的列表框中。

创建和承载无窗口的 ActiveX 控件

对胖客户端应用程序所做的下一项修改是一个对话框,它承载一个简单的、无窗口的自定义控件。第一步是创建一个具有简单事件的自定义 ActiveX 控件。然后创建一个包含此控件并处理控件事件的对话框对象。

创建自定义控件

  1. 在解决方案资源管理器中,右击 MyProject 解决方案。

  2. 在快捷菜单上单击**“添加”**,再单击“新建项目”。

    出现“新建项目”对话框。

  3. 在“项目类型”窗格中选择“Visual C++ 项目”,并在“模板”窗格中单击“ATL 项目”图标。

  4. 输入**“CustomCtl”**作为新项目的名称,并单击“确定”。

    即会出现“ATL 项目向导”。

  5. 单击“完成”接受默认设置并创建项目。

  6. 右击 CustomCtl 项目。

  7. 在快捷菜单上单击“添加”,然后单击“添加类”。

    随即出现**“添加类”**对话框。

  8. 双击“ATL 控件”项。

    即会出现“ATL 控件向导”。

  9. 在“ATL 控件向导”的“简称”框中,输入 MyCtl

  10. 在“选项”页上,选择**“连接点”**。

  11. 单击“完成”创建自定义控件对象。

创建控件后,添加一个名为 Click 的简单事件。每当在该控件区域内单击鼠标时,该控件就会激发此事件。

创建 Click 事件

  1. 在“类视图”中展开 CustomCtl 节点。

  2. 右击自定义控件的事件接口 (_IMyCtlEvents)。

  3. 在快捷菜单上单击“添加”,然后单击“添加方法”。

  4. 使用添加方法向导输入下面的值:

    • 返回类型:void

    • 方法名:Click

  5. 单击“完成”创建 Click 事件。

  6. 在“类视图”中选择控件类 (CMyCtl)。

  7. 在“属性”窗口中,单击“消息”按钮并为 WM_LBUTTONDOWN 消息添加 OnLButtonDown 处理程序。

  8. 将下面的代码添加到处理程序体:

       Click();
       return 0;
    
  9. 在“生成”菜单上单击“生成解决方案”。

成功生成解决方案后,一个简单的对话框就可以承载控件了。

承载控件

  1. 在“资源视图”中,右击 MyProject 解决方案。

  2. 在快捷菜单上单击**“添加”**,再单击“添加资源”。

  3. 单击“对话框”项,并单击“新建”。

  4. 右击 IDD_DIALOG1 对话框,在快捷菜单上单击“添加类”。

    出现“MFC 类向导”。

  5. 在“MFC 类向导”中输入下面的值:

    • “类名”:CMyCtlDlg

    • “基类”CDialog

  6. 单击**“完成”**。

  7. 右击 IDD_DIALOG1 对话框,在快捷菜单上选择“插入 ActiveX 控件”。

  8. 在“插入 ActiveX 控件”对话框中选择**“CMyCtl 对象”,然后单击“确定”**以添加控件。

  9. 选择对话框模板上的 ActiveX 控件。

  10. 在“属性”窗口中单击**“控件事件”**按钮,并为 Click 事件添加 ClickMyctl1 处理程序。

  11. 将下面的代码添加到事件处理程序的程序体:

       AfxMessageBox("Click event fired");
    

最后一个步骤涉及将对话框挂钩到胖客户端应用程序。这是通过 Control Host 按钮处理程序中的代码完成的,而该按钮是在前面的“访问和显示现有数据库中的数据”主题中创建的。

显示 control host 对话框

  1. 在“资源视图”中,双击 IDD_MYPROJECT_FORM(位于 MyProject 解决方案资源文件的“对话框”节点下)以显示主窗体。

  2. 双击先前添加的 Control Host 按钮。

  3. 将下面的代码添加到处理函数:

       CMyCtlDlg dlg;
       dlg.DoModal( );
    
  4. 将下面的代码添加到当前源文件中最后一个 #include 语句后:

    #include "MyCtlDlg.h"
    

    这将包含实现控件宿主对话框的类的 .h 文件。

  5. 在“生成”菜单上单击“生成解决方案”。

  6. 在**“调试”**菜单上,单击“开始执行(不调试)”。

通过按 Control Host 按钮可以调用控件宿主对话框。在控件内单击鼠标左键可激发自定义 Click 事件。

实现 DHTML 对话框

胖客户端应用程序的另一个功能是使用这样的对话框:这些对话框使用 HTML 而不是传统的对话框资源作为用户界面。针对本演练的目的,下面将实现一个简单的 DHTML 对话框,其中包含一个显示简单位图的图像控件。

实现 DHTML 对话框

  1. 在“资源视图”中,右击 MyProject 项目。

  2. 在快捷菜单上单击**“添加”**,再单击“添加资源”。

  3. 单击“对话框”项,然后单击“新建”创建新的对话框。

  4. 从对话框模板中移除“确定”和**“取消”**按钮;这两个按钮的功能将在后续步骤的 HTML 中实现。

  5. 右击 IDD_DIALOG2 对话框窗体并选择“添加类”。

  6. 输入下列值:

    • “类名”:CMyDhtmlDlg

    • “基类”CDHtmlDialog

  7. 单击**“完成”**。

  8. 在“资源视图”中,双击 HTML 节点下的 IDR_HTML_MYDHTMLDLG 项,然后单击设计窗格下的 HTML 选项卡以编辑关联的 HTML 文件。

  9. 将现有的文本(应类似于 TODO: Place controls here)替换为 This is the text content of my DHTML dialog box。

与前面实现的控件宿主对话框一样,当用户在应用程序的主窗体上按一个按钮 (DHTML Dialog) 时,就会显示此对话框。

显示 DHTML 对话框

  1. 在“资源视图”中,双击 IDD_MYPROJECT_FORM(位于 MyProject 解决方案资源文件的“对话框”节点下)以显示主窗体。

  2. 双击先前添加的 DHTML Dialog 按钮。

  3. 将下面的代码添加到处理函数:

       CMyDhtmlDlg dlg;
       dlg.DoModal( );
    
  4. 将下面的代码添加到当前源文件中最后一个 #include 语句后:

    #include "MyDhtmlDlg.h"
    

    这将包含实现 DHTML 对话框的类的 .h 文件。

  5. 在“生成”菜单上单击“生成解决方案”。

  6. 在**“调试”**菜单上,单击“开始执行(不调试)”。

出现对话框时,按 DHTML Dialog 按钮打开 DHTML 对话框。

有关 DHTML 对话框的更多信息以及更完整的示例,请参见 CDHtmlDialog 类和 DHtmlExplore 示例。

创建和使用现有的 XML Web services

有时,胖客户端应用程序通过向现有数据库提供胖前端来与外部 XML Web services 交互。于是,用户能够以熟悉的或图形化的方式与数据进行交互。

在此步骤中,将创建一个简单的 XML Web services,并将其设计为在使用 Microsoft Internet 信息服务 (IIS) 的 Web 服务器上运行。

创建 XML Web services

  1. 在**“文件”菜单上单击“新建”,然后单击“项目”**。

    出现“新建项目”对话框。

  2. 在“项目类型”窗格中,单击**“Visual Basic 项目”**或“Visual C# 项目”,然后在“模板”窗格中单击“ASP.NET Web 服务”图标。

  3. 在“位置”框中,输入 https://localhost/MyService

  4. 单击“确定”,关闭对话框并创建解决方案。

XML Web services 的一个共同部分是验证应用程序的每个用户。创建解决方案后,可以实现简单的验证方法。为了清楚地阐释这一概念,有意对本验证例程进行了简化。

解决方案创建后,便可向 Service1.asmx 源文件添加验证方法。若要执行此操作,请右击 Service1.asmx.cs 设计图面,并选择“查看代码”。用以下代码替换文件末尾的 HelloWorld Web 方法:

' Visual Basic
<WebMethod()> Function Validate(ByVal s1 As String, ByVal s2 As String) As Boolean
   Return s1 = s2
End Function

// C#
[WebMethod]
   public bool Validate(string s1, string s2)
   {
    return s1 == s2;
   }

在修改源文件之后,生成解决方案。

有了此 XML Web services 之后,就可使用“添加 Web 引用”对话框添加和配置 Web 引用。

在客户端应用程序中添加 Web 引用

  1. 打开 MyProject 解决方案。

  2. 在“解决方案资源管理器”中右击**“MyProject”**项目并选择“添加 Web 引用”。

    “添加 Web 引用”对话框随即出现。

  3. 在“浏览至”下,选择“本地计算机上的 Web 服务”。将出现本地计算机上现有的 XML Web services 列表;选择您刚才创建的服务 (Service1)。如果找到该 Web 服务,左窗格中将出现服务说明,而且“添加引用”按钮将被激活。用于 Web 服务的 .asmx 文件的 URL 也会出现在 URL 框中;其形式类似于:

    https://localhost/MyService/Service1.asmx
    
  4. 单击“添加引用”按钮。

添加 Web 引用之后,将添加一个验证对话框,以演示应用程序与 XML Web services 之间的交互。

添加验证对话框

  1. 在“资源视图”中,右击 MyProject 项目。

  2. 在快捷菜单上单击**“添加”**,再单击“添加资源”。

  3. 双击“对话框”项。

  4. 双击 IDD_DIALOG3 对话框窗体。

    出现“MFC 类向导”。

  5. 输入下列值:

    • “类名”:CMyValidateDlg

    • “基类”CDialog

  6. 单击**“完成”**。

已创建了对话框,现在可以添加为用户提供验证服务的控件了。

验证用户

  1. 将两个 Edit control 控件拖放到 IDD_DIALOG3 对话框窗体上。

  2. 右击第一个 Edit control 控件。

  3. 在快捷菜单上选择“添加变量”。

  4. 在“变量名称”框中输入 m_Name。

  5. 在**“类别”**下拉菜单中选择“值”。

  6. 单击**“完成”**。

  7. 右击第二个 Edit control 控件。

  8. 添加另一个变量(类别为“值”的 m_Password)。

  9. 双击对话框窗体上的“确定”按钮。

  10. 将下面的代码添加到处理函数:

       Service1::CService1 *s = new Service1::CService1();
    
       UpdateData(TRUE);
       bool result = false;
       s->Validate(CComBSTR(m_Name), CComBSTR(m_Password), &result);
       if (result)
          CDialog::OnOK();
    
  11. 将下面的代码添加到当前源文件中最后一个 #include 语句后:

    #include "WebService.h"
    

    这将包含验证对话框所使用的 Web 服务的 .h 文件。

为使验证例程生效,验证对话框必须是显示的第一个用户界面对象。如果用户输入了正确的名称和密码,就会显示胖客户端应用程序。如果输入的名称或密码不正确,当前用户就不能访问胖客户端应用程序。

若要实现此行为,请修改主应用程序类的 InitInstance 函数,以使其首先调用此对话框。只有正确退出该对话框后,应用程序才能继续。

在开始时显示验证对话框

  1. 在“类视图”中,展开 CMyProjectApp 节点。

  2. 双击 InitInstance 函数以编辑函数体。

  3. 在调用 pMainFrame 对象的 ShowWindow 函数之前添加下面的代码:

       // Display the validation dialog box first
       CMyValidateDlg dlg;
       if (dlg.DoModal() != IDOK)
          return FALSE;
    
  4. 将下面的代码添加到当前源文件中最后一个 #include 语句后:

    #include "MyValidateDlg.h"
    

    这将包含验证对话框的 .h 文件。

  5. 生成解决方案。在“生成”菜单上单击“生成解决方案”。

  6. 在**“调试”**菜单上,单击“开始执行(不调试)”。在验证对话框中输入与“名称”和“密码”编辑框中相同的文本,然后单击“确定”。胖客户端应用程序随即运行,并显示其主对话框。

创建安装项目

开发 Visual C++ 应用程序的最后一个步骤是创建一个安装项目。

创建安装项目

  1. 在解决方案资源管理器中,右击 MyProject 解决方案。

  2. 在快捷菜单上单击**“添加”**,再单击“新建项目”。

    出现“新建项目”对话框。

  3. 在“项目类型”窗格中选择“安装和部署项目”,然后在“模板”窗格中单击**“安装向导”**图标。

  4. 输入**“MySetup”**作为安装项目的名称,然后单击“确定”。

    “安装向导”出现。

  5. 单击“下一步”两次。

  6. 选择下列输出组:

    • 来自 MyProject 的主输出

    • 来自 CustomCtl 的主输出

  7. 单击“下一步”两次。

  8. 单击“完成”。

  9. 在“生成”菜单上单击**“生成 MySetup”**。

可以将结果文件 (MySetup) 复制到目标计算机中,以用于胖客户端应用程序的安装。有关部署项目和“安装向导”的更多信息,请参见部署应用程序部署项目部署演练

请参见

概念

胖客户端应用程序演练

Visual Studio 演练