|
|
//+----------------------------------------------------------------------------
//
// 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); } }
|