📄 bcgpframeimpl.cpp
字号:
strProfileName += strTearOffBarsRegEntry;
for (int iIndex = 0;; iIndex++)
{
CString strKey;
strKey.Format (_T("%s-%d"), strProfileName, iIndex);
int iId = 0;
CBCGPToolBar* pToolBar = NULL;
CString strName;
CBCGPRegistrySP regSP;
CBCGPRegistry& reg = regSP.Create (FALSE, TRUE);
if (!reg.Open (strKey) ||
!reg.Read (_T("ID"), iId) ||
!reg.Read (_T("Name"), strName) ||
!reg.Read (_T("State"), (CObject*&) pToolBar))
{
break;
}
ASSERT_VALID (pToolBar);
if (!pToolBar->Create (m_pFrame,
dwDefaultToolbarStyle,
(UINT) iId))
{
TRACE0 ("Failed to create a new toolbar!\n");
delete pToolBar;
break;
}
pToolBar->SetWindowText (strName);
pToolBar->SetBarStyle (pToolBar->GetBarStyle () |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
pToolBar->EnableDocking (CBRS_ALIGN_ANY);
ASSERT_VALID (m_pDockManager);
m_listTearOffToolbars.AddTail (pToolBar);
pToolBar->LoadState (strProfileName, iIndex);
m_pDockManager->DockControlBar (pToolBar);
}
}
//**************************************************************************************
void CBCGPFrameImpl::SaveTearOffMenus (BOOL bFrameBarsOnly)
{
CString strProfileName = g_pWorkspace != NULL ?
g_pWorkspace->GetRegSectionPath() : _T("");
strProfileName += strTearOffBarsRegEntry;
//------------------------------------------------
// First, clear old tear-off toolbars in registry:
//------------------------------------------------
for (int iIndex = 0;; iIndex++)
{
CString strKey;
strKey.Format (_T("%s-%d"), strProfileName, iIndex);
CBCGPRegistrySP regSP;
CBCGPRegistry& reg = regSP.Create (FALSE, FALSE);
if (!reg.DeleteKey (strKey))
{
break;
}
}
iIndex = 0;
for (POSITION pos = m_listTearOffToolbars.GetHeadPosition (); pos != NULL; iIndex ++)
{
CBCGPBaseControlBar* pBar = (CBCGPBaseControlBar*) m_listTearOffToolbars.GetNext (pos);
ASSERT_VALID (pBar);
if ((!bFrameBarsOnly || pBar->GetTopLevelFrame () == m_pFrame) &&
pBar->IsBarVisible ())
{
CString strName;
pBar->GetWindowText (strName);
CString strKey;
strKey.Format (_T("%s-%d"), strProfileName, iIndex);
CBCGPRegistrySP regSP;
CBCGPRegistry& reg = regSP.Create (FALSE, FALSE);
reg.CreateKey (strKey);
reg.Write (_T("ID"), (int) pBar->GetDlgCtrlID ());
reg.Write (_T("Name"), strName);
reg.Write (_T("State"), pBar);
pBar->SaveState (strProfileName, iIndex);
}
}
}
//**************************************************************************************
BOOL CBCGPFrameImpl::DeleteToolBar (CBCGPToolBar* pToolBar)
{
ASSERT_VALID (m_pFrame);
ASSERT_VALID (pToolBar);
POSITION pos = m_listUserDefinedToolbars.Find (pToolBar);
if (pos == NULL)
{
return FALSE;
}
m_listUserDefinedToolbars.RemoveAt (pos);
pToolBar->RemoveStateFromRegistry (m_strControlBarRegEntry);
CBCGPDockBar* pParentDockBar = pToolBar->GetParentDockBar ();
CBCGPMiniFrameWnd* pParentMiniFrame = pToolBar->GetParentMiniFrame ();
if (pParentDockBar != NULL)
{
ASSERT_VALID (pParentDockBar);
pParentDockBar->RemoveControlBar (pToolBar, DM_UNKNOWN);
}
else if (pParentMiniFrame != NULL)
{
ASSERT_VALID (pParentMiniFrame);
pParentMiniFrame->RemoveControlBar (pToolBar);
}
pToolBar->DestroyWindow ();
delete pToolBar;
m_pFrame->RecalcLayout ();
return TRUE;
}
//*******************************************************************************************
void CBCGPFrameImpl::SetMenuBar (CBCGPMenuBar* pMenuBar)
{
ASSERT_VALID (m_pFrame);
ASSERT_VALID (pMenuBar);
ASSERT (m_pMenuBar == NULL); // Method should be called once!
m_pMenuBar = pMenuBar;
m_hDefaultMenu=*m_pFrame->GetMenu();
// ET: Better support for dynamic menu
m_pMenuBar->OnDefaultMenuLoaded (m_hDefaultMenu);
m_pMenuBar->CreateFromMenu (m_hDefaultMenu, TRUE /* Default menu */);
m_pFrame->SetMenu (NULL);
m_pMenuBar->SetDefaultMenuResId (m_nIDDefaultResource);
}
//*******************************************************************************************
BOOL CBCGPFrameImpl::ProcessKeyboard (int nKey, BOOL* pbProcessAccel)
{
ASSERT_VALID (m_pFrame);
if (pbProcessAccel != NULL)
{
*pbProcessAccel = TRUE;
}
//--------------------------------------------------------
// If popup menu is active, pass keyboard control to menu:
//--------------------------------------------------------
if (CBCGPPopupMenu::m_pActivePopupMenu != NULL &&
::IsWindow (CBCGPPopupMenu::m_pActivePopupMenu->m_hWnd))
{
CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_KEYDOWN, nKey);
return TRUE;
}
//------------------------------------------
// If appication is minimized, don't handle
// any keyboard accelerators:
//------------------------------------------
if (m_pFrame->IsIconic ())
{
return TRUE;
}
//----------------------------------------------------------
// Don't handle keybaord accererators in customization mode:
//----------------------------------------------------------
if (CBCGPToolBar::IsCustomizeMode ())
{
return FALSE;
}
//-----------------------------------------------------
// Is any toolbar control (such as combobox) has focus?
//-----------------------------------------------------
BOOL bIsToolbarCtrlFocus = FALSE;
for (POSITION posTlb = gAllToolbars.GetHeadPosition ();
!bIsToolbarCtrlFocus && posTlb != NULL;)
{
CBCGPToolBar* pToolBar = (CBCGPToolBar*) gAllToolbars.GetNext (posTlb);
ASSERT (pToolBar != NULL);
if (CWnd::FromHandlePermanent (pToolBar->m_hWnd) != NULL)
{
ASSERT_VALID(pToolBar);
for (int i = 0; i < pToolBar->GetCount (); i++)
{
CBCGPToolbarButton* pButton = pToolBar->GetButton (i);
ASSERT_VALID (pButton);
if (pButton->HasFocus ())
{
bIsToolbarCtrlFocus = TRUE;
break;
}
}
}
}
//-------------------------------------
// Check for the keyboard accelerators:
//-------------------------------------
BYTE fVirt = 0;
if (::GetAsyncKeyState (VK_CONTROL) & 0x8000)
{
fVirt |= FCONTROL;
}
if (::GetAsyncKeyState (VK_MENU) & 0x8000)
{
fVirt |= FALT;
}
if (::GetAsyncKeyState (VK_SHIFT) & 0x8000)
{
fVirt |= FSHIFT;
}
if (!bIsToolbarCtrlFocus)
{
if (CBCGPKeyboardManager::IsKeyHandled ((WORD) nKey, (BYTE)(fVirt | FVIRTKEY),
m_pFrame, TRUE) ||
CBCGPKeyboardManager::IsKeyHandled ((WORD) nKey, (BYTE)(fVirt | FVIRTKEY),
m_pFrame->GetActiveFrame (), FALSE))
{
return FALSE;
}
}
if (fVirt == FALT)
{
//--------------------------------------------
// Handle menu accelerators (such as "Alt-F"):
//--------------------------------------------
if (OnMenuChar (nKey))
{
return TRUE;
}
}
if (bIsToolbarCtrlFocus && pbProcessAccel != NULL)
{
//---------------------------------------------
// Don't process default keyboard accelerators:
//---------------------------------------------
*pbProcessAccel = FALSE;
}
return FALSE;
}
//*******************************************************************************************
BOOL CBCGPFrameImpl::ProcessMouseClick (UINT uiMsg, POINT pt, HWND hwnd)
{
ASSERT_VALID (m_pFrame);
//------------------------------------------------
// Maybe user start drag the button with control?
//------------------------------------------------
if (uiMsg == WM_LBUTTONDOWN &&
(CBCGPToolBar::IsCustomizeMode () ||
(::GetAsyncKeyState (VK_MENU) & 0x8000))) // ALT is pressed
{
for (POSITION posTlb = gAllToolbars.GetHeadPosition (); posTlb != NULL;)
{
CBCGPToolBar* pToolBar = (CBCGPToolBar*) gAllToolbars.GetNext (posTlb);
ASSERT (pToolBar != NULL);
if (CWnd::FromHandlePermanent (pToolBar->m_hWnd) != NULL)
{
ASSERT_VALID(pToolBar);
CPoint ptToolBar = pt;
pToolBar->ScreenToClient (&ptToolBar);
int iHit = pToolBar->HitTest (ptToolBar);
if (iHit >= 0)
{
CBCGPToolbarButton* pButton = pToolBar->GetButton (iHit);
ASSERT_VALID (pButton);
if (pButton->GetHwnd () != NULL &&
pButton->GetHwnd () == hwnd &&
pButton->Rect ().PtInRect (ptToolBar))
{
pToolBar->SendMessage (WM_LBUTTONDOWN,
0, MAKELPARAM (ptToolBar.x, ptToolBar.y));
return TRUE;
}
break;
}
}
}
}
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_pFrame->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_pFrame->SetFocus ();
}
if (clickArea != CBCGPPopupMenu::OUTSIDE) // Click on shadow
{
return TRUE;
}
}
}
else if (clickArea == CBCGPPopupMenu::SHADOW_RIGHT ||
clickArea == CBCGPPopupMenu::SHADOW_BOTTOM)
{
CBCGPPopupMenu::m_pActivePopupMenu->SendMessage (WM_CLOSE);
m_pFrame->SetFocus ();
return TRUE;
}
}
return FALSE;
}
//*******************************************************************************************
BOOL CBCGPFrameImpl::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 CBCGPFrameImpl::OnShowPopupMenu (CBCGPPopupMenu* pMenuPopup, CFrameWnd* /*pWndFrame*/)
{
CBCGPPopupMenu::m_pActivePopupMenu = pMenuPopup;
if (pMenuPopup != NULL && IsCustomizePane(pMenuPopup))
{
ShowQuickCustomizePane(pMenuPopup);
}
if (pMenuPopup != NULL && !CBCGPToolBar::IsCustomizeMode ())
{
ASSERT_VALID (pMenuPopup);
CBCGPBaseControlBar* pTopLevelBar = NULL;
for (CBCGPPopupMenu* pMenu = pMenuPopup; pMenu != NULL;
pMenu = pMenu->GetParentPopupMenu ())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -