windows-nt/Source/XPSP1/NT/base/cluster/admin/common/atlpopuphelp.h
2020-09-26 16:20:57 +08:00

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_