mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
3.3 KiB
147 lines
3.3 KiB
// This is a part of the Microsoft Foundation Classes C++ library.
|
|
// Copyright (C) 1992-1995 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 *
|
|
|
|
static CHandleMap* afxMapHMENU(BOOL bCreate = FALSE);
|
|
|
|
static CHandleMap* 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(CMenu),
|
|
offsetof(CMenu, m_hMenu)),
|
|
|
|
#ifndef _AFX_PORTABLE
|
|
AfxSetNewHandler(pnhOldHandler);
|
|
#endif
|
|
AfxEnableMemoryTracking(bEnable);
|
|
}
|
|
return pState->m_pmapHMENU;
|
|
}
|
|
|
|
void PASCAL CMenu::DeleteTempMap()
|
|
{
|
|
CHandleMap* pMap = afxMapHMENU();
|
|
if (pMap != NULL)
|
|
pMap->DeleteTemp();
|
|
}
|
|
|
|
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)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|