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.
309 lines
8.6 KiB
309 lines
8.6 KiB
//+----------------------------------------------------------------------------
|
|
//
|
|
// File: ModalDlg.cpp
|
|
//
|
|
// Module: Connection manager
|
|
//
|
|
// Synopsis: Implementation of the classes CWindowWithHelp, CModalDlg
|
|
//
|
|
// Copyright (c) 1998-1999 Microsoft Corporation
|
|
//
|
|
// Author: fengsun Created 02/17/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CWindowWithHelp::CWindowWithHelp
|
|
//
|
|
// Synopsis: Constructor
|
|
//
|
|
// Arguments: const DWORD* pHelpPairs - The pairs of control-ID/Help-ID
|
|
// const TCHAR* lpszHelpFile - The help file name, default is NULL
|
|
// Call also call SetHelpFileName() to provide help file
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
// History: fengsun Created Header 2/20/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
CWindowWithHelp::CWindowWithHelp(const DWORD* pHelpPairs, const TCHAR* lpszHelpFile)
|
|
{
|
|
m_lpszHelpFile = NULL;
|
|
m_hWnd = NULL;
|
|
m_pHelpPairs = pHelpPairs;
|
|
|
|
if (lpszHelpFile)
|
|
{
|
|
SetHelpFileName(lpszHelpFile);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CWindowWithHelp::~CWindowWithHelp
|
|
//
|
|
// Synopsis: Destructor
|
|
//
|
|
// Arguments: None
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
// History: Created Header 2/20/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
CWindowWithHelp::~CWindowWithHelp()
|
|
{
|
|
CmFree(m_lpszHelpFile);
|
|
}
|
|
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CWindowWithHelp::SetHelpFileName
|
|
//
|
|
// Synopsis: Set the help file name of the window
|
|
//
|
|
// Arguments: const TCHAR* lpszHelpFile - the help file name to set
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
// History: fengsun Created Header 2/20/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
void CWindowWithHelp::SetHelpFileName(const TCHAR* lpszHelpFile)
|
|
{
|
|
MYDBGASSERT(m_lpszHelpFile == NULL);
|
|
MYDBGASSERT(lpszHelpFile);
|
|
|
|
CmFree(m_lpszHelpFile);
|
|
m_lpszHelpFile = NULL;
|
|
|
|
if (lpszHelpFile && lpszHelpFile[0])
|
|
{
|
|
m_lpszHelpFile = CmStrCpyAlloc(lpszHelpFile);
|
|
MYDBGASSERT(m_lpszHelpFile);
|
|
}
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CWindowWithHelp::HasContextHelp
|
|
//
|
|
// Synopsis: Whether a control has context help
|
|
//
|
|
// Arguments: HWND hWndCtrl - The window handle of the control
|
|
//
|
|
// Returns: BOOL - TRUE , if the control has context help
|
|
//
|
|
// History: fengsun Created Header 2/20/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
BOOL CWindowWithHelp::HasContextHelp(HWND hWndCtrl) const
|
|
{
|
|
if (hWndCtrl == NULL || m_pHelpPairs == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// looks through the help pairs for the control
|
|
//
|
|
for (int i=0; m_pHelpPairs[i]!=0; i+=2)
|
|
{
|
|
if (m_pHelpPairs[i] == (DWORD)GetDlgCtrlID(hWndCtrl))
|
|
{
|
|
CMTRACE3(TEXT("HasContextHelp() - hwndCtrl %d has Ctrl ID %d and context help ID %d"), hWndCtrl, m_pHelpPairs[i], m_pHelpPairs[i+1]);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
CMTRACE1(TEXT("HasContextHelp() - hwndCtrl %d has no context help"), hWndCtrl);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CWindowWithHelp::OnHelp
|
|
//
|
|
// Synopsis: Call on WM_HELP message. Which means F1 is pressed
|
|
//
|
|
// Arguments: const HELPINFO* pHelpInfo - lParam of WM_HELP
|
|
//
|
|
// Returns: Nothing
|
|
//
|
|
// History: Created Header 2/17/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
void CWindowWithHelp::OnHelp(const HELPINFO* pHelpInfo)
|
|
{
|
|
//
|
|
// If help file exist and the help id exist WinHelp
|
|
//
|
|
if (m_lpszHelpFile && m_lpszHelpFile[0] && HasContextHelp((HWND) pHelpInfo->hItemHandle))
|
|
{
|
|
CmWinHelp((HWND)pHelpInfo->hItemHandle, (HWND)pHelpInfo->hItemHandle, m_lpszHelpFile, HELP_WM_HELP,
|
|
(ULONG_PTR)(LPSTR)m_pHelpPairs);
|
|
}
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CWindowWithHelp::OnContextMenu
|
|
//
|
|
// Synopsis: called upon WM_CONTEXTMENU message (Right click or '?')
|
|
//
|
|
// Arguments: HWND hWnd - Handle to the window in which the user right clicked
|
|
// the mouse
|
|
// POINT& pos - position of the cursor
|
|
//
|
|
// Returns: BOOL, TRUE if the message is processed
|
|
//
|
|
// History: fengsun Created Header 2/17/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
BOOL CWindowWithHelp::OnContextMenu(HWND hWnd, POINT& pos)
|
|
{
|
|
|
|
ScreenToClient(m_hWnd, &pos);
|
|
|
|
//
|
|
// If more than one child window contains the specified point, ChildWindowFromPoint()
|
|
// returns a handle to the first window in the list that contains the point.
|
|
// This becomes a problem if we have controls inside groupbox
|
|
//
|
|
HWND hWndChild = ChildWindowFromPointEx(m_hWnd, pos, CWP_SKIPINVISIBLE);
|
|
|
|
if (m_lpszHelpFile && m_lpszHelpFile[0] && hWndChild && HasContextHelp(hWndChild))
|
|
{
|
|
CMTRACE2(TEXT("OnContextMenu() - Calling WinHelp hWnd is %d, m_hWnd is %d"), hWnd, m_hWnd);
|
|
CmWinHelp(hWnd, hWndChild, m_lpszHelpFile, HELP_CONTEXTMENU, (ULONG_PTR)m_pHelpPairs);
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE; // Return FALSE, DefaultWindowProc will handle this message then.
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CModalDlg::DoDialogBox
|
|
//
|
|
// Synopsis: Same as DialogBox
|
|
//
|
|
// Arguments: HINSTANCE hInstance - Same as ::DialogBox
|
|
// LPCTSTR lpTemplateName -
|
|
// HWND hWndParent -
|
|
//
|
|
// Returns: int - Same as DialogBox
|
|
//
|
|
// History: Created Header 2/17/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
INT_PTR CModalDlg::DoDialogBox(HINSTANCE hInstance,
|
|
LPCTSTR lpTemplateName,
|
|
HWND hWndParent)
|
|
{
|
|
INT_PTR iRet = ::DialogBoxParamU(hInstance, lpTemplateName, hWndParent,
|
|
ModalDialogProc, (LPARAM)this);
|
|
|
|
m_hWnd = NULL;
|
|
|
|
return iRet;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: CModalDlg::ModalDialogProc
|
|
//
|
|
// Synopsis: The dialog window procedure for all dialogbox derived
|
|
//
|
|
// Arguments: HWND hwndDlg -
|
|
// UINT uMsg -
|
|
// WPARAM wParam -
|
|
// LPARAM lParam -
|
|
//
|
|
// Returns: BOOL CALLBACK -
|
|
//
|
|
// History: Created Header 2/17/98
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
INT_PTR CALLBACK CModalDlg::ModalDialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam, LPARAM lParam)
|
|
{
|
|
CModalDlg* pDlg;
|
|
|
|
//
|
|
// Save the object pointer on WM_INITDIALOG
|
|
// lParam is the pointer
|
|
//
|
|
if (uMsg == WM_INITDIALOG)
|
|
{
|
|
pDlg = (CModalDlg*) lParam;
|
|
|
|
MYDBGASSERT(lParam);
|
|
MYDBGASSERT(((CModalDlg*)lParam)->m_hWnd == NULL);
|
|
|
|
//
|
|
// Save the object pointer, this is implementation detail
|
|
// The user of this class should not be aware of this
|
|
//
|
|
::SetWindowLongU(hwndDlg, DWLP_USER, (LONG_PTR)lParam);
|
|
|
|
pDlg->m_hWnd = hwndDlg;
|
|
}
|
|
else
|
|
{
|
|
pDlg = (CModalDlg*)GetWindowLongU(hwndDlg, DWLP_USER);
|
|
|
|
//
|
|
// some msgs can come before WM_INITDIALOG
|
|
//
|
|
if (pDlg == NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
}
|
|
|
|
MYDBGASSERT(pDlg->m_hWnd == hwndDlg);
|
|
ASSERT_VALID(pDlg);
|
|
|
|
switch(uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
return pDlg->OnInitDialog();
|
|
|
|
case WM_HELP:
|
|
pDlg->OnHelp((LPHELPINFO)lParam);
|
|
return TRUE;
|
|
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
POINT pos = {LOWORD(lParam), HIWORD(lParam)};
|
|
return pDlg->OnContextMenu((HWND) wParam, pos);
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDOK:
|
|
pDlg->OnOK();
|
|
return FALSE;
|
|
|
|
case IDCANCEL:
|
|
pDlg->OnCancel();
|
|
return FALSE;
|
|
|
|
default:
|
|
return pDlg->OnOtherCommand(wParam,lParam);
|
|
}
|
|
|
|
default:
|
|
return pDlg->OnOtherMessage(uMsg, wParam, lParam);
|
|
}
|
|
}
|