StockTicker 示例:在 ATL 控件中显示 Web 信息

更新:2007 年 11 月

StockTicker 示例从 Web 上下载股票信息并将信息显示在 ATL 控件上,您可以从右向左滚动查看这些数据。该控件按用户设定的时间间隔更新数据。

StockTicker 包含以下四个部分:

  • 共享的 ATL 组件 (stockquotes)。

  • ATL 控件 (stocktickeratl)。

  • ISAPI 扩展 DLL (stocksourcemfc)。

  • MFC 容器 app (containermfc)。可以重命名此 .exe 文件。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行 StockTicker 示例

  1. 打开解决方案 StockTicker.sln。

  2. 在“生成”菜单中单击“生成”。

  3. 使用 regsvr32 来注册两个 DLL:stockquotes.dll 和 stocktickeratl.dll。可能还需要注册 ATL.dll。

    ISAPI 扩展 DLL 模仿股票数据源。它应该安装在装有 Web 服务器软件(如 Microsoft Internet 信息服务 (IIS))的计算机上。必须告诉 StockTicker 该 DLL 位于何处。有关如何使用 ISAPI 扩展 DLL 的指示,请参见下文。

  4. 运行 containermfc.exe。右击应用程序的工作区以显示一个快捷菜单。使用此菜单更改 StockTicker 的行为和属性,详见后面章节的介绍。

如何添加股票源网站

遵循下面的步骤来添加您自己的股票源网站。

  1. 编辑 stockquotes\stockquotes_.h。检验 CSQSISAPIDll 类。您可以使用该类作为新股票行情类的示例。

  2. 创建从 CStockQuoteSource 导出的新类。

  3. 在新类构造函数中,将 m_strURL 设置为要从其检索数据的网站的完整 URL 路径。确保包括用于检索股票数据的命令。

  4. 从网站返回的 HTML 的格式可能要求您重写 SetStockInfo 和/或 ParseStockInfo。

  5. 重新生成该组件并注册它。

如果所选定的站点返回类似 CONAME: <NA> 的数据,其中 CONAME 是股票符号,则或者是该站点无法访问,或者是您所创建的源类无法从 HTML 找到股票信息。

说明:

在您选择监控的股票中,股票数据的格式(小数或分数)可能不同。StockTicker 不试图更改数据以使其保持一致。

StockTicker 的行为和属性

  • 股票
    显示一个对话框,您可以从中添加或移除要监控的股票符号。该对话框由股票符号的当前列表初始化。

  • 立即更新
    更新来自 Web 的股票信息。

  • 属性
    “属性”对话框具有三个属性页:颜色、字体和自定义。如果在“属性”对话框中未显示股票颜色和字体属性页,则确保您已注册 msstkprp.dll。

    可以更改以下属性。

    • 股票报价器速度   移动滑块以提高或降低股票信息从右向左滚动的速率。

    • 更新间隔   两次更新之间的时间(以分钟计)。

    • ISAPI 扩展 DLL URL   输入 ISAPI 扩展 DLL 的完整 URL。将文本 ?QueryForStock?Symbol= 追加到 URL 的结尾。

      在指定 ISAPI 扩展 DLL 的 URL 时,需要包括负责返回包含股票信息的 HTML 的组件。

  • 关于股票行情自动收录器
    打开“About”对话框。

  • 停留在顶部
    StockTicker 将显示在其他所有应用程序的顶部;否则,它可能由其他应用程序隐藏。

由 StockTicker 使用的功能

  • ATL COM 对象

  • ATL 对话框对象

  • ATL 控件

  • MFC Internet (WinInet) 类

  • MFC ISAPI 扩展 DLL

  • 连接点

  • 持久性

  • 自定义枚举数

  • 标准 C++ 库

StockTicker 组件

本节提供与 StockTicker 组件有关的更详细信息。

  • 股票行情组件
    共享的组件 ATL 对象由“ATL 项目应用程序向导”创建。它使用 MFC WinInet 支持和其他实用工具类。“股票行情”跟踪要监控的股票并更新来自 Internet 的股票信息。应用程序既可以使用该组件进行同步更新,也可以进行异步更新。如果调用 StartUpdating 方法,将创建一个子线程并且该函数立即返回。该子线程创建一个计时器并在更新时间间隔到时前一直等待。然后它请求来自“股票行情”组件的更新。后面的对 Update 的调用将线程消息发送到子线程,指示应发生更新,并且 Update 立即返回。在同步模式中,在完成下载前将阻止 Update。

    “股票行情”组件跟踪股票数据源对象,这些对象表示要从其下载股票信息的网站。当 StockTicker 更新股票信息时,“股票行情”组件查看股票数据源列表并试图下载这些信息。如果该尝试失败,此组件将尝试从下一个源下载股票数据。如果所有股票数据源都无法下载这些信息,则 <NA> 将显示在股票行情自动收录器窗口中,并且显示在股票符号的后面。

    股票数据来自网站的 HTML 窗体中。必须对这些数据进行分析以找到当前价格和自上次更新以后的价格变化。“股票行情”组件处理此分析,方法是搜索两个关键字:例如 Current: 或 Change:。如果关键字后面的数据是分数或小数,该组件将读取这些数据。

    因为股票网站可能更改其发送数据的方式,所以您可能需要更改“股票行情”用来获取股票信息的算法。

    请参见下文了解有关如何添加您自己的股票数据源的说明。

  • ISAPI 扩展 DLL
    默认的股票数据源是本地 ISAPI 扩展 DLL。ISAPI 扩展 DLL 不返回实际的股票数据。不过,当您请求一个股票的数据时,DLL 检查股票符号是否处于其已知股票列表中。如果该股票符号位于此列表中,则 DLL 将检索数据并随机向上或向下调整当前股票价格。如果该股票符号是新股票符号,则它将被添加到列表中并设置初始股票价格。

  • 股票行情自动收录器控件
    该控件由“ATL 对象向导”创建。它使用 MFC 来使某些功能更为简便。

    可以在 StockTicker 外使用此控件。

    “股票行情自动收录器”控件使用“股票行情”组件来处理股票信息和更新。当要将其本身保存为流时,该控件还将要求“股票行情”组件来保存其本身。

    在启动后,“股票行情自动收录器”控件创建“股票行情”组件并要求它开始更新股票信息。该控件然后启动它用于绘制/呈现循环的计时器。在股票数据被更新后,“股票行情”组件通知该控件(通过连接点)。该控件然后从“股票行情”组件获取所有股票信息,并且在组件外创建字符串。在控件内绘制此字符串并从右向左滚动显示。

  • 股票行情自动收录器容器
    “股票行情自动收录器”容器是 MFC 活动控件容器,用“MFC 应用程序向导”创建。它在退出时保存其大小和位置,并在重新启动时还原其以前的状态。

    该容器还处理 StockTicker 菜单。

关键字

此示例说明以下关键字:

IEnumXXX、CWinThread、std::vector、IConnectionPointContainer、CInternetSession、CInternetException、AfxParseURL、CHttpConnection、CHttpFile、COleClientItem、COleDocument、COleDispatchDriver、CreateILockBytesOnHGlobal、StgCreateDocfileOnILockBytes、OleSave、StgIsStorageILockBytes、GetHGlobalFromILockBytes、COleFont、std::basic_istream、std::basic_ostream、CHttpServer、CComPtr、CDialogImpl、std::list、IPersistStreamInit、IFontDisp、IViewObjectEx、CComControl、IOleControl、IPropertyPageImpl、CBitmap、CDC、IPersistStreamInit_Load、IPersistStreamInit_Save、IConnectionPointImpl

说明:

某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。

请参见

其他资源

MFC 示例