Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Implementing Context-sensitive Help in MFC Apps

0.00/5 (No votes)
22 Nov 1999 3  
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