Click here to Skip to main content
Click here to Skip to main content
Add your own
alternative version

Using IHTMLEditDesigner

, 24 Apr 2004 CPOL
Using IHTMLEditDesigner to modify IE's editing behaviour
disabledrag_demo.zip
usr
src
DisableDrag
DisableDrag
Debug
res
DisableDrag.aps
Release
DisableDrag.exe
DisableDrag.ico
DisableDrag.manifest
DisableDragDoc.ico
Toolbar.bmp
DisableDrag.suo
disabledrag_src.zip
#include "StdAfx.h"
#include "variant.h"
#include <Mshtmdid.h>

#include ".\Chtmleditdesigner.h"

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragHTMLEditDesigner::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)
{
	HRESULT hrRet = S_OK;

	// Standard QI() initialization - set *ppv to NULL.
	*ppvObject = NULL;

	// If the client is requesting an interface we support, set *ppvObject.
	if (IsEqualIID(riid, IID_IUnknown))
		*ppvObject = (IUnknown *) this;
	else if (IsEqualIID(riid, IID_IHTMLEditDesigner))
		*ppvObject = (IHTMLEditDesigner *) this;
	else
		// We don't support the interface the client is asking for.
		hrRet = E_NOINTERFACE;

	// If we're returning an interface pointer, AddRef() it.
	if (S_OK == hrRet)
		((IUnknown *) *ppvObject)->AddRef();

	return hrRet;
}

ULONG STDMETHODCALLTYPE CMSHTMLDisableDragHTMLEditDesigner::AddRef(void)
{
	return ++m_uRefCount;
}

ULONG STDMETHODCALLTYPE CMSHTMLDisableDragHTMLEditDesigner::Release(void)
{
	return --m_uRefCount;
}

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragHTMLEditDesigner::PreHandleEvent(DISPID inEvtDispId, IHTMLEventObj *pIEventObj)
{
	USES_CONVERSION;
	IHTMLElement  *pSel;
	BSTR		  b = BSTR(NULL);

	if (inEvtDispId == DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN)
	{
		if (pIEventObj != (IHTMLEventObj *) NULL)
		{
			pIEventObj->get_srcElement(&pSel);

			//	We've got our source element, get it's inner text
			if (pSel != (IHTMLElement *) NULL)
			{
				pSel->get_tagName(&b);

				if (_tcsicmp("IMG", W2A(b)) == 0)
				{
					//	We only install the ondrag handler if the
					//	tag is an image.
					VARIANT v;

					v.vt = VT_DISPATCH;
					v.pdispVal = &m_dp;

					pSel->put_ondragstart(v);
					pSel->get_innerText(&b);
				}
			}
		}
	}

	return S_FALSE;
}

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragHTMLEditDesigner::PostHandleEvent(DISPID /*inEvtDispId*/, IHTMLEventObj * /*pIEventObj*/)
{
	return S_FALSE;
}

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragHTMLEditDesigner::TranslateAccelerator(DISPID /*inEvtDispId*/, IHTMLEventObj * /*pIEventObj*/)
{
	return S_FALSE;
}

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragHTMLEditDesigner::PostEditorEventNotify(DISPID /*inEvtDispId*/, IHTMLEventObj * /*pIEventObj*/)
{
	return S_FALSE;
}

CMSHTMLDisableDragHTMLEditDesigner::CMSHTMLDisableDragHTMLEditDesigner()
{
	m_pServices = (IHTMLEditServices *) NULL;
	m_uRefCount = 0;
}

BOOL CMSHTMLDisableDragHTMLEditDesigner::Attach(IHTMLDocument2 *pDoc)
{
	if (m_pServices	!= (IHTMLEditServices *) NULL)
		m_pServices->Release();

	IServiceProvider *pTemp;

	if (pDoc ==	(IHTMLDocument2	*) NULL)
		return FALSE;

	pDoc->QueryInterface(IID_IServiceProvider, (void **) &pTemp);

	if (pTemp != (IServiceProvider *) NULL)
	{
		pTemp->QueryService(SID_SHTMLEditServices, IID_IHTMLEditServices, (void	**)	&m_pServices);

		if (m_pServices	!= (IHTMLEditServices *) NULL)
		{
			m_pServices->AddDesigner(this);
			return TRUE;
		}
	}

	return FALSE;
}

void CMSHTMLDisableDragHTMLEditDesigner::Detach()
{
	if (m_pServices != (IHTMLEditServices *) NULL)
		m_pServices->RemoveDesigner(this);
}

//	CResiEditDispatch
HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragDispatch::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)
{
	HRESULT hrRet = S_OK;

	// Standard QI() initialization - set *ppv to NULL.
	*ppvObject = NULL;

	// If the client is requesting an interface we support, set *ppv.
	if (IsEqualIID(riid, IID_IUnknown))
		*ppvObject = (IUnknown *) this;
	else if (IsEqualIID(riid, IID_IDispatch))
		*ppvObject = (IDispatch *) this;
	else
		// We don't support the interface the client is asking for.
		hrRet = E_NOINTERFACE;

	// If we're returning an interface pointer, AddRef() it.
	if (S_OK == hrRet)
		((IUnknown *) *ppvObject)->AddRef();

	return hrRet;
}

ULONG STDMETHODCALLTYPE CMSHTMLDisableDragDispatch::AddRef(void)
{
	return ++m_uRefCount;
}

ULONG STDMETHODCALLTYPE CMSHTMLDisableDragDispatch::Release(void)
{
	return --m_uRefCount;
}

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragDispatch::GetTypeInfoCount(UINT *pctinfo)
{
	*pctinfo = 0;
	return S_OK;
}

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragDispatch::GetTypeInfo(UINT /*iTInfo*/, LCID /*lcid*/, ITypeInfo ** /*ppTInfo*/)
{
	return DISP_E_BADINDEX;
}

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragDispatch::GetIDsOfNames(REFIID /*riid*/, LPOLESTR * /*rgszNames*/, UINT /*cNames*/, LCID /*lcid*/, DISPID * /*rgDispId*/)
{
	return DISP_E_UNKNOWNNAME;
}

HRESULT STDMETHODCALLTYPE CMSHTMLDisableDragDispatch::Invoke(DISPID /*dispIdMember*/, REFIID /*riid*/, LCID /*lcid*/, WORD /*wFlags*/, DISPPARAMS * /*pDispParams*/, VARIANT *pVarResult, EXCEPINFO * /*pExcepInfo*/, UINT * /*puArgErr*/)
{
	//	If we were installed it means we should disable
	//	dragging. So set the return value to false
	pVarResult->vt = VT_BOOL;
	pVarResult->boolVal = false;
	return S_FALSE;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Rob Manderson

United States United States
I've been programming for 35 years - started in machine language on the National Semiconductor SC/MP chip, moved via the 8080 to the Z80 - graduated through HP Rocky Mountain Basic and HPL - then to C and C++ and now C#.
 
I used (30 or so years ago when I worked for Hewlett Packard) to repair HP Oscilloscopes and Spectrum Analysers - for a while there I was the one repairing DC to daylight SpecAns in the Asia Pacific area.
 
Afterward I was the fourth team member added to the Australia Post EPOS project at Unisys Australia. We grew to become an A$400 million project. I wrote a few device drivers for the project under Microsoft OS/2 v 1.3 - did hardware qualification and was part of the rollout team dealing directly with the customer.
 
Born and bred in Melbourne Australia, now living in Scottsdale Arizona USA, became a US Citizen on September 29th, 2006.
 
I work for a medical insurance broker, learning how to create ASP.NET websites in VB.Net and C#. It's all good.
 
Oh, I'm also a Kentucky Colonel. http://www.kycolonels.org

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.141216.1 | Last Updated 25 Apr 2004
Article Copyright 2004 by Rob Manderson
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid