187 lines
5 KiB
C++
187 lines
5 KiB
C++
/**********************************************************************/
|
|
/** Microsoft Windows/NT **/
|
|
/** Copyright(c) Microsoft Corporation, 1997 - 1998 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
dialog.cpp
|
|
base dialog class to handle help
|
|
|
|
FILE HISTORY:
|
|
7/10/97 Eric Davison Created
|
|
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "dialog.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Global help map
|
|
---------------------------------------------------------------------------*/
|
|
PFN_FINDHELPMAP g_pfnHelpMap = NULL;
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
SetGlobalHelpMapFunction
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
void SetGlobalHelpMapFunction(PFN_FINDHELPMAP pfnHelpFunction)
|
|
{
|
|
g_pfnHelpMap = pfnHelpFunction;
|
|
}
|
|
|
|
|
|
|
|
IMPLEMENT_DYNAMIC(CBaseDialog, CDialog)
|
|
|
|
CBaseDialog::CBaseDialog()
|
|
{
|
|
}
|
|
|
|
CBaseDialog::CBaseDialog(UINT nIDTemplate, CWnd *pParent)
|
|
: CDialog(nIDTemplate, pParent)
|
|
{
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CBaseDialog, CDialog)
|
|
//{{AFX_MSG_MAP(CBaseDialogDlg)
|
|
// NOTE: the ClassWizard will add message map macros here
|
|
//}}AFX_MSG_MAP
|
|
ON_WM_HELPINFO()
|
|
ON_WM_CONTEXTMENU()
|
|
|
|
END_MESSAGE_MAP()
|
|
|
|
|
|
HWND FixupIpAddressHelp(HWND hwndItem)
|
|
{
|
|
HWND hwndParent;
|
|
TCHAR szClassName[32]; // should be enough to hold "RtrIpAddress"
|
|
|
|
// If any of these calls fail, bail and pass the call down
|
|
hwndParent = ::GetParent(hwndItem);
|
|
if (hwndParent)
|
|
{
|
|
if (::GetClassName(hwndParent, szClassName, DimensionOf(szClassName)))
|
|
{
|
|
// Ensure that the string is NULL terminated
|
|
szClassName[DimensionOf(szClassName)-1] = 0;
|
|
|
|
if (lstrcmpi(szClassName, TEXT("IPAddress")) == 0)
|
|
{
|
|
// Ok, this control is part of the IP address
|
|
// control, return the handle of the parent
|
|
hwndItem = hwndParent;
|
|
}
|
|
}
|
|
|
|
}
|
|
return hwndItem;
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
CBaseDialog::OnHelpInfo
|
|
Brings up the context-sensitive help for the controls.
|
|
Author: EricDav
|
|
---------------------------------------------------------------------------*/
|
|
BOOL CBaseDialog::OnHelpInfo(HELPINFO* pHelpInfo)
|
|
{
|
|
int i;
|
|
DWORD dwCtrlId;
|
|
|
|
if (pHelpInfo->iContextType == HELPINFO_WINDOW)
|
|
{
|
|
DWORD * pdwHelp = GetHelpMapInternal();
|
|
|
|
if (pdwHelp)
|
|
{
|
|
// Ok to fix the f**king help for the f**king IP address
|
|
// controls, we will need to add special case code. If we
|
|
// can't find the id of our control in our list, then we look
|
|
// to see if this is the child of the "RtrIpAddress" control, if
|
|
// so then we change the pHelpInfo->hItemHandle to point to the
|
|
// handle of the ip address control rather than the control in
|
|
// the ip addrss control. *SIGH*
|
|
dwCtrlId = ::GetDlgCtrlID((HWND) pHelpInfo->hItemHandle);
|
|
for (i=0; pdwHelp[i]; i+=2)
|
|
{
|
|
if (pdwHelp[i] == dwCtrlId)
|
|
break;
|
|
}
|
|
|
|
if (pdwHelp[i] == 0)
|
|
{
|
|
// Ok, we didn't find the control in our list, so let's
|
|
// check to see if it's part of the IP address control.
|
|
pHelpInfo->hItemHandle = FixupIpAddressHelp((HWND) pHelpInfo->hItemHandle);
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
LPCTSTR pszTemp = AfxGetApp()->m_pszHelpFilePath;
|
|
#endif
|
|
::WinHelp ((HWND)pHelpInfo->hItemHandle,
|
|
AfxGetApp()->m_pszHelpFilePath,
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR)pdwHelp);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
CBaseDialog::OnContextMenu
|
|
Brings up the help context menu for those controls that don't
|
|
usually have context menus (i.e. buttons). Note that this won't
|
|
work for static controls since they just eat up all messages.
|
|
Author: EricDav
|
|
---------------------------------------------------------------------------*/
|
|
void CBaseDialog::OnContextMenu(CWnd* pWnd, CPoint point)
|
|
{
|
|
if (this == pWnd)
|
|
return;
|
|
|
|
DWORD * pdwHelp = GetHelpMapInternal();
|
|
|
|
if (pdwHelp)
|
|
{
|
|
::WinHelp (pWnd->m_hWnd,
|
|
AfxGetApp()->m_pszHelpFilePath,
|
|
HELP_CONTEXTMENU,
|
|
(ULONG_PTR)pdwHelp);
|
|
}
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
CBaseDialog::GetHelpMapInternal
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
DWORD * CBaseDialog::GetHelpMapInternal()
|
|
{
|
|
DWORD * pdwHelpMap = NULL;
|
|
DWORD dwIDD = 0;
|
|
|
|
// if (HIWORD(m_lpszTemplateName) == 0)
|
|
// dwIDD = LOWORD((DWORD) m_lpszTemplateName);
|
|
if ((ULONG_PTR) m_lpszTemplateName < 0xFFFF)
|
|
dwIDD = (WORD) m_lpszTemplateName;
|
|
|
|
// If there is no dialog IDD, give up
|
|
// If there is no global help map function, give up
|
|
if ((dwIDD == 0) ||
|
|
(g_pfnHelpMap == NULL) ||
|
|
((pdwHelpMap = g_pfnHelpMap(dwIDD)) == NULL))
|
|
return GetHelpMap();
|
|
|
|
return pdwHelpMap;
|
|
}
|
|
|