A Ticker control






4.94/5 (12 votes)
Aug 31, 2000

135018

3801
A class that provides a news/stock ticker for your MFC applications
Introduction
An MFC class CTicker
that could be used to provide a
news/stock ticker for your MFC applications.
Imagine there is a requirement in your project where you need to display scrolling information in an application that delivers timely information on stocks, news, sports scores, and weather.
A 'Mouse Over' event stops the ticker and highlights the border, and clicking on it would open a predefined URL in your favourite browser with more detailed information in the html files. There are similar applications available on the net, for example EntryPoint.
The ticker should continuously display changing data and download the URL specified at regular intervals and display that data. The data can be in text format.
I always wished there was a readymade class that enabled my application to
display a scrolling ticker. I had to resort to Third party ActiveX controls which
added considerable size to my applications and versioning headaches. So I wrote
one myself and in the spirit of MFC I call it CTicker
.
I have done GDI with MFC's wrapper classes and used the CAsyncMonikerFile
class
to achieve HTTP.
The sample code is a Dialog based app called TickerTest. One could try out other combinations of MFC applications.
Usage
To add the ticker to TickerTest you need to do the following:
- Drop a Static/label control on the dialog resource
IDD_TICKERTEST_DIALOG
. Give it an appropriate resource idIDC_STATIC1
(say). Do not select the Notify property for the static control.
- Add a member variable for the particular static control. Give it
the name m_sTicker & select a category of type Control. This would make
the variable type
CStatic
automatically.
- Open the class TickerTestDlg.h and add the line #include "Ticker.h" on top
to include the declarations of the
CTicker
class. Replace the classCStatic
withCTicker
.
- Add a member variable m_TickerRect to the class
CTickerTestDlg
. This variable holds the window coordinates for the ticker.
- Override the
OnInitDialog
function for the classCTickerTestDlg
- Call the function
m_sTicker.GetWindowRect (&m_TickerRect)
to set the ticker's window coordinates.
- Call the one stop function
ShowRates
or theShowRatesWithBkgBmp
passing it the following relevant parameters:
- Name of the file containing the quotes,
- Text color on ticker,
- Color of text of rates(RATES mode),
- FontName,
- FontHeight,
- TickerSpeed,
- TickerMode (Regular mode which displays only information OR the Rates mode which displays information in the format CompanyName followed by CompanyRate slightly below in height and so on...),
- Bitmap Resource ID
eg:
m_sTicker.ShowRates("Ticker.txt", RGB(255,255,255), RGB(255,255,43), "Comic Sans MS", 17, 4, MODE_RATES_TICKER);
or
m_sTicker2.ShowRatesWithBkgBmp("Ticker2.txt", RGB(255,255,255), RGB(255,255,43), "Arial", 17, 4, MODE_REGULAR_TICKER, IDB_TICKER_BKG);
- For the
MouseOver
overrideWM_MOUSEMOVE
message, and add a handler to the classCTickerTestDlg
and add the following codevoid 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(); }Take a look at the
TRACK_TICKER_MOUSEMOVE
macro. This Macro takes theCTicker
based object name theCRect
object name representing the window coordinates. This macro changes two properties of theCTicker
class based on which it draws a Rectangular border around the ticker on mouseover. - For the Click-go-to-URL feature handle the WM_LBUTTONUP message by adding a handler
to the class
CTickerTestDlg
and add the following codevoid 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); }
- For the Fetch-via-HTTP feature do the following: (This feature uses Asynchronous
Monikers) Add a new Class through the class wizard(CTRL-W)
Override the
OnDataAvailable
andOnProgress
(If progress indication is required) messages and add the following code toOnDataAvailable
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); }
This is how a typical TextFile containing CompanyName/Quotes with delimiters are:
Authors Note
I made the class CTicker
for open use. If it
works with you please give credit where I
deserve. Please send me some feedback .
There are more articles coming on server side MTS Components which generates stock exchange feed at runtime from various quote providers on the net. These server side components along with the client side ticker(as a custom app or an activeX control) help in creation of a great Online Stock Portfolio WITHOUT subscribing to expensive stock feed from quote providers.
Special thanks to Fabian Toader for providing The CJumpyDraw
class
I have borrowed the DrawLinearWash
function from his class to provide the gradient look.