|
|
/////////////////////////////////////////////////////////////////////////////
//
//
// BLHost.cpp - CBLHost implementation
/////////////////////////////////////////////////////////////////////////////
#include "pch.hxx"
#include <shlobj.h>
#include <shlobjp.h>
#include <windowsx.h>
#include <shlwapi.h>
#include <shlwapip.h>
#include <ieguidp.h>
#include <mshtml.h>
#include <mshtmdid.h>
#include <ExDispID.h>
#include "bactrl.h"
#include "baprop.h"
#include "baui.h"
#include "msoert.h"
#include "BLHost.h"
#include "hotlinks.h"
#include "Guid.h"
#include "resource.h"
// Insert your server name
#define STARTUP_URL "http://localhost/BlFrame.htm"
#define SEARCH_PANE_INDICATOR "#_mysearch"
const int c_cxBorder = 0; const int c_cyBorder = 0; const int c_cxTextBorder = 4; const int c_cyTextBorder = 2; const int c_cyClose = 3; const int c_cySplit = 4; const int c_cxSplit = 3; const int c_cxTextSpace = 1; const int c_cxTriangle = 14; const int c_cyIEDelta = 5;
// --------------------------------------------------------------------------------
// SAFECAST - Insures that a cast is valid, otherwise it won't compile
// --------------------------------------------------------------------------------
#define SAFECAST(_src, _type) (((_type)(_src)==(_src)?0:0), (_type)(_src))
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
HMENU LoadPopupMenu(UINT id); HRESULT MenuUtil_EnablePopupMenu(HMENU hPopup, CIEMsgAb* pTarget);
static const TBBUTTON c_tbIECont[] = { { I_IMAGENONE, ID_CONT_FILE, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_WHOLEDROPDOWN | BTNS_SHOWTEXT, {0,0}, 0, 0 }, { I_IMAGENONE, ID_SHOWALLCONTACT, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_DROPDOWN | BTNS_SHOWTEXT, {0, 0}, 0, 1} };
CBLHost::CBLHost() : _cRef(1), _hwndParent(NULL), m_hWnd(NULL), m_hwndContact(NULL), _dwViewMode(0), _dwBandID(0), _dwWBCookie(0), _pSite(NULL), m_pUnkSite(NULL) { HDC hdc;
InterlockedIncrement(&g_cDllRefCount); m_pIMsgrAB = NULL; m_hbr3DFace = CreateSolidBrush(GetSysColor(COLOR_3DFACE)); m_hbrStaticText = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); m_hbr3DHighFace = CreateSolidBrush(GetSysColor(COLOR_3DLIGHT)); LOGFONT lf; // Figure out which font to use
SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, FALSE);
// Create the fonts
m_hFont = CreateFontIndirect(&lf); lf.lfWeight = FW_BOLD; m_hBoldFont = CreateFontIndirect(&lf); lf.lfUnderline = (BYTE) TRUE; m_hUnderlineFont = CreateFontIndirect(&lf);
m_cyTitleBar = 32; m_fHighlightIndicator = FALSE; m_fHighlightPressed = FALSE; m_fButtonPressed = FALSE; m_fViewMenuPressed = FALSE; m_fButtonHighLight = FALSE; m_fShowLoginPart = FALSE; m_fStateChange = FALSE; m_TextHeight = 0; ZeroMemory(&m_rcTitleButton, sizeof(RECT)); ZeroMemory(&m_rcTextButton, sizeof(RECT)); m_hWndLogin = NULL; // m_hWndClick = NULL;
m_fStrsAdded = FALSE; m_lStrOffset = 0;
// Link colors
if(!LookupLinkColors(&m_clrLink, NULL)) m_clrLink = 0; if(!LookupLinkColors(NULL, &m_clrBack)) m_clrBack = RGB(255, 255, 255); }
CBLHost::~CBLHost() { Cleanup(); }
///////////////////////////////////////////////////////////////////////////
//
// IUnknown Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::QueryInterface()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::QueryInterface(REFIID riid, LPVOID* ppvObject) { *ppvObject= NULL;
if (IsEqualIID(riid, IID_IUnknown)) { *ppvObject = this; } else if (IsEqualIID(riid, IID_IOleWindow) || IsEqualIID(riid, IID_IDockingWindow)) { *ppvObject = static_cast<IDockingWindow*>(this); } else if (IsEqualIID(riid, IID_IInputObject)) { *ppvObject = static_cast<IInputObject*>(this); } else if (IsEqualIID(riid, IID_IObjectWithSite)) { *ppvObject = static_cast<IObjectWithSite*>(this); } else if (IsEqualIID(riid, IID_IDeskBand)) { *ppvObject = static_cast<IDeskBand*>(this); } else if (IsEqualIID(riid, IID_IPersist)) { *ppvObject = static_cast<IPersist*>(this); } else if (IsEqualIID(riid, IID_IPersistStream)) { *ppvObject = static_cast<IPersistStream*>(this); } else if (IsEqualIID(riid, IID_IContextMenu)) { *ppvObject = static_cast<IContextMenu*>(this); } else if (IsEqualIID(riid, IID_IOleClientSite)) { *ppvObject = static_cast<IOleClientSite*>(this); } else if (IsEqualIID(riid, IID_IOleInPlaceSite)) { *ppvObject = static_cast<IOleInPlaceSite*>(this); } else if (IsEqualIID(riid, IID_IOleControlSite)) { *ppvObject = static_cast<IOleControlSite*>(this); } else if (IsEqualIID(riid, IID_IOleCommandTarget)) { *ppvObject = static_cast<IOleCommandTarget*>(this); } else if (IsEqualIID(riid, IID_IDispatch) || IsEqualIID(riid, DIID_DWebBrowserEvents2)) { *ppvObject = static_cast<IDispatch*>(this); }
if (*ppvObject) { static_cast<LPUNKNOWN>(*ppvObject)->AddRef(); return S_OK; }
return E_NOINTERFACE; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::AddRef()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CBLHost::AddRef() { return (ULONG)InterlockedIncrement(&_cRef); }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::Release()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CBLHost::Release() { if (0 == InterlockedDecrement(&_cRef)) { delete this; return 0; } return (ULONG)_cRef; }
///////////////////////////////////////////////////////////////////////////
//
// IOleWindow Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetWindow()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetWindow(HWND *phwnd) { *phwnd = m_hWnd; return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::ContextSensitiveHelp()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::ContextSensitiveHelp(BOOL fEnterMode) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// IDockingWindow Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::ShowDW()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::ShowDW(BOOL fShow) { if (m_hWnd) { //
// Hide or show the window depending on
// the value of the fShow parameter.
//
if (fShow) ShowWindow(m_hWnd, SW_SHOW); else ShowWindow(m_hWnd, SW_HIDE); }
AddButtons(fShow); return S_OK; }
void CBLHost::UpdateButtonArray(TBBUTTON *ptbDst, const TBBUTTON *ptbSrc, int ctb, LONG_PTR lStrOffset) { memcpy(ptbDst, ptbSrc, ctb*sizeof(TBBUTTON)); if (lStrOffset == -1) { // handle failure case
for (int i = 0; i < ctb; i++) ptbDst[i].iString = 0; } else { for (int i = 0; i < ctb; i++) ptbDst[i].iString += lStrOffset; } }
void CBLHost::AddButtons(BOOL fAdd) { IExplorerToolbar* piet;
_ASSERT(m_pUnkSite);
if (SUCCEEDED(m_pUnkSite->QueryInterface(IID_IExplorerToolbar, (void**)&piet))) { if (fAdd) { piet->SetCommandTarget((IUnknown*)SAFECAST(this, IOleCommandTarget*), &CLSID_BLHost, 0); if (!m_fStrsAdded) { LONG_PTR cbOffset; piet->AddString(&CLSID_BLHost, g_hLocRes, idsToolBar, &cbOffset); m_lStrOffset = cbOffset; m_fStrsAdded = TRUE; } // piet->SetImageList(&CGID_SearchBand, _himlNormal, _himlHot, NULL); // set image list
TBBUTTON tbCont[ARRAYSIZE(c_tbIECont)]; UpdateButtonArray(tbCont, c_tbIECont, ARRAYSIZE(c_tbIECont), m_lStrOffset);
CIEMsgAb *pMsgrAb = (CIEMsgAb *) m_pIMsgrAB; if(pMsgrAb && pMsgrAb->HideViewMenu()) tbCont[1].fsState = TBSTATE_HIDDEN;
piet->AddButtons(&CLSID_BLHost, ARRAYSIZE(tbCont), tbCont); } else piet->SetCommandTarget(NULL, NULL, 0);
piet->Release(); }
}
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::CloseDW()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::CloseDW(DWORD dwReserved) { ShowDW(FALSE);
if (IsWindow(m_hWnd)) DestroyWindow(m_hWnd);
m_hWnd = NULL; return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::ResizeBorderDW()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::ResizeBorderDW(LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved) { // This method is never called for Band Objects.
return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// IInputObject Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::UIActivateIO()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::UIActivateIO(BOOL fActivate, LPMSG lpMsg) { _ASSERT(m_pIMsgrAB);
HRESULT hr = E_FAIL;
if (m_pIMsgrAB) hr = ((CIEMsgAb*) m_pIMsgrAB)->UIActivateIO(fActivate, lpMsg);
return hr; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::HasFocusIO()
//
// If this window or one of its decendants has the focus, return S_OK. Return
// S_FALSE if we don't have the focus.
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::HasFocusIO(void) { HWND hwnd = GetFocus(); HWND hwndTmp; ((CIEMsgAb *) m_pIMsgrAB)->GetWindow(&hwndTmp);
// See if the focus has been set to any of the children
//
while (hwnd && hwndTmp) { if (hwnd == hwndTmp) return S_OK;
hwndTmp = ::GetWindow(hwndTmp, GW_CHILD); }
return S_FALSE; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::TranslateAcceleratorIO()
//
// If the accelerator is translated, return S_OK or S_FALSE otherwise.
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::TranslateAcceleratorIO(LPMSG pMsg) { _RPT0(_CRT_WARN, "TranslateAcceleratorIO\n");
return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// IObjectWithSite Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::SetSite()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::SetSite(IUnknown* pUnkSite) { TEXTMETRIC tm; HRESULT hr = S_OK; CIEMsgAb *pMsgrAb = NULL;
// Assert(FALSE);
// If punkSite is not NULL, a new site is being set.
if (pUnkSite) { //
// If a IInputObjectSite pointer is being held, release it.
//
if (_pSite) { _pSite->Release(); _pSite = NULL; }
if(m_pUnkSite) m_pUnkSite->Release();
m_pUnkSite = pUnkSite;
// Get the parent window.
IOleWindow* pOleWindow; if (SUCCEEDED(pUnkSite->QueryInterface(IID_IOleWindow, (LPVOID*)&pOleWindow))) { pOleWindow->GetWindow(&_hwndParent); pOleWindow->Release(); }
_ASSERT(_hwndParent); if (!_hwndParent) return E_FAIL;
if (!RegisterAndCreateWindow()) return E_FAIL;
// Get and keep the IInputObjectSite pointer.
hr = pUnkSite->QueryInterface(IID_IInputObjectSite, (LPVOID*)&_pSite); _ASSERT(SUCCEEDED(hr)); hr = CreateIEMsgAbCtrl(&m_pIMsgrAB);
/* // Create and initialize the WebBrowser control that we are hosting.
hr = CoCreateInstance(CLSID_MsgrAb, NULL, CLSCTX_INPROC, IID_IMsgrAb, (LPVOID*)&m_pMsgrAB);
// Get the rectangle of the client area*/
_ASSERT(m_hWnd);
// Get the metrics of this font
HDC hdc = GetDC(m_hWnd); SelectFont(hdc, m_hFont); GetTextMetrics(hdc, &tm);
if(!ANSI_AthLoadString(idsTitleMenu, m_szTitleMenu, ARRAYSIZE(m_szTitleMenu))) m_szTitleMenu[0] = '\0';
if(!ANSI_AthLoadString(idsButtonText, m_szButtonText, ARRAYSIZE(m_szButtonText))) m_szButtonText[0] = '\0';
// if(!AthLoadString(idsLoginText, m_szInstallText, ARRAYSIZE(m_szInstallText)))
// m_szInstallText[0] = '\0';
if(!AthLoadString(idsClickText, m_wszClickText, ARRAYSIZE(m_wszClickText))) m_wszClickText[0] = L'\0'; if(!AthLoadString(idsAttemptText, m_wszAttemptText, ARRAYSIZE(m_wszAttemptText))) m_wszAttemptText[0] = L'\0'; if(!AthLoadString(idsWaitText, m_wszWaitText, ARRAYSIZE(m_wszWaitText))) m_wszWaitText[0] = L'\0';
// Calculate the height
m_cyTitleBar = 0; //tm.tmHeight + (2 * c_cyBorder) + (2 * c_cyTextBorder) + c_cyIEDelta;
m_TextHeight = tm.tmHeight;
pMsgrAb = (CIEMsgAb *) m_pIMsgrAB;
// Calculate the height
RECT rc = {2 * c_cxBorder, 2 * c_cyBorder, 0, m_cyTitleBar - c_cyBorder}; SIZE s; GetTextExtentPoint32(hdc, m_szTitleMenu, lstrlen(m_szTitleMenu), &s); m_rcTitleButton = rc; m_rcTitleButton.right = c_cxTriangle + (2 * c_cxTextBorder) + s.cx + (2 * c_cxBorder);
RECT rcClient = { 0, 0, 0/*100*/, 0/*500*/ };
GetClientRect(m_hWnd, &rcClient); m_hwndContact = pMsgrAb->CreateControlWindow(m_hWnd, rcClient); // m_pIMsgrAB->Release(); // CreateControl.. add reference
// Calculate "Show All" button rect
m_rcTextButton.left = m_rcTitleButton.right + c_cxTextSpace; m_rcTextButton.top = m_rcTitleButton.top; m_rcTextButton.bottom = m_rcTitleButton.bottom; GetTextExtentPoint32(hdc, m_szButtonText, lstrlen(m_szButtonText), &s); m_rcTextButton.right = c_cxTriangle + m_rcTextButton.left + (2 * c_cxTextBorder) + s.cx + (2 * c_cxBorder);
m_hWndLogin = CreateWindow(_T("Button"), _T("_Login"), WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | BS_OWNERDRAW /*| ES_MULTILINE | ES_READONLY*/, 0, 0, 0, 0, m_hWnd, (HMENU) ID_LOGIN_MESSENGER, g_hLocRes, NULL); SendMessage(m_hWndLogin, WM_SETFONT, (WPARAM) m_hUnderlineFont, MAKELPARAM(TRUE, 0)); /* SendMessage(m_hWndLogin, WM_SETFONT, (WPARAM) m_hFont, MAKELPARAM(TRUE, 0));
m_hWndClick = CreateWindow(_T("Button"), _T("_Click"), WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | BS_OWNERDRAW, 0, 0, 0, 0, m_hWnd, (HMENU) ID_LOGIN_MESSENGER, g_hLocRes, NULL); SendMessage(m_hWndClick, WM_SETFONT, (WPARAM) m_hUnderlineFont, MAKELPARAM(TRUE, 0)); */ } if(pMsgrAb) hr = pMsgrAb->SetSite(pUnkSite);
return hr; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetSite()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetSite(REFIID riid, void** ppvSite) { *ppvSite = NULL;
if (_pSite) return _pSite->QueryInterface(riid, ppvSite); return E_FAIL; }
///////////////////////////////////////////////////////////////////////////
//
// IDeskBand implementation
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetBandInfo()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi) { if (pdbi) { _dwBandID = dwBandID; _dwViewMode = dwViewMode;
if (pdbi->dwMask & DBIM_MINSIZE) { pdbi->ptMinSize.x = MIN_SIZE_X; pdbi->ptMinSize.y = MIN_SIZE_Y; }
if (pdbi->dwMask & DBIM_MAXSIZE) { pdbi->ptMaxSize.x = -1; pdbi->ptMaxSize.y = -1; }
if (pdbi->dwMask & DBIM_INTEGRAL) { pdbi->ptIntegral.x = 1; pdbi->ptIntegral.y = 1; }
if (pdbi->dwMask & DBIM_ACTUAL) { pdbi->ptActual.x = 0; pdbi->ptActual.y = 0; }
if (pdbi->dwMask & DBIM_TITLE) { if(!AthLoadString(idsButtontext, pdbi->wszTitle, 256)) pdbi->wszTitle[0] = L'\0'; }
if (pdbi->dwMask & DBIM_MODEFLAGS) pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT; if (pdbi->dwMask & DBIM_BKCOLOR) { // Use the default background color by removing this flag.
pdbi->dwMask &= ~DBIM_BKCOLOR; }
return S_OK; }
return E_INVALIDARG; }
///////////////////////////////////////////////////////////////////////////
//
// IPersistStream Methods
//
// This is only supported to allow the desk band to be dropped on the
// desktop and to prevent multiple instances of the desk band from showing
// up in the context menu. This desk band doesn't actually persist any data.
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetClassID()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetClassID(LPCLSID pClassID) { *pClassID = CLSID_BLHost; return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::IsDirty()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::IsDirty(void) { return S_FALSE; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::Load()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::Load(LPSTREAM pStream) { return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::Save()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::Save(LPSTREAM pStream, BOOL fClearDirty) { return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetSizeMax()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetSizeMax(ULARGE_INTEGER *pul) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// IContextMenu Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::QueryContextMenu()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { if (!(CMF_DEFAULTONLY & uFlags)) { InsertMenu(hmenu, indexMenu, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_REFRESH, TEXT("&Refresh"));
InsertMenu(hmenu, indexMenu + 1, MF_STRING | MF_BYPOSITION, idCmdFirst + IDM_OPENINWINDOW, TEXT("&Open in Window"));
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_OPENINWINDOW + 1)); }
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0)); }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::InvokeCommand()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::InvokeCommand(LPCMINVOKECOMMANDINFO lpici) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetCommandString()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetCommandString(UINT_PTR idCmd, UINT uType, UINT* pwReserved, LPSTR pszName, UINT cchMax) { HRESULT hr = E_INVALIDARG;
switch(uType) { case GCS_HELPTEXT: switch(idCmd) { case IDM_REFRESH: StrCpyN(pszName, TEXT("Refreshes the search window"), cchMax); hr = NOERROR; break;
case IDM_OPENINWINDOW: StrCpyN(pszName, TEXT("Open a new instance of the Internet Explorer window"), cchMax); hr = NOERROR; break; }
break; case GCS_VERB: switch(idCmd) { case IDM_REFRESH: StrCpyN(pszName, TEXT("Refresh"), cchMax); hr = NOERROR; break;
case IDM_OPENINWINDOW: StrCpyN(pszName, TEXT("Open in Window"), cchMax); hr = NOERROR; break; }
break; case GCS_VALIDATE: hr = NOERROR; break; }
return hr; }
///////////////////////////////////////////////////////////////////////////
//
// IOleClientSite Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::SaveObject()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::SaveObject() { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetMoniker()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER* ppmk) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetContainer()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetContainer(LPOLECONTAINER* ppContainer) { *ppContainer = NULL; return E_NOINTERFACE; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::ShowObject()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::ShowObject() { return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnShowWindow()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::OnShowWindow(BOOL fShow) { return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::RequestNewObjectLayout()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::RequestNewObjectLayout() { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// IOleInPlaceSite Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::CanInPlaceActivate()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::CanInPlaceActivate(void) { return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnInPlaceActivate()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::OnInPlaceActivate(void) { return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnUIActivate()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::OnUIActivate(void) { return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetWindowContext()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetWindowContext(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppIIPUIWin, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) { *ppFrame = NULL; *ppIIPUIWin = NULL;
GetClientRect(m_hWnd, lprcPosRect); GetClientRect(m_hWnd, lprcClipRect);
return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::Scroll()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::Scroll(SIZE scrollExtent) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnUIDeactivate()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::OnUIDeactivate(BOOL fUndoable) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnInPlaceDeactivate()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::OnInPlaceDeactivate(void) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::DiscardUndoState()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::DiscardUndoState(void) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::DeactivateAndUndo()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::DeactivateAndUndo(void) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnPosRectChange()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::OnPosRectChange(LPCRECT lprcPosRect) { return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// IOleControlSite Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnControlInfoChanged()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::OnControlInfoChanged(void) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////////////////////
//
// CBLHost::LockInPlaceActive()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::LockInPlaceActive(BOOL fLock) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetExtendedControl()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetExtendedControl(LPDISPATCH* ppDisp) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////////////////////
//
// CBLHost::TransformCoords()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::TransformCoords(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////////////////////
//
// CBLHost::TranslateAccelerator()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::TranslateAccelerator(LPMSG lpMsg, DWORD grfModifiers) { return E_NOTIMPL; } ///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnFocus()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::OnFocus(BOOL fGotFocus) { _RPT1(_CRT_WARN, "OnFocus: %s\n", fGotFocus ? "True" : "False");
if (_pSite) _pSite->OnFocusChangeIS(static_cast<IInputObject*>(this), fGotFocus);
return S_OK; } ///////////////////////////////////////////////////////////////////////////
//
// CBLHost::ShowPropertyFrame()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::ShowPropertyFrame(void) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// Private Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetTypeInfoCount()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetTypeInfoCount(UINT* pctinfo) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetTypeInfo()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetIDsOfNames()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid,DISPID* rgDispId) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::Invoke()
//
///////////////////////////////////////////////////////////////////////////
STDMETHODIMP CBLHost::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { if (IID_NULL != riid) return DISP_E_UNKNOWNINTERFACE;
if (!pDispParams) return DISP_E_PARAMNOTOPTIONAL;
static bool sbIsAnchor = false;
switch (dispIdMember) { //
// The parameters for this DISPID:
// [0]: New status bar text - VT_BSTR
//
case DISPID_STATUSTEXTCHANGE: if (pDispParams->cArgs && pDispParams->rgvarg[0].vt != VT_BSTR) { *puArgErr = 0; return DISP_E_TYPEMISMATCH; }
break;
default: return DISP_E_MEMBERNOTFOUND; }
return S_OK; }
///////////////////////////////////////////////////////////////////////////
//
// Private Methods
//
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::WndProc()
//
///////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) { if (uMessage == WM_NCCREATE) { LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam; SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)lpcs->lpCreateParams); }
CBLHost* pThis = reinterpret_cast<CBLHost*>( GetWindowLongPtr(hWnd, GWLP_USERDATA)); if (pThis) return pThis->WndProc(hWnd, uMessage, wParam, lParam); else return DefWindowProc(hWnd, uMessage, wParam, lParam); }
LRESULT CBLHost::WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) { switch (uMessage) { case WM_NCCREATE: { // Set the window handle
m_hWnd = hWnd; } break; case WM_PAINT: return OnPaint(); case WM_MOUSEMOVE: return OnMouseMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), (UINT) wParam); case WM_TIMER: OnTimer((UINT) wParam); return(0); case WM_LBUTTONDOWN: OnLButtonDown(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), (UINT) wParam); return(0);
case WM_LBUTTONUP: OnLButtonUp(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), (UINT) wParam); return(0);
case WM_COMMAND: return OnCommand(wParam, lParam); case WM_SETFOCUS: return OnSetFocus(); case WM_KILLFOCUS: return OnKillFocus(); case WM_DRAWITEM: return OnDrawItem(wParam, lParam);
case WM_SIZE: return OnSize(); // case WM_DESTROY:
//
// If you decided to implement the Open in Window context
// menu item and you are using Internet Explorer 5,
// be careful. WM_DESTROY will get sent to the band for
// each window. You'll want to keep a count of the number
// of windows open and only call Cleanup() if WM_DESTROY
// is meant for the first window.
//
// Cleanup();
// break;
case WM_LOCAL_STATUS_CHANGED: m_fStateChange = TRUE; return OnSize(); case WM_MSGR_LOGRESULT: case WM_MSGR_LOGOFF: case WM_MSGR_SHUTDOWN: m_fStateChange = FALSE; return OnSize();
return 0; } return DefWindowProc(hWnd, uMessage, wParam, lParam); }
LRESULT CBLHost::OnDrawItem(WPARAM wParam, LPARAM lParam) { LPDRAWITEMSTRUCT pdis = (LPDRAWITEMSTRUCT) lParam; RECT rc = pdis->rcItem; WCHAR wszStr[RESSTRMAX]; HBRUSH hbr3DFace = NULL; StrCpyNW(wszStr, m_fStateChange ? m_wszWaitText : m_wszClickText, ARRAYSIZE(wszStr));
hbr3DFace = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); FillRect(pdis->hDC, &(pdis->rcItem), hbr3DFace); SetBkColor(pdis->hDC, GetSysColor(COLOR_WINDOW)); DeleteObject(hbr3DFace);
if(!m_fStateChange) { SetTextColor(pdis->hDC, m_clrLink); SelectFont(pdis->hDC, m_hUnderlineFont); } else SelectFont(pdis->hDC, m_hBoldFont);
DrawTextW(pdis->hDC, wszStr, -1, &rc, DT_WORDBREAK | DT_VCENTER | DT_CENTER ); return 0; }
void CBLHost::OnLButtonUp(int x, int y, UINT keyFlags) { #if 0
POINT pt = {x, y};
if(PtInRect(&m_rcTextButton, pt)) { ((CIEMsgAb*)m_pIMsgrAB)->Exec(NULL, ID_SHOWALLCONTACT, OLECMDEXECOPT_DODEFAULT, NULL, NULL); m_fButtonPressed = FALSE; InvalidateRect(m_hWnd, &m_rcTextButton, TRUE); } #endif
}
void CBLHost::OnLButtonDown(int x, int y, UINT keyFlags) { } void CBLHost::OnTimer(UINT id) { #if 0
// RECT rcClient;
POINT pt; DWORD dw;
dw = GetMessagePos(); pt.x = LOWORD(dw); pt.y = HIWORD(dw); ScreenToClient(m_hWnd, &pt);
if (id == IDT_PANETIMER) { // GetClientRect(m_hWnd, &rcClient);
// No need to handle mouse in client area, OnMouseMove will catch this. We
// only need to catch the mouse moving out of the client area.
if (!(PtInRect(&m_rcTitleButton, pt) || PtInRect(&m_rcTextButton, pt)) && !m_fHighlightPressed) { KillTimer(m_hWnd, IDT_PANETIMER); m_fHighlightIndicator = FALSE; m_fButtonHighLight = FALSE; m_fButtonPressed = FALSE; InvalidateRect(m_hWnd, &m_rcTitleButton, TRUE); InvalidateRect(m_hWnd, &m_rcTextButton, TRUE); } } #endif
}
LRESULT CBLHost::OnMouseMove(int x, int y, UINT keyFlags) { #if 0
POINT pt = {x, y};
if (m_fHighlightIndicator != PtInRect(&m_rcTitleButton, pt)) { m_fHighlightIndicator = !m_fHighlightIndicator; if(m_fHighlightIndicator) m_fButtonHighLight = FALSE;
InvalidateRect(m_hWnd, &m_rcTitleButton, TRUE); InvalidateRect(m_hWnd, &m_rcTextButton, TRUE);
if (m_fHighlightIndicator) SetTimer(m_hWnd, IDT_PANETIMER, ELAPSE_MOUSEOVERCHECK, NULL); else KillTimer(m_hWnd, IDT_PANETIMER); } else if (m_fButtonHighLight != PtInRect(&m_rcTextButton, pt)) { m_fButtonHighLight = !m_fButtonHighLight; if(m_fButtonHighLight) m_fHighlightIndicator = FALSE;
InvalidateRect(m_hWnd, &m_rcTextButton, TRUE); InvalidateRect(m_hWnd, &m_rcTitleButton, TRUE);
if (m_fButtonHighLight) SetTimer(m_hWnd, IDT_PANETIMER, ELAPSE_MOUSEOVERCHECK, NULL); else KillTimer(m_hWnd, IDT_PANETIMER); } #endif
return(S_OK); }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnPaint()
//
///////////////////////////////////////////////////////////////////////////
LRESULT CBLHost::OnPaint(void) { PAINTSTRUCT ps; // Start painting
HDC hdc = BeginPaint(m_hWnd, &ps); SelectFont(hdc, m_hFont); EndPaint(m_hWnd, &ps);
return 0; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnCommand()
//
///////////////////////////////////////////////////////////////////////////
LRESULT CBLHost::OnCommand(WPARAM wParam, LPARAM lParam) { _RPT0(_CRT_WARN, "CBLHost::OnCommand\n"); UINT id = LOWORD(wParam);
if(id == ID_LOGIN_MESSENGER && !((CIEMsgAb*)m_pIMsgrAB)->IsMessengerInstalled()) { // redirect browser pane
IServiceProvider* psp;
// if invoked from within a browser reuse it, else open a new browser
HRESULT hres = IUnknown_QueryService(m_pUnkSite, SID_STopLevelBrowser, IID_IServiceProvider, (LPVOID*)&psp); if (SUCCEEDED(hres)) { IWebBrowser2* pwb2 = NULL;
hres = psp->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID*)&pwb2); psp->Release(); if (SUCCEEDED(hres)) { // we don't care about the error here
VARIANT varEmpty = {0};
pwb2->Navigate(L"http://www.microsoft.com/isapi/redir.dll?prd=ie&Plcid=0x0409&Pver=6.0&Clcid=0x0409&Ar=getmms", &varEmpty, &varEmpty, &varEmpty, &varEmpty); pwb2->Release(); } } return(hres); } if((id == ID_LOGIN_MESSENGER) && m_fStateChange) return 0; // id = ID_LOGOFF_MESSENGER;
if(m_pIMsgrAB) ((CIEMsgAb*)m_pIMsgrAB)->Exec(NULL, id, OLECMDEXECOPT_DODEFAULT, NULL, NULL); return 0; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::FocusChange()
//
///////////////////////////////////////////////////////////////////////////
void CBLHost::FocusChange(BOOL fFocus) { _RPT1(_CRT_WARN, "FocusChange: %s\n", fFocus ? "True" : "False");
// Inform the input object site that the focus has changed
//
if (_pSite) _pSite->OnFocusChangeIS(static_cast<IDockingWindow*>(this), fFocus); }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::SetFocus()
//
///////////////////////////////////////////////////////////////////////////
LRESULT CBLHost::OnSetFocus(void) { _RPT0(_CRT_WARN, "OnSetFocus\n");
FocusChange(TRUE); return 0; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnKillFocus()
//
///////////////////////////////////////////////////////////////////////////
LRESULT CBLHost::OnKillFocus(void) { _RPT0(_CRT_WARN, "OnKillFocus\n");
FocusChange(FALSE); return 0; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::OnSize()
//
///////////////////////////////////////////////////////////////////////////
LRESULT CBLHost::OnSize(void) { HRESULT hr = E_FAIL; if (m_pIMsgrAB) { RECT rcClient; HWND hWndTmp = NULL; GetClientRect(m_hWnd, &rcClient); CIEMsgAb *pMsgrAb = (CIEMsgAb *) m_pIMsgrAB; if(pMsgrAb) { pMsgrAb->GetWindow(&hWndTmp); m_fShowLoginPart = !pMsgrAb->DontShowMessenger(); if(m_fShowLoginPart && m_hWndLogin /* && m_hWndClick*/) { SetWindowPos(m_hWndLogin, NULL, rcClient.left, m_cyTitleBar, rcClient.right, m_TextHeight*2, SWP_NOACTIVATE | SWP_NOZORDER); SendMessage(m_hWndLogin, WM_SETFONT, (WPARAM) m_hUnderlineFont, MAKELPARAM(TRUE, 0)); SetWindowTextW(m_hWndLogin, m_fStateChange ? m_wszAttemptText : m_wszClickText); SetWindowPos(hWndTmp, NULL, 0, m_cyTitleBar + m_TextHeight*2, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top - m_cyTitleBar - m_TextHeight*2, SWP_NOACTIVATE | SWP_NOZORDER); ShowWindow(m_hWndLogin, SW_SHOW); ShowWindow(hWndTmp, SW_SHOW);
} else { if(m_hWndLogin) ShowWindow(m_hWndLogin, SW_HIDE); SetWindowPos(hWndTmp, NULL, 0, m_cyTitleBar, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top - m_cyTitleBar, SWP_NOACTIVATE | SWP_NOZORDER); ShowWindow(hWndTmp, SW_SHOW); } } } return hr; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::RegisterAndCreateWindow()
//
///////////////////////////////////////////////////////////////////////////
BOOL CBLHost::RegisterAndCreateWindow(void) { // If the window doesn't exist yet, create it now.
if (!m_hWnd) { // Can't create a child window without a parent.
if (!_hwndParent) return FALSE; // If the window class has not been registered, then do so.
WNDCLASS wc; if (!GetClassInfo(g_hLocRes, EB_CLASS_NAME, &wc)) { ZeroMemory(&wc, sizeof(wc)); wc.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = g_hLocRes; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = EB_CLASS_NAME; if (!RegisterClass(&wc)) { // If RegisterClass fails, CreateWindow below will fail.
} } // RECT rc;
// GetClientRect(m_hWnd, &rc);
// Create the window. The WndProc will set m_hWnd.
CreateWindowEx(0, EB_CLASS_NAME, NULL, WS_CHILD | WS_CLIPSIBLINGS, // No border
0, // rc.left,
0, // rc.top,
0, // rc.right - rc.left,
0, // rc.bottom - rc.top,
_hwndParent, NULL, g_hLocRes, (LPVOID)this); } return (NULL != m_hWnd); }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::GetConnectionPoint()
//
///////////////////////////////////////////////////////////////////////////
HRESULT CBLHost::GetConnectionPoint(LPUNKNOWN pUnk, REFIID riid, LPCONNECTIONPOINT* ppCP) { return E_NOTIMPL; }
///////////////////////////////////////////////////////////////////////////
//
// CBLHost::Cleanup()
//
// Description: This method releases all interfaces we are holding onto.
// This has to be done here because Internet Explorer is not
// releasing all of our interfaces. Therefore, our ref count
// never reaches 0 and we never delete ourself.
//
///////////////////////////////////////////////////////////////////////////
void CBLHost::Cleanup(void) { UnregisterClass(EB_CLASS_NAME, g_hLocRes); if (m_pIMsgrAB) { while(m_pIMsgrAB->Release() != 0) ; // m_pIMsgrAB->Release();
// m_pIMsgrAB = NULL;
}
if (m_hFont != 0) DeleteObject(m_hFont);
if (m_hUnderlineFont != 0) DeleteObject(m_hUnderlineFont);
if (m_hBoldFont != 0) DeleteObject(m_hBoldFont);
if (m_hbr3DFace) DeleteObject(m_hbr3DFace);
if (m_hbrStaticText) DeleteObject(m_hbrStaticText);
if (m_hbr3DHighFace) DeleteObject(m_hbr3DHighFace);
/* if (_pSite)
{ _pSite->Release(); _pSite = NULL; }
if(m_pUnkSite) { m_pUnkSite->Release(); m_pUnkSite = NULL; } */
InterlockedDecrement(&g_cDllRefCount); }
HRESULT STDMETHODCALLTYPE CBLHost::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText) {
prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; return S_OK; }
HRESULT STDMETHODCALLTYPE CBLHost::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut) { UINT id; HMENU hMenu = NULL; POINT pt = {0, 0};
if(pvaIn) { pt.x = GET_X_LPARAM(pvaIn->lVal); pt.y = GET_Y_LPARAM(pvaIn->lVal) - 2; } else return (S_OK);
switch (nCmdID) { case ID_CONT_FILE: hMenu = LoadPopupMenu(IDR_BA_TITLE_POPUP); MenuUtil_EnablePopupMenu(hMenu, (CIEMsgAb*) m_pIMsgrAB);
id = TrackPopupMenu(hMenu, TPM_RETURNCMD | TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL); if (id) { ((CIEMsgAb*)m_pIMsgrAB)->Exec(NULL, id, OLECMDEXECOPT_DODEFAULT, NULL, NULL); }
UpdateWindow(m_hWnd); break;
case ID_SHOWALLCONTACT: if(nCmdExecOpt != OLECMDEXECOPT_PROMPTUSER) ((CIEMsgAb*)m_pIMsgrAB)->Exec(NULL, ID_SHOWALLCONTACT, OLECMDEXECOPT_DODEFAULT, NULL, NULL); else {
hMenu = LoadPopupMenu(IDR_POPUP_VIEW); MenuUtil_EnablePopupMenu(hMenu, (CIEMsgAb*) m_pIMsgrAB);
id = TrackPopupMenu(hMenu, TPM_RETURNCMD | TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, pt.x, pt.y, 0, m_hWnd, NULL); if (id) { ((CIEMsgAb*)m_pIMsgrAB)->Exec(NULL, id, OLECMDEXECOPT_DODEFAULT, NULL, NULL); } UpdateWindow(m_hWnd); } break;
default: break;
}
if(hMenu) { BOOL bMenuDestroyed = DestroyMenu(hMenu); _ASSERT(bMenuDestroyed); } return S_OK; }
|