![]() |
Desktop Development »
Static & Panel Controls »
Custom Controls
Intermediate
Hyperlink ScrollerBy Weiye ChenAn article on scrolling your hyperlinks, something like a news ticker |
VC6, VC7Win2K, WinXP, MFC, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
This article is about a subclassed static control which you can use to scroll hyperlinks from right to left. I once used it to scroll news headlines as hyperlinks in an application.
The source for this subclassed control is in ScrollLink.h and ScrollLink.cpp.
In it, you will find 2 classes, CScrollLink and CTextFrame.
The latter is used by CScrollLink for each hyperlink to scroll, so you don't
really need to know much about it to use this hyperlink scroller. To use it, you
need to use a Static control and subclassed with CScrollLink. Note that you need
to check the 'Notify' property of the static control.
The code listed below will show you how to
#define CLR_RED RGB(255, 0, 0) // Red color #define CLR_BLUE RGB(0, 0, 255) // Blue color #define CLR_BLACK RGB(0, 0, 0) // Black color #define CLR_GRAY RGB(178, 178, 178) // Gray color #define CLR_WHITE RGB(255, 255, 255) // White color #define SCROLLRATE 1 // Frequency of timer #define SCROLLSPEED 1 // Amount of pixels to scroll #define SCROLLALLOWANCE 50 // Amount of pixels between 2 scroll text
CScrollLink::CScrollLink()
{
// Empty array
m_oTextFrames.RemoveAll();
m_iTextFramesScrolling.RemoveAll();
// Scroll rate is the value used in SetTimer(), which scrolls your hyperlinks to
// the left by x pixels, where x is the scroll speed value. Scroll allowance is the
// gap in pixels between 2 scrolling hyperlinks
m_uiScrollRate = SCROLLRATE;
m_uiScrollSpeed = SCROLLSPEED;
m_uiScrollAllowance = SCROLLALLOWANCE;
// The text of the hyperlink will be black if there is no url for it. If not, it will
// be blue. The color of the hyperlink is set to red when mouse it is hovered and the
// background color of the control is set to the same as the button color.
m_clrText = CLR_BLACK;
m_clrHover = CLR_RED;
m_clrBackground = GetSysColor(COLOR_BTNFACE);
// Set flag
m_bOnHover = FALSE;
}
This hyperlink scroller uses the same font as its parent. You can change its
font attributes for the scrolling text as well as when it is hovered in
CreateTextFonts as show below.
void CScrollLink::CreateTextFonts(void) { // Get window font CFont* pFont = GetFont(); // Create LOGFONT structure LOGFONT lfLogFont; // Get LOGFONT structure of current font pFont->GetLogFont(&lfLogFont); // Set font to be bold lfLogFont.lfWeight = FW_BOLD; // Create normal font that is bold (when not hovered) m_oNormalFont.CreateFontIndirect(&lfLogFont); // Set underline attribute lfLogFont.lfUnderline = TRUE; // Create current font with underline attribute (when hovered) m_oUnderlinedFont.CreateFontIndirect(&lfLogFont); }
3) Add hyperlink name and its url for scrolling.
Now to add your hyperlink to the scroller, you should use AddScrollText as
shown below. Note that you can pass an empty url string and the scrolled text
will appear as a normal text instead of a hyperlink.
BOOL CScrollLink::AddScrollText(CString strText /* Text to scroll */, CString strURL /* URL behind scrolled text */) { // Allocate memory for CTextFrame object CTextFrame* pTextFrame = new CTextFrame(strText, strURL); // Check if memory allocation successful if (pTextFrame != NULL) { // Store object into array m_oTextFrames.Add(pTextFrame); // Assign null pointer value pTextFrame = NULL; // Indicate success return TRUE; } // Indicate failure return FALSE; }
And to clear all the hyperlinks that you have added, call RemoveAllScrollText.
BOOL CScrollLink::RemoveAllScrollText(void) { // Remove all scroll text DeleteTextFrames(); // Repaint Invalidate(); // Indicate success return TRUE; }
After you have added your hyperlinks details, call StartScrolling to begin
scrolling them.
/* bRestart = Flag to indicate whether to restart scrolling */ BOOL CScrollLink::StartScrolling(BOOL bRestart) { // Make sure there are text to scroll if (m_oTextFrames.GetSize() > 0) { // Stop timer if any KillTimer(ID_SCROLLTIMER); // Check if scrolling is to be restarted if (bRestart == TRUE) { // Empty array of indexes of current scrolling text frames m_iTextFramesScrolling.RemoveAll(); // Store index of the first text frame to be scrolling m_iTextFramesScrolling.Add(0); // Initialize size of text and its starting position PrepareTextFramesForScrolling(); // Clear any previous scroll text Invalidate(); } // Scrolling is to be continued else {} // Start timer SetTimer(ID_SCROLLTIMER, SCROLLRATE, NULL); // Indicate success return TRUE; } // Indicate failure return FALSE; }
Well, I need to apologize if my code comments appear vague. I am still improving on that. Also, I know that some of my code could be further improved, so I will be open to your comments, suggestions and criticisms.
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 21 Nov 2002 Editor: Chris Maunder |
Copyright 2002 by Weiye Chen Everything else Copyright © CodeProject, 1999-2009 Web18 | Advertise on the Code Project |