Click here to Skip to main content
15,884,388 members
Articles / Programming Languages / C++
Article

Implementing Context-sensitive Help in MFC Apps

Rate me:
Please Sign up or sign in to vote.
3.83/5 (6 votes)
22 Nov 19992 min read 124.3K   2.7K   30   15
Implementing context-sensitive Help in MFC apps.

Introduction

I am implementing context-sensitive Help in my MFC app, and, as always with Windows programming, it isn't quite as simple as we'd like it to be. I found that to get the behavior I wanted, I had to tweak the message handling in the dialogs and Property Sheets a little. The result was that I created 2 base classes for all my dialogs and Property Sheets. These are CHelpDlg and CHelpPrSheet. You should be able to use these as is in your apps as well.

Features

  1. Provides general Help for the dialog when F1 is pressed.
  2. Provides context Help for the control with focus when Shift + F1 is pressed. (An alternative is to show the floating pointer when Shift + F1 is pressed. See code for how to do this.)
  3. Provides context-sensitive Help for controls in your dialog.
  4. (Dialog only) Provides general Help for the dialog if you include a button with ID = IDHELP.

Requirements

When creating your Visual Studio project, make sure you check Context-sensitive Help in the AppWizard. I'm assuming you are somewhat familiar with the support that MFC provides for context-sensitive Help. If not, read TN028 on MSDN.

Dialog Boxes

  1. Build your dialog box using the resource editor as you normally would.
  2. If you want context-sensitive Help, make sure you check the Context Help check box in the More Styles tab of the resource editor.
  3. For any controls that you want context-sensitive Help, make sure you check the Help ID check box in the General tab of the resource editor.
  4. If you want a Help button in your dialog, put one there with the ID = IDHELP.
  5. Use Class Wizard and derive from CDialog.
  6. Edit the .h and .cpp files and make CHelpDlg the base class instead of CDialog. Note: you must replace all refs to CDialog with CHelpDlg.

Property Sheets

  1. Build your Property Pages as you normally would.
  2. If you want context-sensitive Help, make sure you check the Context Help check box in the More Styles tab of the resource editor.
  3. For any controls that you want context-sensitive Help, make sure you check the Help ID check box in the General tab of the resource editor.
  4. Use Class Wizard and derive from CPropertyPage as you normally would.
  5. Use Class Wizard and create a new class derived from CPropertySheet.
  6. Edit the .h and .cpp files and make CHelpPrSheet the base class instead of CPropertySheet. Note you must replace all refs to CPropertySheet with CHelpPrSheet.

Implementation Notes

There are 2 main tricks employed here. First, is handling the WM_HELPINFO message. The default handler that MFC supplies doesn't do the right thing for context Help. Here is what the handler looks like:

BOOL CHelpDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
    // TODO: Add your message handler code here and/or call default
 
    if(pHelpInfo->iContextType == HELPINFO_WINDOW) {
        AfxGetApp()->WinHelp(pHelpInfo->dwContextId, HELP_CONTEXTPOPUP);
    }

    return(TRUE);
}

The other trick is figuring out what you want to do with F1 and Shift + F1. My solution is to trap a magical mystical undocumented MFC msg 0x4d and handle it in PreTranslateMessage as shown below:

BOOL CHelpDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class

    // Magical mystical MFC F1 Help msg!
    if(pMsg->message == 0x4d) 
    {
        if (GetKeyState(VK_SHIFT) > = 0) 
        {
            // Shift key not down

            // Supply general dialog level help
            OnCommandHelp(0, 0);

            return(TRUE); // Eat it
        }
#ifdef FLOATING_ARROW
        else 
        {
            // Use this if you want Shift+F1
            // to create the floating arrow instead
            SendMessage(WM_SYSCOMMAND, SC_CONTEXTHELP);

            return(TRUE);
        }
#endif // FLOATING_ARROW
    }

    return CDialog::PreTranslateMessage(pMsg);
}

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


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

Comments and Discussions

 
QuestionProblem with F1 key with HTMLHelp Pin
DougVC30-Apr-09 4:53
DougVC30-Apr-09 4:53 
GeneralProblems with F1 key Pin
Lucecilla7-Dec-05 5:38
Lucecilla7-Dec-05 5:38 
GeneralRe: Problems with F1 key Pin
JKJKJK29-Dec-05 5:08
JKJKJK29-Dec-05 5:08 
Generalproblem with Demo Pin
olis16-Mar-04 21:37
olis16-Mar-04 21:37 
GeneralRe: problem with Demo Pin
jkaspzyk30-Sep-04 6:52
jkaspzyk30-Sep-04 6:52 
GeneralRe: problem with Demo Pin
okline17-Oct-04 20:40
okline17-Oct-04 20:40 
QuestionAnother solution? Pin
Sam Hobbs5-Mar-03 12:51
Sam Hobbs5-Mar-03 12:51 
Generalurgent help !!! Pin
cindrella20-Oct-02 9:57
cindrella20-Oct-02 9:57 
GeneralCompile problems Pin
Dessi10-Sep-02 11:22
Dessi10-Sep-02 11:22 
GeneralRe: Compile problems Pin
Peter Moss12-Sep-02 3:04
Peter Moss12-Sep-02 3:04 
GeneralRe: Compile problems Pin
Weishan7-Aug-03 10:15
Weishan7-Aug-03 10:15 
Can you tell me how to "substitute the path to your Visual Studio 6.0 installation"? I appreciate it.

GeneralRe: Compile problems Pin
stephangeue5-Dec-03 5:21
stephangeue5-Dec-03 5:21 
GeneralAWESOME !!!! Pin
Anonymous26-Aug-02 11:06
Anonymous26-Aug-02 11:06 
QuestionWho could help me ? Pin
8-Oct-01 0:25
suss8-Oct-01 0:25 
AnswerRe: Who could help me ? Pin
Roger Allen21-Aug-02 1:58
Roger Allen21-Aug-02 1:58 

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.