|
|
1.1 root 1: // This is a part of the Microsoft Foundation Classes C++ library.
2: // Copyright (C) 1992 Microsoft Corporation
3: // All rights reserved.
4: //
5: // This source code is only intended as a supplement to the
6: // Microsoft Foundation Classes Reference and Microsoft
7: // QuickHelp documentation provided with the library.
8: // See these sources for detailed information regarding the
9: // Microsoft Foundation Classes product.
10:
11:
12: #include "afxwin.h"
13: #pragma hdrstop
14:
15: #include "winhand_.h"
16:
17: #ifdef AFX_CORE_SEG
18: #pragma code_seg(AFX_CORE_SEG)
19: #endif
20:
21: #ifdef _DEBUG
22: #undef THIS_FILE
23: static char BASED_CODE THIS_FILE[] = __FILE__;
24: #define new DEBUG_NEW
25: #endif
26:
27: /////////////////////////////////////////////////////////////////////////////
28: // Map from HMENU to CMenu *
29:
30: class NEAR CMenuHandleMap : public CHandleMap
31: {
32: public:
33: CObject* NewTempObject(HANDLE h)
34: {
35: // don't add in permanent
36: CMenu* p = new CMenu();
37: p->m_hMenu = (HMENU)h; // set after constructed
38: return p;
39: }
40: void DeleteTempObject(CObject* ob)
41: {
42: ASSERT(ob->IsKindOf(RUNTIME_CLASS(CMenu)));
43: ((CMenu*)ob)->m_hMenu = NULL; // clear before destructed
44: delete ob;
45: }
46: };
47: static CMenuHandleMap NEAR hMenuMap;
48:
49: // Map from HMENU to CMenu*
50: CMenu*
51: CMenu::FromHandle(HMENU hMenu)
52: {
53: return (CMenu*)hMenuMap.FromHandle(hMenu);
54: }
55:
56: void
57: CMenu::DeleteTempMap()
58: {
59: hMenuMap.DeleteTemp();
60: }
61:
62: /////////////////////////////////////////////////////////////////////////////
63: // CMenu
64:
65: IMPLEMENT_DYNAMIC(CMenu, CObject)
66:
67: #ifdef _DEBUG
68: void CMenu::AssertValid() const
69: {
70: CObject::AssertValid();
71: }
72:
73: void CMenu::Dump(CDumpContext& dc) const
74: {
75: CObject::Dump(dc);
76: dc << "m_hMenu = " << (void NEAR*)m_hMenu;
77: }
78: #endif
79:
80: BOOL
81: CMenu::Attach(HMENU hMenu)
82: {
83: ASSERT(m_hMenu == NULL); // only attach once, detach on destroy
84: if (hMenu == NULL)
85: return FALSE;
86: hMenuMap.SetPermanent(m_hMenu = hMenu, this);
87: return TRUE;
88: }
89:
90: HMENU
91: CMenu::Detach()
92: {
93: HMENU hMenu;
94: if ((hMenu = m_hMenu) != NULL)
95: hMenuMap.RemovePermanent(m_hMenu);
96: m_hMenu = NULL;
97: return hMenu;
98: }
99:
100: CMenu::~CMenu()
101: {
102: DestroyMenu();
103: }
104:
105: BOOL
106: CMenu::DestroyMenu()
107: {
108: if (m_hMenu == NULL)
109: return FALSE;
110: return ::DestroyMenu(Detach());
111: }
112:
113: /////////////////////////////////////////////////////////////////////////////
114: // Self-drawing menu items
115:
116: void CMenu::DrawItem(LPDRAWITEMSTRUCT /* lpDrawItemStruct */)
117: {
118: // default drawing does nothing
119: }
120:
121: void CMenu::MeasureItem(LPMEASUREITEMSTRUCT /* lpMeasureItemStruct */)
122: {
123: // default drawing does nothing
124: }
125:
126:
127: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.