home *** CD-ROM | disk | FTP | other *** search
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- #include "stdafx.h"
-
- #ifdef AFX_CORE1_SEG
- #pragma code_seg(AFX_CORE1_SEG)
- #endif
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- #define new DEBUG_NEW
-
- /////////////////////////////////////////////////////////////////////////////
- // Map from HMENU to CMenu *
-
- #include "fixalloc.h"
-
- class CTempMenu : public CMenu
- {
- DECLARE_DYNCREATE(CTempMenu)
- DECLARE_FIXED_ALLOC(CTempMenu);
- };
-
- CHandleMap* PASCAL afxMapHMENU(BOOL bCreate)
- {
- AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
- if (pState->m_pmapHMENU == NULL && bCreate)
- {
- BOOL bEnable = AfxEnableMemoryTracking(FALSE);
- #ifndef _AFX_PORTABLE
- _PNH pnhOldHandler = AfxSetNewHandler(&AfxCriticalNewHandler);
- #endif
- pState->m_pmapHMENU = new CHandleMap(RUNTIME_CLASS(CTempMenu),
- offsetof(CMenu, m_hMenu)),
-
- #ifndef _AFX_PORTABLE
- AfxSetNewHandler(pnhOldHandler);
- #endif
- AfxEnableMemoryTracking(bEnable);
- }
- return pState->m_pmapHMENU;
- }
-
- CMenu* PASCAL CMenu::FromHandle(HMENU hMenu)
- {
- CHandleMap* pMap = afxMapHMENU(TRUE); // create map if not exist
- ASSERT(pMap != NULL);
- CMenu* pMenu = (CMenu*)pMap->FromHandle(hMenu);
- ASSERT(pMenu == NULL || pMenu->m_hMenu == hMenu);
- return pMenu;
- }
-
- CMenu* PASCAL CMenu::FromHandlePermanent(HMENU hMenu)
- {
- CHandleMap* pMap = afxMapHMENU();
- CMenu* pMenu = NULL;
- if (pMap != NULL)
- {
- // only look in the permanent map - does no allocations
- pMenu = (CMenu*)pMap->LookupPermanent(hMenu);
- ASSERT(pMenu == NULL || pMenu->m_hMenu == hMenu);
- }
- return pMenu;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CMenu
-
- #ifdef _DEBUG
- void CMenu::AssertValid() const
- {
- CObject::AssertValid();
- ASSERT(m_hMenu == NULL || ::IsMenu(m_hMenu));
- }
-
- void CMenu::Dump(CDumpContext& dc) const
- {
- CObject::Dump(dc);
-
- dc << "m_hMenu = " << (UINT)m_hMenu;
- dc << "\n";
- }
- #endif
-
- BOOL CMenu::Attach(HMENU hMenu)
- {
- ASSERT(m_hMenu == NULL); // only attach once, detach on destroy
- if (hMenu == NULL)
- return FALSE;
- CHandleMap* pMap = afxMapHMENU(TRUE); // create map if not exist
- ASSERT(pMap != NULL);
- pMap->SetPermanent(m_hMenu = hMenu, this);
- return TRUE;
- }
-
- HMENU CMenu::Detach()
- {
- HMENU hMenu;
- if ((hMenu = m_hMenu) != NULL)
- {
- CHandleMap* pMap = afxMapHMENU(); // don't create if not exist
- if (pMap != NULL)
- pMap->RemoveHandle(m_hMenu);
- }
- m_hMenu = NULL;
- return hMenu;
- }
-
- BOOL CMenu::DestroyMenu()
- {
- if (m_hMenu == NULL)
- return FALSE;
- return ::DestroyMenu(Detach());
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // Self-drawing menu items
-
- void CMenu::DrawItem(LPDRAWITEMSTRUCT /* lpDrawItemStruct */)
- {
- // default drawing does nothing
- }
-
- void CMenu::MeasureItem(LPMEASUREITEMSTRUCT /* lpMeasureItemStruct */)
- {
- // default drawing does nothing
- }
-
- #ifdef AFX_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
-
- IMPLEMENT_DYNCREATE(CMenu, CObject)
-
- IMPLEMENT_DYNCREATE(CTempMenu, CMenu);
-
- #pragma warning(disable: 4074)
- #pragma init_seg(compiler)
- IMPLEMENT_FIXED_ALLOC(CTempMenu, 64);
-
- /////////////////////////////////////////////////////////////////////////////
-