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"
- #include "occimpl.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
-
- /////////////////////////////////////////////////////////////////////////////
- // CCmdTarget construction/destruction
-
- CCmdTarget::CCmdTarget()
- {
- // capture module state where object was constructed
- #ifdef _AFXDLL
- m_pModuleState = AfxGetModuleState();
- ASSERT(m_pModuleState != NULL);
- #endif
-
- // initialize state
- #ifndef _AFX_NO_OLE_SUPPORT
- m_dwRef = 1;
- m_pOuterUnknown = NULL;
- m_xInnerUnknown = 0;
- m_xDispatch.m_vtbl = 0;
- m_bResultExpected = TRUE;
- m_xConnPtContainer.m_vtbl = 0;
- #endif
- }
-
- CCmdTarget::~CCmdTarget()
- {
- #ifndef _AFX_NO_OLE_SUPPORT
- if (m_xDispatch.m_vtbl != 0)
- ((COleDispatchImpl*)&m_xDispatch)->Disconnect();
- ASSERT(m_dwRef <= 1);
- #endif
- #ifdef _AFXDLL
- m_pModuleState = NULL;
- #endif
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CCmdTarget windows message dispatching
-
- AFX_STATIC BOOL AFXAPI _AfxDispatchCmdMsg(CCmdTarget* pTarget, UINT nID, int nCode,
- AFX_PMSG pfn, void* pExtra, UINT nSig, AFX_CMDHANDLERINFO* pHandlerInfo)
- // return TRUE to stop routing
- {
- ASSERT_VALID(pTarget);
- UNUSED(nCode); // unused in release builds
-
- union MessageMapFunctions mmf;
- mmf.pfn = pfn;
- BOOL bResult = TRUE; // default is ok
-
- if (pHandlerInfo != NULL)
- {
- // just fill in the information, don't do it
- pHandlerInfo->pTarget = pTarget;
- pHandlerInfo->pmf = mmf.pfn;
- return TRUE;
- }
-
- switch (nSig)
- {
- case AfxSig_vv:
- // normal command or control notification
- ASSERT(CN_COMMAND == 0); // CN_COMMAND same as BN_CLICKED
- ASSERT(pExtra == NULL);
- (pTarget->*mmf.pfn_COMMAND)();
- break;
-
- case AfxSig_bv:
- // normal command or control notification
- ASSERT(CN_COMMAND == 0); // CN_COMMAND same as BN_CLICKED
- ASSERT(pExtra == NULL);
- bResult = (pTarget->*mmf.pfn_bCOMMAND)();
- break;
-
- case AfxSig_vw:
- // normal command or control notification in a range
- ASSERT(CN_COMMAND == 0); // CN_COMMAND same as BN_CLICKED
- ASSERT(pExtra == NULL);
- (pTarget->*mmf.pfn_COMMAND_RANGE)(nID);
- break;
-
- case AfxSig_bw:
- // extended command (passed ID, returns bContinue)
- ASSERT(pExtra == NULL);
- bResult = (pTarget->*mmf.pfn_COMMAND_EX)(nID);
- break;
-
- case AfxSig_vNMHDRpl:
- {
- AFX_NOTIFY* pNotify = (AFX_NOTIFY*)pExtra;
- ASSERT(pNotify != NULL);
- ASSERT(pNotify->pResult != NULL);
- ASSERT(pNotify->pNMHDR != NULL);
- (pTarget->*mmf.pfn_NOTIFY)(pNotify->pNMHDR, pNotify->pResult);
- }
- break;
- case AfxSig_bNMHDRpl:
- {
- AFX_NOTIFY* pNotify = (AFX_NOTIFY*)pExtra;
- ASSERT(pNotify != NULL);
- ASSERT(pNotify->pResult != NULL);
- ASSERT(pNotify->pNMHDR != NULL);
- bResult = (pTarget->*mmf.pfn_bNOTIFY)(pNotify->pNMHDR, pNotify->pResult);
- }
- break;
- case AfxSig_vwNMHDRpl:
- {
- AFX_NOTIFY* pNotify = (AFX_NOTIFY*)pExtra;
- ASSERT(pNotify != NULL);
- ASSERT(pNotify->pResult != NULL);
- ASSERT(pNotify->pNMHDR != NULL);
- (pTarget->*mmf.pfn_NOTIFY_RANGE)(nID, pNotify->pNMHDR,
- pNotify->pResult);
- }
- break;
- case AfxSig_bwNMHDRpl:
- {
- AFX_NOTIFY* pNotify = (AFX_NOTIFY*)pExtra;
- ASSERT(pNotify != NULL);
- ASSERT(pNotify->pResult != NULL);
- ASSERT(pNotify->pNMHDR != NULL);
- bResult = (pTarget->*mmf.pfn_NOTIFY_EX)(nID, pNotify->pNMHDR,
- pNotify->pResult);
- }
- break;
- case AfxSig_cmdui:
- {
- // ON_UPDATE_COMMAND_UI or ON_UPDATE_COMMAND_UI_REFLECT case
- ASSERT(CN_UPDATE_COMMAND_UI == (UINT)-1);
- ASSERT(nCode == CN_UPDATE_COMMAND_UI || nCode == 0xFFFF);
- ASSERT(pExtra != NULL);
- CCmdUI* pCmdUI = (CCmdUI*)pExtra;
- ASSERT(!pCmdUI->m_bContinueRouting); // idle - not set
- (pTarget->*mmf.pfn_UPDATE_COMMAND_UI)(pCmdUI);
- bResult = !pCmdUI->m_bContinueRouting;
- pCmdUI->m_bContinueRouting = FALSE; // go back to idle
- }
- break;
-
- case AfxSig_cmduiw:
- {
- // ON_UPDATE_COMMAND_UI case
- ASSERT(nCode == CN_UPDATE_COMMAND_UI);
- ASSERT(pExtra != NULL);
- CCmdUI* pCmdUI = (CCmdUI*)pExtra;
- ASSERT(pCmdUI->m_nID == nID); // sanity assert
- ASSERT(!pCmdUI->m_bContinueRouting); // idle - not set
- (pTarget->*mmf.pfn_UPDATE_COMMAND_UI_RANGE)(pCmdUI, nID);
- bResult = !pCmdUI->m_bContinueRouting;
- pCmdUI->m_bContinueRouting = FALSE; // go back to idle
- }
- break;
-
- // general extensibility hooks
- case AfxSig_vpv:
- (pTarget->*mmf.pfn_OTHER)(pExtra);
- break;
- case AfxSig_bpv:
- bResult = (pTarget->*mmf.pfn_OTHER_EX)(pExtra);
- break;
-
- default: // illegal
- ASSERT(FALSE);
- return 0;
- }
- return bResult;
- }
-
- // compare two pointers to GUIDs -- TRUE if both pointers are NULL
- // or both pointers point to same GUID; FALSE otherwise
-
- #define IsEqualNULLGuid(pGuid1, pGuid2) \
- (((pGuid1) == NULL && (pGuid2) == NULL) || \
- ((pGuid1) != NULL && (pGuid2) != NULL && \
- IsEqualGUID(*(pGuid1), *(pGuid2))))
-
-
- BOOL CCmdTarget::OnCmdMsg(UINT nID, int nCode, void* pExtra,
- AFX_CMDHANDLERINFO* pHandlerInfo)
- {
- #ifndef _AFX_NO_OCC_SUPPORT
- // OLE control events are a special case
- if (nCode == CN_EVENT)
- {
- ASSERT(afxOccManager != NULL);
- return afxOccManager->OnEvent(this, nID, (AFX_EVENT*)pExtra, pHandlerInfo);
- }
- #endif // !_AFX_NO_OCC_SUPPORT
-
- // determine the message number and code (packed into nCode)
- const AFX_MSGMAP* pMessageMap;
- const AFX_MSGMAP_ENTRY* lpEntry;
- UINT nMsg = 0;
-
- #ifndef _AFX_NO_DOCOBJECT_SUPPORT
- if (nCode == CN_OLECOMMAND)
- {
- BOOL bResult = FALSE;
-
- const AFX_OLECMDMAP* pOleCommandMap;
- const AFX_OLECMDMAP_ENTRY* pEntry;
-
- COleCmdUI* pUI = (COleCmdUI*) pExtra;
- const GUID* pguidCmdGroup = pUI->m_pguidCmdGroup;
-
- #ifdef _AFXDLL
- for (pOleCommandMap = GetCommandMap(); pOleCommandMap != NULL && !bResult;
- pOleCommandMap = pOleCommandMap->pfnGetBaseMap())
- #else
- for (pOleCommandMap = GetCommandMap(); pOleCommandMap != NULL && !bResult;
- pOleCommandMap = pOleCommandMap->pBaseMap)
- #endif
- {
- for (pEntry = pOleCommandMap->lpEntries;
- pEntry->cmdID != 0 && pEntry->nID != 0 && !bResult;
- pEntry++)
- {
- if (nID == pEntry->cmdID &&
- IsEqualNULLGuid(pguidCmdGroup, pEntry->pguid))
- {
- pUI->m_nID = pEntry->nID;
- bResult = TRUE;
- }
- }
- }
-
- return bResult;
- }
- #endif
-
- if (nCode != CN_UPDATE_COMMAND_UI)
- {
- nMsg = HIWORD(nCode);
- nCode = LOWORD(nCode);
- }
-
- // for backward compatibility HIWORD(nCode)==0 is WM_COMMAND
- if (nMsg == 0)
- nMsg = WM_COMMAND;
-
- // look through message map to see if it applies to us
- #ifdef _AFXDLL
- for (pMessageMap = GetMessageMap(); pMessageMap != NULL;
- pMessageMap = (*pMessageMap->pfnGetBaseMap)())
- #else
- for (pMessageMap = GetMessageMap(); pMessageMap != NULL;
- pMessageMap = pMessageMap->pBaseMap)
- #endif
- {
- // Note: catches BEGIN_MESSAGE_MAP(CMyClass, CMyClass)!
- #ifdef _AFXDLL
- ASSERT(pMessageMap != (*pMessageMap->pfnGetBaseMap)());
- #else
- ASSERT(pMessageMap != pMessageMap->pBaseMap);
- #endif
-
- lpEntry = AfxFindMessageEntry(pMessageMap->lpEntries, nMsg, nCode, nID);
- if (lpEntry != NULL)
- {
- // found it
- #ifdef _DEBUG
- if (afxTraceFlags & traceCmdRouting)
- {
- if (nCode == CN_COMMAND)
- {
- TRACE2("SENDING command id 0x%04X to %hs target.\n", nID,
- GetRuntimeClass()->m_lpszClassName);
- }
- else if (nCode > CN_COMMAND)
- {
- if (afxTraceFlags & traceWinMsg)
- {
- TRACE3("SENDING control notification %d from control id 0x%04X to %hs window.\n",
- nCode, nID, GetRuntimeClass()->m_lpszClassName);
- }
- }
- }
- #endif //_DEBUG
- return _AfxDispatchCmdMsg(this, nID, nCode,
- lpEntry->pfn, pExtra, lpEntry->nSig, pHandlerInfo);
- }
- }
- return FALSE; // not handled
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // Hook to disable automation handlers
-
- #ifndef _AFX_NO_OLE_SUPPORT
-
- BOOL CCmdTarget::IsInvokeAllowed(DISPID)
- {
- return TRUE; // normally, invoke is always allowed
- }
-
- #endif // !_AFX_NO_OLE_SUPPORT
-
- /////////////////////////////////////////////////////////////////////////////
- // Stubs for OLE type library functions
-
- #ifndef _AFX_NO_OLE_SUPPORT
-
- BOOL CCmdTarget::GetDispatchIID(IID*)
- {
- // Subclass must implement (typically via COleControl implementation)
- return FALSE;
- }
-
- UINT CCmdTarget::GetTypeInfoCount()
- {
- // Subclass must implement (typically via IMPLEMENT_OLETYPELIB macro)
- return 0;
- }
-
- CTypeLibCache* CCmdTarget::GetTypeLibCache()
- {
- // Subclass must implement (typically via IMPLEMENT_OLETYPELIB macro)
- return NULL;
- }
-
- HRESULT CCmdTarget::GetTypeLib(LCID, LPTYPELIB*)
- {
- // Subclass must implement (typically via IMPLEMENT_OLETYPELIB macro)
- return TYPE_E_CANTLOADLIBRARY;
- }
-
- #endif // !_AFX_NO_OLE_SUPPORT
-
- /////////////////////////////////////////////////////////////////////////////
- // CCmdTarget routines that delegate to the WinApp
-
- void CCmdTarget::BeginWaitCursor()
- { AfxGetApp()->DoWaitCursor(1); }
- void CCmdTarget::EndWaitCursor()
- { AfxGetApp()->DoWaitCursor(-1); }
- void CCmdTarget::RestoreWaitCursor()
- { AfxGetApp()->DoWaitCursor(0); }
-
- /////////////////////////////////////////////////////////////////////////////
- // Root of message maps
-
- const AFX_DATADEF AFX_MSGMAP CCmdTarget::messageMap =
- {
- #ifdef _AFXDLL
- &CCmdTarget::_GetBaseMessageMap,
- #else
- NULL,
- #endif
- &CCmdTarget::_messageEntries[0]
- };
-
- #ifdef _AFXDLL
- const AFX_MSGMAP* CCmdTarget::_GetBaseMessageMap()
- {
- return NULL;
- }
- #endif
-
- const AFX_MSGMAP* CCmdTarget::GetMessageMap() const
- {
- return &CCmdTarget::messageMap;
- }
-
- const AFX_MSGMAP_ENTRY CCmdTarget::_messageEntries[] =
- {
- { 0, 0, AfxSig_end, 0 } // nothing here
- };
-
- /////////////////////////////////////////////////////////////////////////////
- // Root of dispatch maps
-
- #ifndef _AFX_NO_OLE_SUPPORT
-
- UINT CCmdTarget::_dispatchEntryCount = (UINT)-1;
- DWORD CCmdTarget::_dwStockPropMask = (DWORD)-1;
-
- const AFX_DISPMAP CCmdTarget::dispatchMap =
- {
- #ifdef _AFXDLL
- &CCmdTarget::_GetBaseDispatchMap,
- #else
- NULL,
- #endif
- &CCmdTarget::_dispatchEntries[0],
- &CCmdTarget::_dispatchEntryCount,
- &CCmdTarget::_dwStockPropMask
- };
-
- #ifdef _AFXDLL
- const AFX_DISPMAP* CCmdTarget::_GetBaseDispatchMap()
- {
- return NULL;
- }
- #endif
-
- const AFX_DISPMAP* CCmdTarget::GetDispatchMap() const
- {
- return &CCmdTarget::dispatchMap;
- }
-
- const AFX_DISPMAP_ENTRY CCmdTarget::_dispatchEntries[] =
- {
- { NULL, -1, NULL, 0, (AFX_PMSG)NULL, (AFX_PMSG)NULL, (size_t)-1,
- afxDispCustom }
- // nothing here
- };
-
- #endif //!_AFX_NO_OLE_SUPPORT
-
- /////////////////////////////////////////////////////////////////////////////
- // Root of event sink maps
-
- #ifndef _AFX_NO_OCC_SUPPORT
-
- UINT CCmdTarget::_eventsinkEntryCount = (UINT)-1;
-
- const AFX_EVENTSINKMAP CCmdTarget::eventsinkMap =
- {
- #ifdef _AFXDLL
- &CCmdTarget::_GetBaseEventSinkMap,
- #else
- NULL,
- #endif
- &CCmdTarget::_eventsinkEntries[0],
- &CCmdTarget::_eventsinkEntryCount
- };
-
- #ifdef _AFXDLL
- const AFX_EVENTSINKMAP* CCmdTarget::_GetBaseEventSinkMap()
- {
- return NULL;
- }
- #endif
-
- const AFX_EVENTSINKMAP* CCmdTarget::GetEventSinkMap() const
- {
- return &CCmdTarget::eventsinkMap;
- }
-
- const AFX_EVENTSINKMAP_ENTRY CCmdTarget::_eventsinkEntries[] =
- {
- { NULL, -1, NULL, 0, (AFX_PMSG)NULL, (AFX_PMSG)NULL, (size_t)-1,
- afxDispCustom, (UINT)-1, (UINT)-1 }
- // nothing here
- };
-
- #endif //!_AFX_NO_OCC_SUPPORT
-
- /////////////////////////////////////////////////////////////////////////////
- // Root of interface maps
-
- #ifndef _AFX_NO_OLE_SUPPORT
-
- #ifdef _AFXDLL
- const AFX_INTERFACEMAP* CCmdTarget::_GetBaseInterfaceMap()
- {
- return NULL;
- }
- #endif
-
- const AFX_INTERFACEMAP* CCmdTarget::GetInterfaceMap() const
- {
- return &CCmdTarget::interfaceMap;
- }
-
- const AFX_INTERFACEMAP CCmdTarget::interfaceMap =
- {
- #ifdef _AFXDLL
- &CCmdTarget::_GetBaseInterfaceMap,
- #else
- NULL,
- #endif
- &CCmdTarget::_interfaceEntries[0]
- };
-
- const AFX_INTERFACEMAP_ENTRY CCmdTarget::_interfaceEntries[] =
- {
- #ifndef _AFX_NO_OLE_SUPPORT
- INTERFACE_PART(CCmdTarget, IID_IDispatch, Dispatch)
- #endif
- { NULL, (size_t)-1 } // end of entries
- };
-
- void CCmdTarget::OnFinalRelease()
- {
- #ifndef _AFX_NO_OLE_SUPPORT
- AfxLockGlobals(CRIT_TYPELIBCACHE);
-
- // release the typelib cache, if any
- CTypeLibCache* pTypeLibCache = GetTypeLibCache();
- if (pTypeLibCache != NULL)
- pTypeLibCache->Unlock();
-
- AfxUnlockGlobals(CRIT_TYPELIBCACHE);
- #endif
-
- delete this;
- }
-
- BOOL CCmdTarget::OnCreateAggregates()
- {
- return TRUE;
- }
-
- LPUNKNOWN CCmdTarget::GetInterfaceHook(const void*)
- {
- return NULL;
- }
-
- #endif //!_AFX_NO_OLE_SUPPORT
-
- /////////////////////////////////////////////////////////////////////////////
- // Root of connection maps
-
- #ifndef _AFX_NO_OLE_SUPPORT
-
- #ifdef _AFXDLL
- const AFX_CONNECTIONMAP* CCmdTarget::_GetBaseConnectionMap()
- {
- return NULL;
- }
- #endif
-
- const AFX_CONNECTIONMAP* CCmdTarget::GetConnectionMap() const
- {
- return &CCmdTarget::connectionMap;
- }
-
- const AFX_CONNECTIONMAP CCmdTarget::connectionMap =
- {
- #ifdef _AFXDLL
- &CCmdTarget::_GetBaseConnectionMap,
- #else
- NULL,
- #endif
- &CCmdTarget::_connectionEntries[0]
- };
-
- const AFX_CONNECTIONMAP_ENTRY CCmdTarget::_connectionEntries[] =
- {
- { NULL, (size_t)-1 } // end of entries
- };
-
- LPCONNECTIONPOINT CCmdTarget::GetConnectionHook(const IID&)
- {
- return NULL;
- }
-
- BOOL CCmdTarget::GetExtraConnectionPoints(CPtrArray*)
- {
- return FALSE;
- }
-
- #endif //!_AFX_NO_OLE_SUPPORT
-
- /////////////////////////////////////////////////////////////////////////////
- // Root of command target maps
-
- #ifndef _AFX_NO_DOCOBJECT_SUPPORT
-
- #ifdef _AFXDLL
- const AFX_OLECMDMAP* CCmdTarget::_GetBaseCommandMap()
- {
- return NULL;
- }
- #endif
-
- const AFX_OLECMDMAP CCmdTarget::commandMap =
- {
- #ifdef _AFXDLL
- &CCmdTarget::_GetBaseCommandMap,
- #else
- NULL,
- #endif
- &CCmdTarget::_commandEntries[0]
- };
-
- const AFX_OLECMDMAP_ENTRY CCmdTarget::_commandEntries[] =
- {
- { NULL, 0, 0 } // end of entries
- };
-
- const AFX_OLECMDMAP* CCmdTarget::GetCommandMap() const
- {
- return &CCmdTarget::commandMap;
- }
-
- #endif //!_AFX_NO_DOCOBJECT_SUPPORT
-
- /////////////////////////////////////////////////////////////////////////////
- // Special access to view routing info
-
- CView* CCmdTarget::GetRoutingView()
- {
- return GetRoutingView_();
- }
-
- CFrameWnd* CCmdTarget::GetRoutingFrame()
- {
- return GetRoutingFrame_();
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CCmdUI - User Interface for a command
-
- // CCmdUI is a protocol class for all command handler variants
- // CCmdUI is an implementation class for menus and general dialog
- // controls (usually buttons)
-
- CCmdUI::CCmdUI()
- {
- // zero out everything
- m_nID = m_nIndex = m_nIndexMax = 0;
- m_pMenu = m_pSubMenu = m_pParentMenu = NULL;
- m_pOther = NULL;
- m_bEnableChanged = m_bContinueRouting = FALSE;
- }
-
- // default CCmdUI implementation only works for Menu Items
- void CCmdUI::Enable(BOOL bOn)
- {
- if (m_pMenu != NULL)
- {
- if (m_pSubMenu != NULL)
- return; // don't change popup menus indirectly
-
- ASSERT(m_nIndex < m_nIndexMax);
- m_pMenu->EnableMenuItem(m_nIndex, MF_BYPOSITION |
- (bOn ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
- }
- else
- {
- // enable/disable a control (i.e. child window)
- ASSERT(m_pOther != NULL);
-
- // if control has the focus, move the focus before disabling
- if (!bOn && (::GetFocus() == m_pOther->m_hWnd))
- m_pOther->GetParent()->GetNextDlgTabItem(m_pOther)->SetFocus();
- m_pOther->EnableWindow(bOn);
- }
- m_bEnableChanged = TRUE;
- }
-
- void CCmdUI::SetCheck(int nCheck)
- {
- if (m_pMenu != NULL)
- {
- if (m_pSubMenu != NULL)
- return; // don't change popup menus indirectly
-
- // place checkmark next to menu item
- ASSERT(m_nIndex < m_nIndexMax);
- m_pMenu->CheckMenuItem(m_nIndex, MF_BYPOSITION |
- (nCheck ? MF_CHECKED : MF_UNCHECKED));
- }
- else
- {
- // we can only check buttons or controls acting like buttons
- ASSERT(m_pOther != NULL);
- if (m_pOther->SendMessage(WM_GETDLGCODE) & DLGC_BUTTON)
- m_pOther->SendMessage(BM_SETCHECK, nCheck);
- // otherwise ignore it
- }
- }
-
- AFX_STATIC void AFXAPI _AfxLoadDotBitmap(); // for swap tuning
-
- void CCmdUI::SetRadio(BOOL bOn)
- {
- SetCheck(bOn ? 1 : 0); // this default works for most things as well
- if (m_pMenu != NULL)
- {
- if (m_pSubMenu != NULL)
- return; // don't change popup menus indirectly
-
- // for menu item - use dot instead of checkmark
- ASSERT(m_nIndex < m_nIndexMax);
-
- if (afxData.hbmMenuDot == NULL)
- _AfxLoadDotBitmap(); // in INIT segment
-
- if (afxData.hbmMenuDot != NULL)
- SetMenuItemBitmaps(m_pMenu->m_hMenu, m_nIndex, MF_BYPOSITION,
- NULL, afxData.hbmMenuDot);
- }
- }
-
- void CCmdUI::SetText(LPCTSTR lpszText)
- {
- ASSERT(lpszText != NULL);
- ASSERT(AfxIsValidString(lpszText));
-
- if (m_pMenu != NULL)
- {
- if (m_pSubMenu != NULL)
- return; // don't change popup menus indirectly
-
- // get current menu state so it doesn't change
- UINT nState = m_pMenu->GetMenuState(m_nIndex, MF_BYPOSITION);
- nState &= ~(MF_BITMAP|MF_OWNERDRAW|MF_SEPARATOR);
-
- // set menu text
- ASSERT(m_nIndex < m_nIndexMax);
- VERIFY(m_pMenu->ModifyMenu(m_nIndex, MF_BYPOSITION |
- MF_STRING | nState, m_nID, lpszText));
- }
- else
- {
- ASSERT(m_pOther != NULL);
- AfxSetWindowText(m_pOther->m_hWnd, lpszText);
- }
- }
-
- BOOL CCmdUI::DoUpdate(CCmdTarget* pTarget, BOOL bDisableIfNoHndler)
- {
- ASSERT_VALID(pTarget);
-
- if (m_nID == 0 || LOWORD(m_nID) == 0xFFFF)
- return TRUE; // ignore invalid IDs
-
- m_bEnableChanged = FALSE;
- BOOL bResult = pTarget->OnCmdMsg(m_nID, CN_UPDATE_COMMAND_UI, this, NULL);
- if (!bResult)
- ASSERT(!m_bEnableChanged); // not routed
-
- if (bDisableIfNoHndler && !m_bEnableChanged)
- {
- AFX_CMDHANDLERINFO info;
- info.pTarget = NULL;
- BOOL bHandler = pTarget->OnCmdMsg(m_nID, CN_COMMAND, this, &info);
-
- #ifdef _DEBUG
- if ((afxTraceFlags & traceCmdRouting) && !bHandler)
- TRACE1("No handler for command ID 0x%04X, disabling it.\n", m_nID);
- #endif
- // Enable or Disable based on whether there is a handler there
- Enable(bHandler);
- }
- return bResult;
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // Special init
-
- #ifdef AFX_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
-
- AFX_STATIC_DATA const BYTE _afxDot[] =
- { 0x6, 0xF, 0xF, 0xF, 0x6 }; // simple byte bitmap, 1=> bit on
- #define DOT_WIDTH 4
- #define DOT_HEIGHT 5
-
- AFX_STATIC void AFXAPI _AfxLoadDotBitmap()
- {
- ASSERT(afxData.hbmMenuDot == NULL);
- // attempt to load special bitmap, else default to arrow
- CSize size = ::GetMenuCheckMarkDimensions();
- ASSERT(size.cx > 4 && size.cy > 5); // not too small please
- if (size.cx > 32)
- size.cx = 32;
- int iwRow = (size.cx + 15) >> 4; // # of WORDs per raster line
- int nShift = (size.cx - DOT_WIDTH) / 2; // # of bits to shift over
- nShift += ((iwRow * 16) - size.cx); // padding for word alignment
- if (nShift > 16 - DOT_WIDTH)
- nShift = 16 - DOT_WIDTH; // maximum shift for 1 word
-
- if (size.cy > 32)
- size.cy = 32;
-
- // bitmap 2/4/4/4/2 pixels wide - centered (0 => black)
- BYTE rgbBitmap[32 * 2 * sizeof(WORD)];
- memset(rgbBitmap, 0xff, sizeof(rgbBitmap));
-
- BYTE* pbOut = &rgbBitmap[iwRow * sizeof(WORD) *
- ((size.cy - (DOT_HEIGHT+1)) >> 1)];
- const BYTE* pbIn = _afxDot;
- for (int y = 0; y < DOT_HEIGHT; y++)
- {
- WORD w = (WORD)~(((DWORD)*pbIn++) << nShift);
- // bitmaps are always hi-lo
- pbOut[0] = HIBYTE(w);
- pbOut[1] = LOBYTE(w);
- pbOut += iwRow * sizeof(WORD);
- }
-
- afxData.hbmMenuDot = ::CreateBitmap(size.cx, size.cy, 1, 1,
- (LPVOID)&rgbBitmap);
- if (afxData.hbmMenuDot == NULL)
- {
- TRACE0("Warning: using system arrow bitmap instead of dot.\n");
- #define OBM_MNARROW 32739
- afxData.hbmMenuDot = ::LoadBitmap(NULL, MAKEINTRESOURCE(OBM_MNARROW));
- }
- }
-
- /////////////////////////////////////////////////////////////////////////////
- // CCmdTarget diagnostics
-
- #ifdef _DEBUG
- void CCmdTarget::Dump(CDumpContext& dc) const
- {
- CObject::Dump(dc);
-
- #ifndef _AFX_NO_OLE_SUPPORT
- if (m_xDispatch.m_vtbl != 0)
- {
- dc << "with IDispatch (OLE Automation) capability\n";
- dc << "m_bResultExpected = " << m_bResultExpected << "\n";
- }
- if (m_xConnPtContainer.m_vtbl != 0)
- {
- dc << "with OLE Connection Point capability\n";
- }
- if (GetInterfaceMap() != &CCmdTarget::interfaceMap)
- {
- dc << "with OLE capability";
- dc << "\nm_dwRef = " << m_dwRef;
- dc << "\nm_pOuterUnknown = " << m_pOuterUnknown;
- if (m_xInnerUnknown != 0)
- dc << "\nwith aggregation capability";
- dc << "\n";
- }
- #endif //!_AFX_NO_OLE_SUPPORT
- }
-
- void CCmdTarget::AssertValid() const
- {
- CObject::AssertValid();
- }
- #endif
-
- #ifdef AFX_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
-
- IMPLEMENT_DYNAMIC(CCmdTarget, CObject)
-
- /////////////////////////////////////////////////////////////////////////////
-