www.pudn.com > ÍøÂç¶Ë¿Ú¼àÊÓ.rar > BCGPDlgImpl.cpp


// BCGPDlgImpl.cpp: implementation of the CBCGPDlgImpl class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "bcgcbpro.h" 
#include "BCGPPopupMenu.h" 
#include "BCGPToolbarMenuButton.h" 
#include "BCGPDialog.h" 
#include "BCGPPropertyPage.h" 
#include "BCGPDlgImpl.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
HHOOK CBCGPDlgImpl::m_hookMouse = NULL; 
CBCGPDlgImpl* CBCGPDlgImpl::m_pMenuDlgImpl = NULL; 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CBCGPDlgImpl::CBCGPDlgImpl(CWnd& dlg) : 
	m_Dlg (dlg) 
{ 
} 
 
CBCGPDlgImpl::~CBCGPDlgImpl() 
{ 
 
} 
//******************************************************************************************* 
BOOL CBCGPDlgImpl::ProcessMouseClick (POINT pt) 
{ 
	if (!CBCGPToolBar::IsCustomizeMode () && 
		CBCGPPopupMenu::m_pActivePopupMenu != NULL && 
		::IsWindow (CBCGPPopupMenu::m_pActivePopupMenu->m_hWnd)) 
	{ 
		CBCGPPopupMenu::MENUAREA_TYPE clickArea = CBCGPPopupMenu::m_pActivePopupMenu->CheckArea (pt); 
 
		if (clickArea == CBCGPPopupMenu::OUTSIDE) 
		{ 
			// Click outside of menu 
 
			//-------------------------------------------- 
			// Maybe secondary click on the parent button? 
			//-------------------------------------------- 
			CBCGPToolbarMenuButton* pParentButton =  
				CBCGPPopupMenu::m_pActivePopupMenu->GetParentButton (); 
			if (pParentButton != NULL) 
			{ 
				CWnd* pWndParent = pParentButton->GetParentWnd (); 
				if (pWndParent != NULL) 
				{ 
					CBCGPPopupMenuBar* pWndParentPopupMenuBar =  
						DYNAMIC_DOWNCAST (CBCGPPopupMenuBar, pWndParent); 
 
					CPoint ptClient = pt; 
					pWndParent->ScreenToClient (&ptClient); 
 
					if (pParentButton->Rect ().PtInRect (ptClient)) 
					{ 
						//------------------------------------------------------- 
						// If user clicks second time on the parent button, 
						// we should close an active menu on the toolbar/menubar 
						// and leave it on the popup menu: 
						//------------------------------------------------------- 
						if (pWndParentPopupMenuBar == NULL && 
							!CBCGPPopupMenu::m_pActivePopupMenu->InCommand ()) 
						{ 
							//---------------------------------------- 
							// Toolbar/menu bar: close an active menu! 
							//---------------------------------------- 
							CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_CLOSE); 
						} 
 
						return TRUE; 
					} 
 
					if (pWndParentPopupMenuBar != NULL) 
					{ 
						pWndParentPopupMenuBar->CloseDelayedSubMenu (); 
						 
						CBCGPPopupMenu* pWndParentPopupMenu =  
							DYNAMIC_DOWNCAST (CBCGPPopupMenu,  
							pWndParentPopupMenuBar->GetParent ()); 
 
						if (pWndParentPopupMenu != NULL) 
						{ 
							CBCGPPopupMenu::MENUAREA_TYPE clickAreaParent =  
								pWndParentPopupMenu->CheckArea (pt); 
 
							switch (clickAreaParent) 
							{ 
							case CBCGPPopupMenu::MENU: 
							case CBCGPPopupMenu::TEAROFF_CAPTION: 
							case CBCGPPopupMenu::LOGO: 
								return FALSE; 
 
							case CBCGPPopupMenu::SHADOW_RIGHT: 
							case CBCGPPopupMenu::SHADOW_BOTTOM: 
								pWndParentPopupMenu->SendMessage (WM_CLOSE); 
								m_Dlg.SetFocus (); 
 
								return TRUE; 
							} 
						} 
					} 
				} 
			} 
 
			if (!CBCGPPopupMenu::m_pActivePopupMenu->InCommand ()) 
			{ 
				CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_CLOSE); 
 
				CWnd* pWndFocus = CWnd::GetFocus (); 
				if (pWndFocus != NULL && pWndFocus->IsKindOf (RUNTIME_CLASS (CBCGPToolBar))) 
				{ 
					m_Dlg.SetFocus (); 
				} 
 
				if (clickArea != CBCGPPopupMenu::OUTSIDE)	// Click on shadow 
				{ 
					return TRUE; 
				} 
			} 
		} 
		else if (clickArea == CBCGPPopupMenu::SHADOW_RIGHT || 
				clickArea == CBCGPPopupMenu::SHADOW_BOTTOM) 
		{ 
			// By Martha  
			CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_CLOSE); 
			m_Dlg.SetFocus (); 
 
			return TRUE; 
		} 
	} 
 
	return FALSE; 
} 
//******************************************************************************************* 
BOOL CBCGPDlgImpl::ProcessMouseMove (POINT pt) 
{ 
	if (!CBCGPToolBar::IsCustomizeMode () && 
		CBCGPPopupMenu::m_pActivePopupMenu != NULL) 
	{ 
		CRect rectMenu; 
		CBCGPPopupMenu::m_pActivePopupMenu->GetWindowRect (rectMenu); 
 
		if (rectMenu.PtInRect (pt) || 
			CBCGPPopupMenu::m_pActivePopupMenu->GetMenuBar ()->FindDestBar (pt) != NULL) 
		{ 
			return FALSE;	// Default processing 
		} 
 
		return TRUE;		// Active menu "capturing" 
	} 
 
	return FALSE;	// Default processing 
} 
//************************************************************************************** 
BOOL CBCGPDlgImpl::PreTranslateMessage(MSG* pMsg)  
{ 
	switch (pMsg->message) 
	{ 
	case WM_SYSKEYDOWN: 
	case WM_CONTEXTMENU: 
		if (CBCGPPopupMenu::m_pActivePopupMenu != NULL && 
			::IsWindow (CBCGPPopupMenu::m_pActivePopupMenu->m_hWnd) && 
			pMsg->wParam == VK_MENU) 
		{ 
			CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_CLOSE); 
			return TRUE; 
		} 
		break; 
 
	case WM_SYSKEYUP: 
		if (CBCGPPopupMenu::m_pActivePopupMenu != NULL && 
			::IsWindow (CBCGPPopupMenu::m_pActivePopupMenu->m_hWnd)) 
		{ 
			return TRUE;	// To prevent system menu opening 
		} 
		break; 
 
	case WM_KEYDOWN: 
		//----------------------------------------- 
		// Pass keyboard action to the active menu: 
		//----------------------------------------- 
		if (CBCGPPopupMenu::m_pActivePopupMenu != NULL && 
			::IsWindow (CBCGPPopupMenu::m_pActivePopupMenu->m_hWnd)) 
		{ 
			CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_KEYDOWN, (int) pMsg->wParam); 
			return TRUE; 
		} 
		break; 
 
	case WM_LBUTTONDOWN: 
	case WM_RBUTTONDOWN: 
	case WM_RBUTTONUP: 
	case WM_MBUTTONDOWN: 
	case WM_MBUTTONUP: 
		{ 
			CPoint pt (BCG_GET_X_LPARAM(pMsg->lParam), BCG_GET_Y_LPARAM(pMsg->lParam)); 
			CWnd* pWnd = CWnd::FromHandle (pMsg->hwnd); 
 
			if (pWnd != NULL) 
			{ 
				pWnd->ClientToScreen (&pt); 
			} 
 
			if (ProcessMouseClick (pt)) 
			{ 
				return TRUE; 
			} 
 
			if (!::IsWindow (pMsg->hwnd)) 
			{ 
				return TRUE; 
			} 
 
			if (pMsg->message == WM_RBUTTONUP && 
				!CBCGPToolBar::IsCustomizeMode ()) 
			{ 
				//--------------------------------------- 
				// Activate the control bar context menu: 
				//--------------------------------------- 
				CDockBar* pBar = DYNAMIC_DOWNCAST(CDockBar, pWnd); 
				if (pBar != NULL) 
				{ 
					CPoint pt; 
 
					pt.x = BCG_GET_X_LPARAM(pMsg->lParam); 
					pt.y = BCG_GET_Y_LPARAM(pMsg->lParam); 
					pBar->ClientToScreen(&pt); 
 
					m_Dlg.SendMessage (BCGM_TOOLBARMENU, 
								(WPARAM) m_Dlg.GetSafeHwnd (), 
								MAKELPARAM (pt.x, pt.y)); 
				} 
			} 
		} 
		break; 
 
	case WM_NCLBUTTONDOWN: 
	case WM_NCLBUTTONUP: 
	case WM_NCRBUTTONDOWN: 
	case WM_NCRBUTTONUP: 
	case WM_NCMBUTTONDOWN: 
	case WM_NCMBUTTONUP: 
		if (ProcessMouseClick (CPoint (BCG_GET_X_LPARAM(pMsg->lParam), BCG_GET_Y_LPARAM(pMsg->lParam)))) 
		{ 
			return TRUE; 
		} 
		break; 
 
	case WM_MOUSEMOVE: 
		{ 
			CPoint pt (BCG_GET_X_LPARAM(pMsg->lParam), BCG_GET_Y_LPARAM(pMsg->lParam)); 
			CWnd* pWnd = CWnd::FromHandle (pMsg->hwnd); 
 
			if (pWnd != NULL) 
			{ 
				pWnd->ClientToScreen (&pt); 
			} 
 
			if (ProcessMouseMove (pt)) 
			{ 
				return TRUE; 
			} 
		} 
	} 
 
	return FALSE; 
} 
//********************************************************************************** 
LRESULT CALLBACK CBCGPDlgImpl::BCGDlgMouseProc (int nCode, WPARAM wParam, LPARAM lParam) 
{ 
	MOUSEHOOKSTRUCT* lpMS = (MOUSEHOOKSTRUCT*) lParam; 
	ASSERT (lpMS != NULL); 
 
	if (m_pMenuDlgImpl != NULL) 
	{ 
		switch (wParam) 
		{ 
		case WM_LBUTTONDOWN: 
		case WM_RBUTTONDOWN: 
		case WM_MBUTTONDOWN: 
		case WM_NCLBUTTONDOWN: 
		case WM_NCRBUTTONDOWN: 
		case WM_NCMBUTTONDOWN: 
			{ 
				CPoint ptCursor; 
				::GetCursorPos (&ptCursor); 
 
				CRect rectWindow; 
				m_pMenuDlgImpl->m_Dlg.GetWindowRect (rectWindow); 
 
				if (!rectWindow.PtInRect (ptCursor)) 
				{ 
					m_pMenuDlgImpl->ProcessMouseClick (ptCursor); 
				} 
			} 
		} 
	} 
 
	return CallNextHookEx (m_hookMouse, nCode, wParam, lParam); 
} 
//**************************************************************************************** 
void CBCGPDlgImpl::SetActiveMenu (CBCGPPopupMenu* pMenu) 
{ 
	CBCGPPopupMenu::m_pActivePopupMenu = pMenu; 
 
	if (pMenu != NULL) 
	{ 
		if (m_hookMouse == NULL) 
		{ 
			m_hookMouse = ::SetWindowsHookEx (WH_MOUSE, BCGDlgMouseProc,  
				0, GetCurrentThreadId ()); 
		} 
 
		m_pMenuDlgImpl = this; 
	} 
	else  
	{ 
		if (m_hookMouse != NULL) 
		{ 
			::UnhookWindowsHookEx (m_hookMouse); 
			m_hookMouse = NULL; 
		} 
 
		m_pMenuDlgImpl = NULL; 
	} 
 
} 
//**************************************************************************************** 
void CBCGPDlgImpl::OnDestroy () 
{ 
	if (m_pMenuDlgImpl != NULL && 
		m_pMenuDlgImpl->m_Dlg.GetSafeHwnd () == m_Dlg.GetSafeHwnd ()) 
	{ 
		m_pMenuDlgImpl = NULL; 
	} 
} 
//**************************************************************************************** 
BOOL CBCGPDlgImpl::OnCommand (WPARAM wParam, LPARAM /*lParam*/) 
{ 
	if (HIWORD (wParam) == 1) 
	{ 
		UINT uiCmd = LOWORD (wParam); 
 
		CBCGPToolBar::AddCommandUsage (uiCmd); 
 
		//--------------------------- 
		// Simmulate ESC keystroke... 
		//--------------------------- 
		if (CBCGPPopupMenu::m_pActivePopupMenu != NULL && 
			::IsWindow (CBCGPPopupMenu::m_pActivePopupMenu->m_hWnd)) 
		{ 
			CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_KEYDOWN, VK_ESCAPE); 
			return TRUE; 
		} 
 
		if (g_pUserToolsManager != NULL && 
			g_pUserToolsManager->InvokeTool (uiCmd)) 
		{ 
			return TRUE; 
		} 
	} 
 
	return FALSE; 
} 
//*************************************************************************************** 
void CBCGPDlgImpl::OnNcActivate (BOOL& bActive) 
{ 
	//---------------------------------------- 
	// Stay active if WF_STAYACTIVE bit is on: 
	//---------------------------------------- 
	if (m_Dlg.m_nFlags & WF_STAYACTIVE) 
	{ 
		bActive = TRUE; 
	} 
 
	//-------------------------------------------------- 
	// But do not stay active if the window is disabled: 
	//-------------------------------------------------- 
	if (!m_Dlg.IsWindowEnabled ()) 
	{ 
		bActive = FALSE; 
	} 
} 
//**************************************************************************************** 
void CBCGPDlgImpl::OnActivate(UINT nState, CWnd* pWndOther) 
{ 
	m_Dlg.m_nFlags &= ~WF_STAYACTIVE; 
 
	//-------------------------------------------------- 
	// Determine if this window should be active or not: 
	//-------------------------------------------------- 
	CWnd* pWndActive = (nState == WA_INACTIVE) ? pWndOther : &m_Dlg; 
	if (pWndActive != NULL) 
	{ 
		BOOL bStayActive = (pWndActive->GetSafeHwnd () == m_Dlg.GetSafeHwnd () || 
			pWndActive->SendMessage (WM_FLOATSTATUS, FS_SYNCACTIVE)); 
 
		if (bStayActive) 
		{ 
			m_Dlg.m_nFlags |= WF_STAYACTIVE; 
		} 
	} 
	else  
	{ 
		//------------------------------------------ 
		// Force painting on our non-client area.... 
		//------------------------------------------ 
		m_Dlg.SendMessage (WM_NCPAINT, 1); 
	} 
}