Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

280 lines
7.2 KiB

/////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1996-1997 Microsoft Corporation
//
// Module Name:
// DlgHelp.cpp
//
// Abstract:
// Implementation of the CDialogHelp class.
//
// Author:
// David Potter (davidp) February 6, 1997
//
// Revision History:
//
// Notes:
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DlgHelp.h"
#include "TraceTag.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Global Variables
/////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
CTraceTag g_tagDlgHelp(_T("Help"), _T("DLG HELP"), 0);
#endif
/////////////////////////////////////////////////////////////////////////////
// CDialogHelp class
/////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CDialogHelp, CObject)
/////////////////////////////////////////////////////////////////////////////
//++
//
// CDialogHelp::CDialogHelp
//
// Routine Description:
// Constructor.
//
// Arguments:
// pmap [IN] Map array mapping control IDs to help IDs.
// dwMask [IN] Mask to use for the low word of the help ID.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
CDialogHelp::CDialogHelp(IN const CMapCtrlToHelpID * pmap, IN DWORD dwMask)
{
ASSERT(pmap != NULL);
CommonConstruct();
m_pmap = pmap;
m_dwMask = dwMask;
} //*** CDialogHelp::CDialogHelp()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CDialogHelp::CommonConstruct
//
// Routine Description:
// Do common construction.
//
// Arguments:
// None.
//
// Return Value:
// None.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CDialogHelp::CommonConstruct(void)
{
m_pmap = NULL;
} //*** CDialogHelp::CommonConstruct()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CDialogHelp::NHelpFromCtrlID
//
// Routine Description:
// Return the help ID from a control ID.
//
// Arguments:
// nCtrlID [IN] ID of control to search for.
//
// Return Value:
// nHelpID Help ID associated with the control.
//
//--
/////////////////////////////////////////////////////////////////////////////
DWORD CDialogHelp::NHelpFromCtrlID(IN DWORD nCtrlID) const
{
DWORD nHelpID = 0;
const CMapCtrlToHelpID * pmap = Pmap();
ASSERT(pmap != NULL);
ASSERT(nCtrlID != 0);
for ( ; pmap->m_nCtrlID != 0 ; pmap++)
{
if (pmap->m_nCtrlID == nCtrlID)
{
if (pmap->m_nHelpCtrlID == -1)
nHelpID = (DWORD) -1;
else
//nHelpID = (pmap->m_nHelpCtrlID << 16) | (DwMask() & 0xFFFF);
nHelpID = pmap->m_nHelpCtrlID;
break;
} // if: found a match
} // for: each control
Trace(g_tagDlgHelp, _T("NHelpFromCtrlID() - nCtrlID = %x, nHelpID = %x"), nCtrlID, nHelpID);
return nHelpID;
} //*** CDialogHelp::NHelpFromCtrlID()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CDialogHelp::OnContextMenu
//
// Routine Description:
// Handler for the WM_CONTEXTMENU message.
//
// Arguments:
// pWnd Window in which user clicked the right mouse button.
// point Position of the cursor, in screen coordinates.
//
// Return Value:
// TRUE Help processed.
// FALSE Help not processed.
//
//--
/////////////////////////////////////////////////////////////////////////////
void CDialogHelp::OnContextMenu(CWnd * pWnd, CPoint point)
{
CWnd * pwndChild;
CPoint ptDialog;
DWORD nHelpID = 0;
ASSERT(pWnd != NULL);
m_nHelpID = 0;
// Convert the point into dialog coordinates.
ptDialog = point;
pWnd->ScreenToClient(&ptDialog);
// Find the control the cursor is over.
{
DWORD nCtrlID;
pwndChild = pWnd->ChildWindowFromPoint(ptDialog);
if (pwndChild != NULL && pwndChild->m_hWnd != NULL)
{
nCtrlID = pwndChild->GetDlgCtrlID();
if (nCtrlID != 0)
nHelpID = NHelpFromCtrlID(nCtrlID);
} // if: over a child window
} // Find the control the cursor is over
// Display a popup menu.
if ((nHelpID != 0) && (nHelpID != -1))
{
CString strMenu;
CMenu menu;
try
{
strMenu.LoadString(IDS_MENU_WHATS_THIS);
} // try
catch (CMemoryException * pme)
{
pme->Delete();
return;
} // catch: CMemoryException
if (menu.CreatePopupMenu())
{
if (menu.AppendMenu(MF_STRING | MF_ENABLED, ID_HELP, strMenu))
{
m_nHelpID = nHelpID;
menu.TrackPopupMenu(
TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
point.x,
point.y,
AfxGetMainWnd()
);
} // if: menu item added successfully
menu.DestroyMenu();
} // if: popup menu created successfully
} // if: over a child window of this dialog with a tabstop
} //*** CDialogHelp::OnContextMenu()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CDialogHelp::OnHelpInfo
//
// Routine Description:
// Handler for the WM_HELPINFO message.
//
// Arguments:
// pHelpInfo Structure containing info about displaying help.
//
// Return Value:
// TRUE Help processed.
// FALSE Help not processed.
//
//--
/////////////////////////////////////////////////////////////////////////////
BOOL CDialogHelp::OnHelpInfo(HELPINFO * pHelpInfo)
{
// If this is for a control, display control-specific help.
if ((pHelpInfo->iContextType == HELPINFO_WINDOW)
&& (pHelpInfo->iCtrlId != 0))
{
DWORD nHelpID = NHelpFromCtrlID(pHelpInfo->iCtrlId);
if (nHelpID != 0)
{
if (nHelpID != -1)
AfxGetApp()->WinHelp(nHelpID, HELP_CONTEXTPOPUP);
return TRUE;
} // if: found the control in the list
} // if: need help on a specific control
// Display dialog help.
return FALSE;
} //*** CDialogHelp::OnHelpInfo()
/////////////////////////////////////////////////////////////////////////////
//++
//
// CDialogHelp::OnCommandHelp
//
// Routine Description:
// Handler for the WM_COMMANDHELP message.
//
// Arguments:
// WPARAM [IN] Passed on to base class method.
// lParam [IN] Help ID.
//
// Return Value:
// TRUE Help processed.
// FALSE Help not processed.
//
//--
/////////////////////////////////////////////////////////////////////////////
LRESULT CDialogHelp::OnCommandHelp(WPARAM wParam, LPARAM lParam)
{
if (m_nHelpID != 0)
lParam = m_nHelpID;
AfxGetApp()->WinHelp((DWORD)lParam, HELP_CONTEXTPOPUP);
return TRUE;
// return CDialog::OnCommandHelp(wParam, lParam);
} //*** CDialogHelp::OnCommandHelp()