332 lines
7.5 KiB
C++
332 lines
7.5 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1998 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// AtlPopusHelp.h
|
|
//
|
|
// Implementation File:
|
|
// None.
|
|
//
|
|
// Description:
|
|
// Definition of the CPopusHelp
|
|
//
|
|
// Author:
|
|
// Galen Barbee (galenb) May 18, 1998
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Notes:
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __ATLPOPUPHELP_H_
|
|
#define __ATLPOPUPHELP_H_
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Forward Class Declarations
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
struct CMapCtrlToHelpID;
|
|
template < class T > class CPopupHelp;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// External Class Declarations
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Include Files
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __ADMCOMMONRES_H_
|
|
#include "AdmCommonRes.h"
|
|
#endif // __ADMCOMMONRES_H_
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Type Definitions
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// struct CMapCtrlToHelpID
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
struct CMapCtrlToHelpID
|
|
{
|
|
DWORD m_nCtrlID;
|
|
DWORD m_nHelpCtrlID;
|
|
|
|
}; //*** struct CMapCtrlToHelpID
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// class CPopupHelp
|
|
//
|
|
// Description:
|
|
// Provide popup-help functionality.
|
|
//
|
|
// Inheritance:
|
|
// CPopupHelp
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
template < class T >
|
|
class CPopupHelp
|
|
{
|
|
typedef CPopupHelp< T > thisClass;
|
|
|
|
public:
|
|
//
|
|
// Construction
|
|
//
|
|
|
|
// Standard constructor
|
|
CPopupHelp( void )
|
|
{
|
|
} //*** CPopupHelp()
|
|
|
|
public:
|
|
//
|
|
// Message map.
|
|
//
|
|
BEGIN_MSG_MAP( thisclass )
|
|
MESSAGE_HANDLER( WM_HELP, LrOnHelp )
|
|
MESSAGE_HANDLER( WM_CONTEXTMENU, LrOnContextMenu )
|
|
END_MSG_MAP()
|
|
|
|
//
|
|
// Message handler functions.
|
|
//
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// LrOnContextMenu
|
|
//
|
|
// Routine Description:
|
|
// Message handler for WM_CONTEXTMENU
|
|
//
|
|
// Arguments:
|
|
// uMsg [IN] Message (WM_CONTEXT)
|
|
// wParam [IN] Window handle of the control being queried
|
|
// lParam [IN] Pointer coordinates. LOWORD xPos, HIWORD yPos
|
|
// bHandled [OUT]
|
|
//
|
|
// Return Value:
|
|
//
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
LRESULT LrOnContextMenu(
|
|
IN UINT uMsg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam,
|
|
OUT BOOL & bHandled
|
|
)
|
|
{
|
|
DWORD nHelpID = 0;
|
|
DWORD nCtrlID = 0;
|
|
CWindow cwnd( (HWND) wParam );
|
|
WORD xPos = LOWORD( lParam );
|
|
WORD yPos = HIWORD( lParam );
|
|
|
|
//
|
|
// Only display help if the window is visible.
|
|
//
|
|
if ( cwnd.GetStyle() & WS_VISIBLE )
|
|
{
|
|
nCtrlID = cwnd.GetDlgCtrlID();
|
|
if ( nCtrlID != 0 )
|
|
{
|
|
nHelpID = NHelpFromCtrlID( nCtrlID, reinterpret_cast< const CMapCtrlToHelpID * >( T::PidHelpMap() ) );
|
|
} // if: control has an ID
|
|
} // if: over a child window
|
|
|
|
//
|
|
// Display a popup menu.
|
|
//
|
|
if ( ( nHelpID != 0 ) && ( nHelpID != -1 ) )
|
|
{
|
|
bHandled = BContextMenu( cwnd, nHelpID, xPos, yPos );
|
|
|
|
} // if: over a child window of this dialog with a tabstop
|
|
|
|
return 1L;
|
|
|
|
} //*** LrOnContextMenu()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// LrOnHelp
|
|
//
|
|
// Routine Description:
|
|
// Message handler for WM_HELP.
|
|
//
|
|
// Arguments:
|
|
// uMsg [IN] Message (WM_HELP)
|
|
// wParam [IN]
|
|
// lParam [IN] pointer to a HELPINFO struct
|
|
// bHandled [OUT]
|
|
//
|
|
// Return Value:
|
|
//
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
LRESULT LrOnHelp(
|
|
IN UINT uMsg,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam,
|
|
OUT BOOL & bHandled
|
|
)
|
|
{
|
|
LPHELPINFO phi = (LPHELPINFO) lParam;
|
|
|
|
if ( phi->iContextType == HELPINFO_WINDOW )
|
|
{
|
|
DWORD nHelpID = 0;
|
|
|
|
nHelpID = NHelpFromCtrlID( phi->iCtrlId & 0xFFFF, (const CMapCtrlToHelpID *) T::PidHelpMap() );
|
|
if ( ( nHelpID != 0 ) && ( nHelpID != -1 ) )
|
|
{
|
|
T * pT = static_cast< T * >( this );
|
|
CBaseApp * pbap = dynamic_cast< CBaseApp * >( &_Module );
|
|
ATLASSERT( pbap != NULL );
|
|
|
|
bHandled = pT->WinHelp( pbap->PszHelpFilePath(), HELP_CONTEXTPOPUP, nHelpID );
|
|
}
|
|
}
|
|
|
|
return 1L;
|
|
|
|
} //*** LrOnHelp()
|
|
|
|
protected:
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// 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 NHelpFromCtrlID(
|
|
IN DWORD nCtrlID,
|
|
IN const CMapCtrlToHelpID * pMap
|
|
) const
|
|
{
|
|
ASSERT( pMap != NULL );
|
|
ASSERT( nCtrlID != 0 );
|
|
|
|
DWORD nHelpID = 0;
|
|
|
|
for ( ; pMap->m_nCtrlID != 0 ; pMap++ )
|
|
{
|
|
if ( pMap->m_nCtrlID == nCtrlID )
|
|
{
|
|
nHelpID = pMap->m_nHelpCtrlID;
|
|
break;
|
|
} // if: found a match
|
|
} // for: each control
|
|
|
|
Trace( g_tagAlways, _T( "NHelpFromCtrlID() - nCtrlID = %x, nHelpID = %x" ), nCtrlID, nHelpID );
|
|
|
|
return nHelpID;
|
|
|
|
} //*** NHelpFromCtrlID()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// BContextMenu
|
|
//
|
|
// Routine Description:
|
|
// Return the help ID from a control ID.
|
|
//
|
|
// Arguments:
|
|
// cwnd [IN] - control's window
|
|
// nHelpID [IN] - help context ID
|
|
// xPos [IN] - xpos of the context menu
|
|
// yPos [IN] - ypos of the context menu
|
|
//
|
|
// Return Value:
|
|
// TRUE for success, FALSE for failure
|
|
//
|
|
//--
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
BOOL BContextMenu(
|
|
IN CWindow & cwnd,
|
|
IN DWORD nHelpID,
|
|
IN WORD xPos,
|
|
IN WORD yPos
|
|
)
|
|
{
|
|
CString strMenu;
|
|
CMenu menu;
|
|
BOOL bRet = FALSE;
|
|
|
|
//
|
|
// The context menu key was pressed. Get the current mouse position and use that
|
|
//
|
|
if ( ( xPos == 0xffff ) || ( yPos == 0xffff ) )
|
|
{
|
|
POINT pPos;
|
|
|
|
if ( GetCursorPos( &pPos ) )
|
|
{
|
|
xPos = pPos.x;
|
|
yPos = pPos.y;
|
|
} // if: current cursor position retrieved successfully
|
|
} // if: context menu key was pressed
|
|
|
|
if ( strMenu.LoadString( ADMC_ID_MENU_WHATS_THIS ) )
|
|
{
|
|
if ( menu.CreatePopupMenu() )
|
|
{
|
|
if ( menu.AppendMenu( MF_STRING | MF_ENABLED, ADMC_ID_MENU_WHATS_THIS, strMenu ) )
|
|
{
|
|
DWORD nCmd;
|
|
|
|
nCmd = menu.TrackPopupMenu(
|
|
TPM_RETURNCMD | TPM_NONOTIFY | TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
|
|
xPos,
|
|
yPos,
|
|
cwnd
|
|
);
|
|
|
|
if ( nCmd != 0 )
|
|
{
|
|
CBaseApp * pbap = dynamic_cast< CBaseApp * >( &_Module );
|
|
ATLASSERT( pbap != NULL );
|
|
|
|
bRet = cwnd.WinHelp( pbap->PszHelpFilePath(), HELP_CONTEXTPOPUP, nHelpID );
|
|
} // if: any command chosen
|
|
else
|
|
{
|
|
Trace( g_tagError, _T( "OnContextMenu() - Last Error = %x" ), GetLastError() );
|
|
} // else: unknown command
|
|
} // if: menu item added successfully
|
|
} // if: popup menu created successfully
|
|
} // if: string could be loaded
|
|
|
|
return bRet;
|
|
|
|
} //*** BContextMenu()
|
|
|
|
}; //*** class CPopupHelp
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#endif // __ATLPOPUPHELP_H_
|