一个闪烁控件






4.94/5 (12投票s)
2000年8月31日

135903

3801
一个为您的 MFC 应用程序提供新闻/股票跑马灯的类
引言
一个 MFC 类 CTicker
,可用于为您的 MFC 应用程序提供新闻/股票跑马灯。
想象一下,您的项目需要在一个应用程序中显示滚动信息,该应用程序可以及时提供股票、新闻、体育比分和天气信息。
“鼠标悬停”事件会停止跑马灯并突出显示边框,单击它会在您喜欢的浏览器中打开一个预定义的 URL,其中包含 html 文件中更详细的信息。网上有类似的应用程序,例如 EntryPoint。
跑马灯应持续显示变化的数据,并定期下载指定的 URL 并显示该数据。数据可以是文本格式。
我一直希望有一个现成的类可以使我的应用程序显示滚动跑马灯。我不得不求助于第三方 ActiveX 控件,这给我的应用程序增加了相当大的大小和版本管理难题。所以我自己写了一个,本着 MFC 的精神,我称之为 CTicker
。
我使用 MFC 的包装类完成了 GDI,并使用 CAsyncMonikerFile
类来实现 HTTP。
示例代码是一个基于对话框的应用程序,名为 TickerTest。可以尝试 MFC 应用程序的其他组合。
用法
要将跑马灯添加到 TickerTest,您需要执行以下操作
- 在对话框资源
IDD_TICKERTEST_DIALOG
上放置一个 Static/label 控件。 给它一个适当的资源 IDIDC_STATIC1
(假设)。不要选择静态控件的 Notify 属性。
- 为特定的静态控件添加一个成员变量。将其命名为m_sTicker,并选择 Control 类型类别。这将使变量类型自动成为
CStatic
。
- 打开类 TickerTestDlg.h,并在顶部添加行 #include "Ticker.h" 以包含
CTicker
类的声明。将类CStatic
替换为CTicker
。
- 向类
CTickerTestDlg
添加一个成员变量 m_TickerRect。此变量保存跑马灯的窗口坐标。
- 覆盖类
CTickerTestDlg
的OnInitDialog
函数
- 调用函数
m_sTicker.GetWindowRect (&m_TickerRect)
来设置跑马灯的窗口坐标。
- 调用一站式函数
ShowRates
或ShowRatesWithBkgBmp
,传递以下相关参数
- 包含报价的文件名,
- 跑马灯上的文本颜色,
- 汇率文本的颜色(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);
- 对于
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
类的两个属性,基于此在跑马灯周围绘制一个矩形边框。 - 对于点击转到 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); }
- 对于 Fetch-via-HTTP 功能,请执行以下操作:(此功能使用异步 Monikers)通过类向导(CTRL-W)添加一个新类
覆盖
OnDataAvailable
和OnProgress
(如果需要进度指示)消息,并将以下代码添加到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
函数来提供渐变外观。