📄 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);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -