Click here to Skip to main content
15,867,686 members
Articles / Desktop Programming / MFC
Article

Multiline Hyper Edit Control

Rate me:
Please Sign up or sign in to vote.
4.89/5 (33 votes)
31 Aug 2004CPOL2 min read 138.3K   4K   54   30
A multiline hyper edit control derived from CEdit.

Sample Image - hyperedit.png

Introduction

CHyperEdit was inspired by the following message post.

CHyperEdit is a drop-in replacement for the standard MFC CEdit control, and requires no additional initialization or function calls in order to be fully functional. However, it is possible to fine tune what exactly constitutes a hyperlink-able token, and can easily be achieved in a derived CHyperEdit class by overriding the virtual function IsWordHyper; click here to view example.

Features

  • Customizable hyperlink and hover colors.
  • Multiple hyperlinks mix freely with normal text.
  • Extensible hyperlink tokenizer.

API

public

  • COLORREF GetNormalColor()
  • COLORREF GetHoverColor()
  • void SetLinkColors(COLORREF clrNormal, COLORREF clrHover)
  • CString IsHyperlink(CPoint& pt)

protected

  • virtual BOOL IsWordHyper(const CString& csToken)

Usage

Basic usage

Using CHyperEdit couldn't be easier, just add a normal EDIT control to your dialog. Right click on the EDIT control you just added and select Classwizard. Click on the Member Variables tab. Double click on the control ID of the EDIT control you just added. Enter a Member Variable name and instead of Value in the Category drop down, select Control. Under the Variable Type drop down, you should now see a CHyperEdit.

Note: You may have to delete your *.clw file and rebuild it before CHyperEdit becomes available.

If the CHyperEdit class isn't available, you can just select CEdit and replace any instance of CEdit with CHyperEdit. You may also have to manually add the required #include directives before compiling.

Advanced usage

For more control over CHyperEdit, you can choose to override the default functionality of the hyperlink tokenizer and better dictate what exactly constitutes a hyperlink-able URL. For example, the following snippet extends the default behavior by only hyperlinking tokens which include www in the domain name. This would be useful if we wished to ignore IP addresses.

// Derived class overrides this function to extend hyperlinking
BOOL CMyHyperEdit::IsWordHyper(const CString& csToken) const
{
    if(IsWhiteSpace(csToken, 0)) return FALSE;
    CString csTemp(csToken); // Make a temp copy so we can convert it's case
    csTemp.MakeLower();

         // Ignore IP addresses
    if(csTemp.Left(7) == "http://www") return TRUE;

    return FALSE; // Not a valid token by default
}

Note: You could also use a readily available regex library like regex++ for much more complex syntax checking of URLs or email addresses.

IsHyperlink is a publicly available function whose purpose may not be immediately apparent; truth be told, I only now realized that it may be useful. :)

This function returns the entire hyperlink token (if any) that the mouse is currently over. If the mouse is not over any hyperlink token when this function is called, it returns the results of a CString::Empty().

With a little imagination, some interesting possibilities arise. You could, for example, use a WM_TIMER in your application and check the return value of IsHyperlink; if it returns a valid URL for a web site, you could download the HTML page and extract the TITLE and display it in a tool tip.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Canada Canada
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralPosFromChar() doesn't work in xp(or win2000) Pin
kingoHu3-Jan-11 16:09
kingoHu3-Jan-11 16:09 
GeneralFont fix for Vista Pin
Guido Sievers18-Aug-09 22:55
Guido Sievers18-Aug-09 22:55 
GeneralProblem with chinese characters Pin
javan24-May-09 2:53
javan24-May-09 2:53 
GeneralRe: Problem with chinese characters Pin
alex.barylski25-May-09 7:11
alex.barylski25-May-09 7:11 
GeneralRe: Problem with chinese characters Pin
kingoHu3-Jan-11 15:51
kingoHu3-Jan-11 15:51 
GeneralVery Nice indeed Pin
jmeaux25-Dec-07 10:14
jmeaux25-Dec-07 10:14 
QuestionOCX version Pin
Kamil Maly4-Jul-07 5:11
Kamil Maly4-Jul-07 5:11 
AnswerRe: OCX version Pin
alex.barylski4-Jul-07 8:06
alex.barylski4-Jul-07 8:06 
Questionoutputing multple lines in edit bow Pin
jamesx7730-Jun-07 1:00
jamesx7730-Jun-07 1:00 
AnswerRe: outputing multple lines in edit bow Pin
alex.barylski1-Jul-07 20:11
alex.barylski1-Jul-07 20:11 
GeneralBe fair to good old GDI... Pin
sps-itsec468-Mar-07 9:39
sps-itsec468-Mar-07 9:39 
GeneralOptimization Pin
Rewbs8-Jul-05 17:28
Rewbs8-Jul-05 17:28 
GeneralRe: Optimization Pin
alex.barylski11-Jul-05 7:10
alex.barylski11-Jul-05 7:10 
GeneralRe: Optimization Pin
conio1-Sep-05 5:04
conio1-Sep-05 5:04 
GeneralRe: Optimization Pin
ywimmer19-Oct-09 19:11
ywimmer19-Oct-09 19:11 
GeneralProblems Pin
Nguyen Van Binh3-Nov-04 18:11
Nguyen Van Binh3-Nov-04 18:11 
GeneralRe: Problems Pin
alex.barylski4-Nov-04 10:54
alex.barylski4-Nov-04 10:54 
GeneralRe: Problems Pin
Van Binh4-Nov-04 20:28
Van Binh4-Nov-04 20:28 
GeneralRe: Problems Pin
alex.barylski17-Nov-04 12:21
alex.barylski17-Nov-04 12:21 
GeneralRe: Problems Pin
Van Binh17-Nov-04 19:37
Van Binh17-Nov-04 19:37 
GeneralRe: Problems Pin
Lee Cremeans18-Aug-06 16:14
Lee Cremeans18-Aug-06 16:14 
Generalnifty... Pin
alex.barylski3-Sep-04 16:53
alex.barylski3-Sep-04 16:53 
GeneralVery nice, dropped right in Pin
gwayland2-Sep-04 8:41
gwayland2-Sep-04 8:41 
GeneralRe: Very nice, dropped right in Pin
alex.barylski2-Sep-04 10:46
alex.barylski2-Sep-04 10:46 
GeneralPerfect timing! Pin
Ravi Bhavnani1-Sep-04 5:04
professionalRavi Bhavnani1-Sep-04 5:04 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.