www.pudn.com > vc开发的精美界面.zip > BCGMDIFrameWnd.cpp
//******************************************************************************* // COPYRIGHT NOTES // --------------- // This source code is a part of BCGControlBar library. // You may use, compile or redistribute it as part of your application // for free. You cannot redistribute it as a part of a software development // library without the agreement of the author. If the sources are // distributed along with the application, you should leave the original // copyright notes in the source code without any changes. // This code can be used WITHOUT ANY WARRANTIES on your own risk. // // For the latest updates to this library, check my site: // http://welcome.to/bcgsoft // // Stas Levin//******************************************************************************* // BCGMDIFrameWnd.cpp : implementation file // #include "stdafx.h" #include "BCGMDIFrameWnd.h" #include "BCGToolbar.h" #include "BCGMenuBar.h" #include "BCGPopupMenu.h" #include "BCGToolbarMenuButton.h" #include "BCGSizingControlBar.h" #include "bcglocalres.h" #include "bcgbarres.h" #include "BCGDockContext.h" #include "BCGWindowsManagerDlg.h" #include "BCGUserToolsManager.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CBCGMDIFrameWnd IMPLEMENT_DYNCREATE(CBCGMDIFrameWnd, CMDIFrameWnd) #pragma warning (disable : 4355) CBCGMDIFrameWnd::CBCGMDIFrameWnd() : m_Impl (this), m_hmenuWindow (NULL), m_bContextHelp (FALSE), m_bDoSubclass (TRUE), m_uiWindowsDlgMenuId (0), m_bShowWindowsDlgAlways (FALSE) { } #pragma warning (default : 4355) CBCGMDIFrameWnd::~CBCGMDIFrameWnd() { } BEGIN_MESSAGE_MAP(CBCGMDIFrameWnd, CMDIFrameWnd) //{{AFX_MSG_MAP(CBCGMDIFrameWnd) ON_WM_MENUCHAR() ON_WM_WINDOWPOSCHANGED() ON_WM_ACTIVATE() ON_WM_CLOSE() //}}AFX_MSG_MAP ON_REGISTERED_MESSAGE(BCGM_CREATETOOLBAR, OnToolbarCreateNew) ON_REGISTERED_MESSAGE(BCGM_DELETETOOLBAR, OnToolbarDelete) ON_COMMAND( ID_CONTEXT_HELP, OnContextHelp) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CBCGMDIFrameWnd message handlers BOOL CBCGMDIFrameWnd::OnSetMenu (HMENU hmenu) { if (m_Impl.m_pMenuBar != NULL) { m_Impl.m_pMenuBar->CreateFromMenu (hmenu == NULL ? m_Impl.m_hDefaultMenu : hmenu); return TRUE; } return FALSE; } //******************************************************************************************* BOOL CBCGMDIFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (!CMDIFrameWnd::OnCreateClient(lpcs, pContext)) { return FALSE; } if (m_bDoSubclass) { m_wndClientArea.SubclassWindow (m_hWndMDIClient); } return TRUE; } //******************************************************************************************* LRESULT CBCGMDIFrameWnd::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) { if (m_Impl.OnMenuChar (nChar)) { return MAKELPARAM (MNC_EXECUTE, -1); } return CMDIFrameWnd::OnMenuChar(nChar, nFlags, pMenu); } //******************************************************************************************* void CBCGMDIFrameWnd::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) { CMDIFrameWnd::OnWindowPosChanged(lpwndpos); if (m_Impl.m_pMenuBar != NULL) { BOOL bMaximized; CMDIChildWnd* pChild = MDIGetActive (&bMaximized); if (pChild == NULL || !bMaximized) { m_Impl.m_pMenuBar->SetMaximizeMode (FALSE); } else { m_Impl.m_pMenuBar->SetMaximizeMode (TRUE, pChild); } } } //******************************************************************************************* BOOL CBCGMDIFrameWnd::PreTranslateMessage(MSG* pMsg) { switch (pMsg->message) { case WM_SYSKEYDOWN: case WM_CONTEXTMENU: if (m_Impl.m_pActivePopupMenu != NULL && ::IsWindow (m_Impl.m_pActivePopupMenu->m_hWnd) && pMsg->wParam == VK_MENU) { m_Impl.m_pActivePopupMenu->SendMessage (WM_CLOSE); return TRUE; } else if (m_Impl.ProcessKeyboard ((int) pMsg->wParam)) { return TRUE; } break; case WM_SYSKEYUP: // if (m_Impl.m_pMenuBar != NULL) // Bt Sven Ritter if (m_Impl.m_pMenuBar != NULL && (VK_MENU == pMsg->wParam)) { if (m_Impl.m_pMenuBar == GetFocus ()) { SetFocus (); } else { m_Impl.m_pMenuBar->SetFocus (); } return TRUE; } if (m_Impl.m_pActivePopupMenu != NULL && ::IsWindow (m_Impl.m_pActivePopupMenu->m_hWnd)) { return TRUE; // To prevent system menu opening } break; case WM_KEYDOWN: //----------------------------------------- // Pass keyboard action to the active menu: //----------------------------------------- if (m_Impl.ProcessKeyboard ((int) pMsg->wParam)) { return TRUE; } break; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: { CPoint pt (LOWORD(pMsg->lParam), HIWORD(pMsg->lParam)); CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd); if (pWnd != NULL) { pWnd->ClientToScreen (&pt); } if (m_Impl.ProcessMouseClick (pMsg->message, pt, pMsg->hwnd)) { return TRUE; } if (pMsg->message == WM_RBUTTONUP && !CBCGToolBar::IsCustomizeMode ()) { //--------------------------------------- // Activate the control bar context menu: //--------------------------------------- CDockBar* pBar = DYNAMIC_DOWNCAST(CDockBar, pWnd); if (pBar != NULL) { CPoint pt; pt.x = LOWORD(pMsg->lParam); pt.y = HIWORD(pMsg->lParam); pBar->ClientToScreen(&pt); SendMessage (BCGM_TOOLBARMENU, (WPARAM) 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 (m_Impl.ProcessMouseClick (pMsg->message, CPoint (LOWORD(pMsg->lParam), HIWORD(pMsg->lParam)), pMsg->hwnd)) { return TRUE; } break; case WM_MOUSEMOVE: { CPoint pt (LOWORD(pMsg->lParam), HIWORD(pMsg->lParam)); CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd); if (pWnd != NULL) { pWnd->ClientToScreen (&pt); } if (m_Impl.ProcessMouseMove (pt)) { return TRUE; } } } return CMDIFrameWnd::PreTranslateMessage(pMsg); } //******************************************************************************************* BOOL CBCGMDIFrameWnd::OnCommand(WPARAM wParam, LPARAM lParam) { if (HIWORD (wParam) == 1) { UINT uiCmd = LOWORD (wParam); CBCGToolBar::AddCommandUsage (uiCmd); //--------------------------- // Simmulate ESC keystroke... //--------------------------- if (m_Impl.ProcessKeyboard (VK_ESCAPE)) { return TRUE; } if (g_pUserToolsManager != NULL && g_pUserToolsManager->InvokeTool (uiCmd)) { return TRUE; } } if (!CBCGToolBar::IsCustomizeMode ()) { return CMDIFrameWnd::OnCommand(wParam, lParam); } return FALSE; } //******************************************************************************************* HMENU CBCGMDIFrameWnd::GetWindowMenuPopup (HMENU hMenuBar) { m_hmenuWindow = CMDIFrameWnd::GetWindowMenuPopup (hMenuBar); return m_hmenuWindow; } //******************************************************************************************** BOOL CBCGMDIFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) { m_Impl.m_nIDDefaultResource = nIDResource; if (!CMDIFrameWnd::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)) { return FALSE; } m_Impl.OnLoadFrame (); return TRUE; } //******************************************************************************************* void CBCGMDIFrameWnd::OnClose() { m_Impl.OnCloseFrame(); CMDIFrameWnd::OnClose(); } //******************************************************************************************* BOOL CBCGMDIFrameWnd::PreCreateWindow(CREATESTRUCT& cs) { m_Impl.RestorePosition(cs); return CMDIFrameWnd::PreCreateWindow(cs); } //******************************************************************************************* BOOL CBCGMDIFrameWnd::ShowPopupMenu (CBCGPopupMenu* pMenuPopup) { if (!m_Impl.OnShowPopupMenu (pMenuPopup, this)) { return FALSE; } if (!CBCGToolBar::IsCustomizeMode () && m_hmenuWindow != NULL && pMenuPopup != NULL && pMenuPopup->GetMenu () != NULL) { //----------------------------------------------------------- // Check the popup menu for the "Windows..." menu maching...: //----------------------------------------------------------- HMENU hMenuPop = pMenuPopup->GetMenu (); BOOL bIsWindowMenu = FALSE; int iItemMax = ::GetMenuItemCount (hMenuPop); for (int iItemPop = 0; !bIsWindowMenu && iItemPop < iItemMax; iItemPop ++) { UINT nID = ::GetMenuItemID( hMenuPop, iItemPop); bIsWindowMenu = (nID >= AFX_IDM_WINDOW_FIRST && nID <= AFX_IDM_WINDOW_LAST); } if (bIsWindowMenu) { CMenu* pMenu = CMenu::FromHandle (m_hmenuWindow); if (pMenu != NULL) { int iCount = (int) pMenu->GetMenuItemCount (); BOOL bIsFirstWindowItem = TRUE; BOOL bIsStandradWindowsDlg = FALSE; for (int i = 0; i < iCount; i ++) { UINT uiCmd = pMenu->GetMenuItemID (i); if (uiCmd < AFX_IDM_FIRST_MDICHILD || uiCmd == (UINT) -1) { continue; } if (m_uiWindowsDlgMenuId != 0 && uiCmd == AFX_IDM_FIRST_MDICHILD + 9) { // Don't add standrd "Windows..." command bIsStandradWindowsDlg = TRUE; continue; } if (bIsFirstWindowItem) { pMenuPopup->InsertSeparator (); bIsFirstWindowItem = FALSE; } CString strText; pMenu->GetMenuString (i, strText, MF_BYPOSITION); CBCGToolbarMenuButton button (uiCmd, NULL /* No submenus - assume */, -1, strText); UINT uiState = pMenu->GetMenuState (i, MF_BYPOSITION); if (uiState & MF_CHECKED) { button.m_nStyle |= TBBS_CHECKED; } pMenuPopup->InsertItem (button); } if (m_uiWindowsDlgMenuId != 0 && (bIsStandradWindowsDlg || m_bShowWindowsDlgAlways)) { if (!CBCGToolBar::GetBasicCommands ().IsEmpty ()) { CBCGToolBar::AddBasicCommand (m_uiWindowsDlgMenuId); } //----------------------------- // Add our "Windows..." dialog: //----------------------------- pMenuPopup->InsertItem ( CBCGToolbarMenuButton (m_uiWindowsDlgMenuId, NULL, -1, m_strWindowsDlgMenuText)); } } } } if (pMenuPopup != NULL && pMenuPopup->m_bShown) { return TRUE; } return OnShowPopupMenu (pMenuPopup); } //********************************************************************************** void CBCGMDIFrameWnd::OnClosePopupMenu (CBCGPopupMenu* pMenuPopup) { if (m_Impl.m_pActivePopupMenu == pMenuPopup) { m_Impl.m_pActivePopupMenu = NULL; } } //******************************************************************************************* LRESULT CBCGMDIFrameWnd::OnToolbarCreateNew(WPARAM,LPARAM lp) { ASSERT (lp != NULL); return (LRESULT) m_Impl.CreateNewToolBar ((LPCTSTR) lp); } //*************************************************************************************** LRESULT CBCGMDIFrameWnd::OnToolbarDelete(WPARAM,LPARAM lp) { CBCGToolBar* pToolbar = (CBCGToolBar*) lp; ASSERT_VALID (pToolbar); return (LRESULT) m_Impl.DeleteToolBar (pToolbar); } //*************************************************************************************** void CBCGMDIFrameWnd::WinHelp(DWORD dwData, UINT nCmd) { if (dwData > 0 || !m_bContextHelp) { CMDIFrameWnd::WinHelp(dwData, nCmd); } else { OnContextHelp (); } } //*************************************************************************************** void CBCGMDIFrameWnd::OnContextHelp () { m_bContextHelp = TRUE; if (!m_bHelpMode && CanEnterHelpMode()) { CBCGToolBar::SetHelpMode (); } CMDIFrameWnd::OnContextHelp (); if (!m_bHelpMode) { CBCGToolBar::SetHelpMode (FALSE); } m_bContextHelp = FALSE; } //**************************************************************************************** void CBCGMDIFrameWnd::EnableDocking (DWORD dwDockStyle) { m_Impl.FrameEnableDocking (this, dwDockStyle); m_pFloatingFrameClass = RUNTIME_CLASS(CBCGMiniDockFrameWnd); } //*************************************************************************************** void CBCGMDIFrameWnd::DockControlBarLeftOf (CControlBar* pBar, CControlBar* pLeftOf) { m_Impl.DockControlBarLeftOf (pBar, pLeftOf); } //*************************************************************************************** void CBCGMDIFrameWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CMDIFrameWnd::OnActivate(nState, pWndOther, bMinimized); if (nState == WA_CLICKACTIVE) { UpdateWindow (); } } //*************************************************************************************** void CBCGMDIFrameWnd::EnableWindowsDialog (UINT uiMenuId, LPCTSTR lpszMenuText, BOOL bShowAllways) { ASSERT (lpszMenuText != NULL); ASSERT (uiMenuId != 0); m_uiWindowsDlgMenuId = uiMenuId; m_strWindowsDlgMenuText = lpszMenuText; m_bShowWindowsDlgAlways = bShowAllways; } //**************************************************************************** void CBCGMDIFrameWnd::ShowWindowsDialog () { CBCGLocalResource locaRes; CBCGWindowsManagerDlg dlg (this); dlg.DoModal (); }