演练:使用 MFC 创建胖客户端应用程序
下面的演练描述创建基于 MFC 的胖客户端应用程序的一个过程,并描述 Visual Studio .NET 的其他各种功能。
在本演练中,将完成以下操作:
设计一个基于 MFC 的解决方案,该解决方案显示现有数据库中的数据,并使用几个对话框显示下列功能:
承载一个无窗口的 ActiveX 控件
使用动态 HTML (DHTML) 对话框
使用现有的 XML Web services 验证应用程序用户。
为完成本演练,必须提供一个现有数据库和至少一个可搜索的表。
备注
本演练使用 pubs 数据库和 authors 表作为示例数据库和示例表。
创建 MFC 胖客户端应用程序
创建 MFC 应用程序
在**“文件”菜单上单击“新建”,然后单击“项目”**。
出现“新建项目”对话框。
在“项目类型”窗格中单击“Visual C++ 项目”,并在“模板”窗格中单击“MFC 应用程序”图标。
在“名称”框中,输入 MyProject。
单击“确定”关闭对话框,并打开“MFC 应用程序向导”。
使用“MFC 应用程序向导”,将修改项目以支持数据库访问并显示胖客户端应用程序的功能。
备注
本演练假设被访问的服务器为一个 SQL Server,并且此服务器中存在 pubs 数据库。
实现数据库支持
在“MFC 应用程序向导”中,选择“数据库支持”。
选择“支持文件的数据库视图”选项。
单击“数据源”按钮。
从**“OLE DB 提供程序”**列表框中,单击“Microsoft OLE DB Provider for SQL Server”项,然后单击“下一步”。
输入或选择一个现有服务器的名称。
选择“使用 Windows NT 集成安全性”。
选择 pubs 数据库。
单击“确定”按钮,建立连接。
在“选择数据库对象”对话框中,选择 authors 表。
选择“确定”,关闭对话框。
单击“完成”创建框架应用程序。
创建项目后,需要从 MyProjectSet.h 中移除 #error 行。
创建框架应用程序后,即可添加主要的功能。
访问和显示现有数据库中的数据
在这部分,您将使用简单的窗体和控件演示如何访问和显示 authors 表中的数据。由于这只是一个演示,所以查询和显示操作很简单。查询结果(表中的所有作者)显示在一个列表框中。
MyProject 应用程序已包含一个窗体对象(称为 IDD_MYPROJECT_FORM),该对象位于“资源视图”中的“对话框”节点下面。修改此窗体以显示 authors 表中的作者的简单列表。
修改窗体
在“资源视图”中展开项目,展开“Dialog”节点,然后双击默认的窗体对象 (IDD_MYPROJECT_FORM)。
将“列表框”(ListBox) 控件拖到默认窗体上。
右击此**“列表框”(ListBox)** 控件,在快捷菜单上单击“添加变量”。
出现“添加成员变量向导”。
在“变量名”框中输入 m_DataList,单击“完成”。
将 Button 控件拖动到默认窗体上。在“属性”窗口中,将 Caption 框更改为 Control Host。
将 Button 控件拖动到默认窗体上。在“属性”窗口中,将 Caption 框更改为 DHTML Dialog。
备注
在本演练的后面部分将使用这两个控件访问应用程序的其他功能。
显示查询结果
在“类视图”中,展开项目节点并双击 CMyProjectView 类的 OnInitialUpdate 方法。
在此函数中的所有现有代码之后,添加下面的代码:
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) 的数据集。
在“生成”菜单上单击“生成解决方案”。
在**“调试”**菜单上,单击“开始执行(不调试)”。
查询结果将显示在子视图窗体的列表框中。
创建和承载无窗口的 ActiveX 控件
对胖客户端应用程序所做的下一项修改是一个对话框,它承载一个简单的、无窗口的自定义控件。第一步是创建一个具有简单事件的自定义 ActiveX 控件。然后创建一个包含此控件并处理控件事件的对话框对象。
创建自定义控件
在解决方案资源管理器中,右击 MyProject 解决方案。
在快捷菜单上单击**“添加”**,再单击“新建项目”。
出现“新建项目”对话框。
在“项目类型”窗格中选择“Visual C++ 项目”,并在“模板”窗格中单击“ATL 项目”图标。
输入**“CustomCtl”**作为新项目的名称,并单击“确定”。
即会出现“ATL 项目向导”。
单击“完成”接受默认设置并创建项目。
右击 CustomCtl 项目。
在快捷菜单上单击“添加”,然后单击“添加类”。
随即出现**“添加类”**对话框。
双击“ATL 控件”项。
即会出现“ATL 控件向导”。
在“ATL 控件向导”的“简称”框中,输入 MyCtl。
在“选项”页上,选择**“连接点”**。
单击“完成”创建自定义控件对象。
创建控件后,添加一个名为 Click 的简单事件。每当在该控件区域内单击鼠标时,该控件就会激发此事件。
创建 Click 事件
在“类视图”中展开 CustomCtl 节点。
右击自定义控件的事件接口 (_IMyCtlEvents)。
在快捷菜单上单击“添加”,然后单击“添加方法”。
使用添加方法向导输入下面的值:
返回类型:void
方法名:Click
单击“完成”创建 Click 事件。
在“类视图”中选择控件类 (CMyCtl)。
在“属性”窗口中,单击“消息”按钮并为 WM_LBUTTONDOWN 消息添加 OnLButtonDown 处理程序。
将下面的代码添加到处理程序体:
Click(); return 0;
在“生成”菜单上单击“生成解决方案”。
成功生成解决方案后,一个简单的对话框就可以承载控件了。
承载控件
在“资源视图”中,右击 MyProject 解决方案。
在快捷菜单上单击**“添加”**,再单击“添加资源”。
单击“对话框”项,并单击“新建”。
右击 IDD_DIALOG1 对话框,在快捷菜单上单击“添加类”。
出现“MFC 类向导”。
在“MFC 类向导”中输入下面的值:
“类名”:CMyCtlDlg
“基类”:CDialog
单击**“完成”**。
右击 IDD_DIALOG1 对话框,在快捷菜单上选择“插入 ActiveX 控件”。
在“插入 ActiveX 控件”对话框中选择**“CMyCtl 对象”,然后单击“确定”**以添加控件。
选择对话框模板上的 ActiveX 控件。
在“属性”窗口中单击**“控件事件”**按钮,并为 Click 事件添加 ClickMyctl1 处理程序。
将下面的代码添加到事件处理程序的程序体:
AfxMessageBox("Click event fired");
最后一个步骤涉及将对话框挂钩到胖客户端应用程序。这是通过 Control Host 按钮处理程序中的代码完成的,而该按钮是在前面的“访问和显示现有数据库中的数据”主题中创建的。
显示 control host 对话框
在“资源视图”中,双击 IDD_MYPROJECT_FORM(位于 MyProject 解决方案资源文件的“对话框”节点下)以显示主窗体。
双击先前添加的 Control Host 按钮。
将下面的代码添加到处理函数:
CMyCtlDlg dlg; dlg.DoModal( );
将下面的代码添加到当前源文件中最后一个 #include 语句后:
#include "MyCtlDlg.h"
这将包含实现控件宿主对话框的类的 .h 文件。
在“生成”菜单上单击“生成解决方案”。
在**“调试”**菜单上,单击“开始执行(不调试)”。
通过按 Control Host 按钮可以调用控件宿主对话框。在控件内单击鼠标左键可激发自定义 Click 事件。
实现 DHTML 对话框
胖客户端应用程序的另一个功能是使用这样的对话框:这些对话框使用 HTML 而不是传统的对话框资源作为用户界面。针对本演练的目的,下面将实现一个简单的 DHTML 对话框,其中包含一个显示简单位图的图像控件。
实现 DHTML 对话框
在“资源视图”中,右击 MyProject 项目。
在快捷菜单上单击**“添加”**,再单击“添加资源”。
单击“对话框”项,然后单击“新建”创建新的对话框。
从对话框模板中移除“确定”和**“取消”**按钮;这两个按钮的功能将在后续步骤的 HTML 中实现。
右击 IDD_DIALOG2 对话框窗体并选择“添加类”。
输入下列值:
“类名”:CMyDhtmlDlg
“基类”:CDHtmlDialog
单击**“完成”**。
在“资源视图”中,双击 HTML 节点下的 IDR_HTML_MYDHTMLDLG 项,然后单击设计窗格下的 HTML 选项卡以编辑关联的 HTML 文件。
将现有的文本(应类似于 TODO: Place controls here)替换为 This is the text content of my DHTML dialog box。
与前面实现的控件宿主对话框一样,当用户在应用程序的主窗体上按一个按钮 (DHTML Dialog) 时,就会显示此对话框。
显示 DHTML 对话框
在“资源视图”中,双击 IDD_MYPROJECT_FORM(位于 MyProject 解决方案资源文件的“对话框”节点下)以显示主窗体。
双击先前添加的 DHTML Dialog 按钮。
将下面的代码添加到处理函数:
CMyDhtmlDlg dlg; dlg.DoModal( );
将下面的代码添加到当前源文件中最后一个 #include 语句后:
#include "MyDhtmlDlg.h"
这将包含实现 DHTML 对话框的类的 .h 文件。
在“生成”菜单上单击“生成解决方案”。
在**“调试”**菜单上,单击“开始执行(不调试)”。
出现对话框时,按 DHTML Dialog 按钮打开 DHTML 对话框。
有关 DHTML 对话框的更多信息以及更完整的示例,请参见 CDHtmlDialog 类和 DHtmlExplore 示例。
创建和使用现有的 XML Web services
有时,胖客户端应用程序通过向现有数据库提供胖前端来与外部 XML Web services 交互。于是,用户能够以熟悉的或图形化的方式与数据进行交互。
在此步骤中,将创建一个简单的 XML Web services,并将其设计为在使用 Microsoft Internet 信息服务 (IIS) 的 Web 服务器上运行。
创建 XML Web services
在**“文件”菜单上单击“新建”,然后单击“项目”**。
出现“新建项目”对话框。
在“项目类型”窗格中,单击**“Visual Basic 项目”**或“Visual C# 项目”,然后在“模板”窗格中单击“ASP.NET Web 服务”图标。
在“位置”框中,输入 https://localhost/MyService。
单击“确定”,关闭对话框并创建解决方案。
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 引用
打开 MyProject 解决方案。
在“解决方案资源管理器”中右击**“MyProject”**项目并选择“添加 Web 引用”。
“添加 Web 引用”对话框随即出现。
在“浏览至”下,选择“本地计算机上的 Web 服务”。将出现本地计算机上现有的 XML Web services 列表;选择您刚才创建的服务 (Service1)。如果找到该 Web 服务,左窗格中将出现服务说明,而且“添加引用”按钮将被激活。用于 Web 服务的 .asmx 文件的 URL 也会出现在 URL 框中;其形式类似于:
https://localhost/MyService/Service1.asmx
单击“添加引用”按钮。
添加 Web 引用之后,将添加一个验证对话框,以演示应用程序与 XML Web services 之间的交互。
添加验证对话框
在“资源视图”中,右击 MyProject 项目。
在快捷菜单上单击**“添加”**,再单击“添加资源”。
双击“对话框”项。
双击 IDD_DIALOG3 对话框窗体。
出现“MFC 类向导”。
输入下列值:
“类名”:CMyValidateDlg
“基类”:CDialog
单击**“完成”**。
已创建了对话框,现在可以添加为用户提供验证服务的控件了。
验证用户
将两个 Edit control 控件拖放到 IDD_DIALOG3 对话框窗体上。
右击第一个 Edit control 控件。
在快捷菜单上选择“添加变量”。
在“变量名称”框中输入 m_Name。
在**“类别”**下拉菜单中选择“值”。
单击**“完成”**。
右击第二个 Edit control 控件。
添加另一个变量(类别为“值”的 m_Password)。
双击对话框窗体上的“确定”按钮。
将下面的代码添加到处理函数:
Service1::CService1 *s = new Service1::CService1(); UpdateData(TRUE); bool result = false; s->Validate(CComBSTR(m_Name), CComBSTR(m_Password), &result); if (result) CDialog::OnOK();
将下面的代码添加到当前源文件中最后一个 #include 语句后:
#include "WebService.h"
这将包含验证对话框所使用的 Web 服务的 .h 文件。
为使验证例程生效,验证对话框必须是显示的第一个用户界面对象。如果用户输入了正确的名称和密码,就会显示胖客户端应用程序。如果输入的名称或密码不正确,当前用户就不能访问胖客户端应用程序。
若要实现此行为,请修改主应用程序类的 InitInstance 函数,以使其首先调用此对话框。只有正确退出该对话框后,应用程序才能继续。
在开始时显示验证对话框
在“类视图”中,展开 CMyProjectApp 节点。
双击 InitInstance 函数以编辑函数体。
在调用 pMainFrame 对象的 ShowWindow 函数之前添加下面的代码:
// Display the validation dialog box first CMyValidateDlg dlg; if (dlg.DoModal() != IDOK) return FALSE;
将下面的代码添加到当前源文件中最后一个 #include 语句后:
#include "MyValidateDlg.h"
这将包含验证对话框的 .h 文件。
生成解决方案。在“生成”菜单上单击“生成解决方案”。
在**“调试”**菜单上,单击“开始执行(不调试)”。在验证对话框中输入与“名称”和“密码”编辑框中相同的文本,然后单击“确定”。胖客户端应用程序随即运行,并显示其主对话框。
创建安装项目
开发 Visual C++ 应用程序的最后一个步骤是创建一个安装项目。
创建安装项目
在解决方案资源管理器中,右击 MyProject 解决方案。
在快捷菜单上单击**“添加”**,再单击“新建项目”。
出现“新建项目”对话框。
在“项目类型”窗格中选择“安装和部署项目”,然后在“模板”窗格中单击**“安装向导”**图标。
输入**“MySetup”**作为安装项目的名称,然后单击“确定”。
“安装向导”出现。
单击“下一步”两次。
选择下列输出组:
来自 MyProject 的主输出
来自 CustomCtl 的主输出
单击“下一步”两次。
单击“完成”。
在“生成”菜单上单击**“生成 MySetup”**。
可以将结果文件 (MySetup) 复制到目标计算机中,以用于胖客户端应用程序的安装。有关部署项目和“安装向导”的更多信息,请参见部署应用程序、部署项目和部署演练。