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

一个闪烁控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (12投票s)

2000年8月31日

viewsIcon

135903

downloadIcon

3801

一个为您的 MFC 应用程序提供新闻/股票跑马灯的类

  • 下载源文件 - 7 Kb
  • 下载演示项目 - 34 Kb
  • Sample Image - AppPic.jpg

    引言

    一个 MFC 类 CTicker,可用于为您的 MFC 应用程序提供新闻/股票跑马灯。

    想象一下,您的项目需要在一个应用程序中显示滚动信息,该应用程序可以及时提供股票、新闻、体育比分和天气信息。

    “鼠标悬停”事件会停止跑马灯并突出显示边框,单击它会在您喜欢的浏览器中打开一个预定义的 URL,其中包含 html 文件中更详细的信息。网上有类似的应用程序,例如 EntryPoint。

    跑马灯应持续显示变化的数据,并定期下载指定的 URL 并显示该数据。数据可以是文本格式。

    我一直希望有一个现成的类可以使我的应用程序显示滚动跑马灯。我不得不求助于第三方 ActiveX 控件,这给我的应用程序增加了相当大的大小和版本管理难题。所以我自己写了一个,本着 MFC 的精神,我称之为 CTicker

    我使用 MFC 的包装类完成了 GDI,并使用 CAsyncMonikerFile 类来实现 HTTP。

    示例代码是一个基于对话框的应用程序,名为 TickerTest。可以尝试 MFC 应用程序的其他组合。

    用法

    要将跑马灯添加到 TickerTest,您需要执行以下操作

    1. 在对话框资源 IDD_TICKERTEST_DIALOG 上放置一个 Static/label 控件。 给它一个适当的资源 ID IDC_STATIC1(假设)。不要选择静态控件的 Notify 属性。

    2. 为特定的静态控件添加一个成员变量。将其命名为m_sTicker,并选择 Control 类型类别。这将使变量类型自动成为 CStatic

    3. 打开类 TickerTestDlg.h,并在顶部添加行 #include "Ticker.h" 以包含 CTicker 类的声明。将类 CStatic 替换为 CTicker

    4. 向类 CTickerTestDlg 添加一个成员变量 m_TickerRect。此变量保存跑马灯的窗口坐标。

    5. 覆盖类 CTickerTestDlgOnInitDialog 函数

    6. 调用函数 m_sTicker.GetWindowRect (&m_TickerRect) 来设置跑马灯的窗口坐标。

    7. 调用一站式函数 ShowRatesShowRatesWithBkgBmp,传递以下相关参数

      • 包含报价的文件名,
      • 跑马灯上的文本颜色,
      • 汇率文本的颜色(RATES 模式),
      • 字体名称,
      • 字体高度,
      • 跑马灯速度,
      • 跑马灯模式(常规模式,仅显示信息;或者汇率模式,以公司名称格式显示信息,公司汇率略低于高度,依此类推...),
      • 位图资源 ID

      例如

      m_sTicker.ShowRates("Ticker.txt", 
                          RGB(255,255,255),
                          RGB(255,255,43),
                          "Comic Sans MS",
                          17,
                          4, 
                          MODE_RATES_TICKER);
      

      m_sTicker2.ShowRatesWithBkgBmp("Ticker2.txt", 
                                     RGB(255,255,255),
                                     RGB(255,255,43),
                                     "Arial",
                                     17,
                                     4,
                                     MODE_REGULAR_TICKER, 
                                     IDB_TICKER_BKG);
    8. 对于 MouseOver 覆盖 WM_MOUSEMOVE 消息,并向类 CTickerTestDlg 添加一个处理程序并添加以下代码
      void CTickerTestDlg::OnMouseMove(UINT nFlags, CPoint point) 
      { CDialog::OnMouseMove(nFlags, point); m_sTicker.GetWindowRect (&m_TickerRect); ClientToScreen (&point); TRACK_TICKER_MOUSEMOVE(m_sTicker, m_TickerRect) m_sTicker.ResumeTicker(); }

      看看 TRACK_TICKER_MOUSEMOVE 宏。此宏采用基于 CTicker 的对象名称,即代表窗口坐标的 CRect 对象名称。此宏会根据鼠标悬停改变 CTicker 类的两个属性,基于此在跑马灯周围绘制一个矩形边框。

    9. 对于点击转到 URL 功能,通过向类 CTickerTestDlg 添加一个处理程序并添加以下代码来处理 WM_LBUTTONUP 消息
      void CTickerTestDlg::OnLButtonUp(UINT nFlags, CPoint point)
      {         
      	CDialog::OnLButtonUp(nFlags, point);
                 
      	ClientToScreen(&point);
      	if (m_TickerRect.PtInRect (point))
      	{
      		AfxMessageBox("Will open http://finance.yahoo.com/ in the browser now");
      		ShellExecute(0 ,"open", "http://whatever.com/", NULL, NULL, SW_MAXIMIZE);
      	}
      
    10. 对于 Fetch-via-HTTP 功能,请执行以下操作:(此功能使用异步 Monikers)通过类向导(CTRL-W)添加一个新类

      覆盖 OnDataAvailableOnProgress(如果需要进度指示)消息,并将以下代码添加到 OnDataAvailable

      void CMyAsyncMon::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
      {
          if ((bscfFlag & BSCF_LASTDATANOTIFICATION) != 0)
          {
      		char* m_buffer;
      		m_buffer = (char*)malloc(dwSize*sizeof(char) + 1);
      		try {
      			UINT nBytesRead = Read(m_buffer,dwSize);
      			m_buffer[nBytesRead] = '\0';
      			CFile f1;
      			if( f1.Open( "Ticker2.txt", CFile::modeCreate | CFile::modeWrite ) ) 
      			{
      				f1.Write(m_buffer, strlen(m_buffer));
      				f1.Close();
      				//Retrive a pointer to the main window 
      				//Access the public(eeeks) variable m_sTicker2
      				//and set the text to be displayed in the ticker
      				CTickerTestDlg* pDlgMain = (CTickerTestDlg*)AfxGetMainWnd();
      				pDlgMain->m_sTicker2.SetTickerText (m_buffer);
      			}
      			free(m_buffer);
      		} 
      		catch(CFileException* pe)
      		{
      			/*	ALL THE ERROR HANDLING GOES HERE  */
      			pe->Delete ();
      		}
      	}
      	CAsyncMonikerFile::OnDataAvailable(dwSize, bscfFlag);
      }

      这是一个典型的包含公司名称/报价的带有分隔符的文本文件

    作者注

    我创建了 CTicker 类供公开使用。 如果它对您有用,在您认为我值得的地方给予认可。请给我一些反馈。

    还有更多关于服务器端 MTS 组件的文章,这些组件在运行时从网络上的各种报价提供商生成股票交易所提要。 这些服务器端组件以及客户端跑马灯(作为自定义应用程序或 ActiveX 控件)有助于创建出色的在线股票投资组合,而无需从报价提供商处订阅昂贵的股票提要。

    特别感谢 Fabian Toader 提供了 CJumpyDraw
    我从他的类中借用了 DrawLinearWash 函数来提供渐变外观。

    © . All rights reserved.