Click here to Skip to main content
15,879,535 members
Articles / Desktop Programming / WTL

Form Designer

26 Jul 2021CPOL24 min read 350.8K   82.5K   230  
Component for adding scriptable forms capabilities to an application.
// DDComboBox.h : Declaration of the CDDComboBox
//
// Author : David Shepherd
//			Copyright (c) 2003, DaeDoe-Software
//
/////////////////////////////////////////////////////////////////////////////

#pragma once

#include "resource.h"       // main symbols
#include <atlctl.h>

// the combo box id
#define IDC_COMBOBOX				0x1000

// fire the selection change event
// wparam : unused
// lparam : unused
// return : nothing
#define WM_FIRE_SELECTION_CHANGE	(WM_APP+0)

/////////////////////////////////////////////////////////////////////////////
// IDDComboBox
[
	object,
	uuid("B2287642-C476-4443-9D6D-BDB84E164361"),
	dual,
	helpstring("IDDComboBox Interface"),
	pointer_default(unique)
]
__interface IDDComboBox : public IDispatch
{
	////////////////////////////////////////
	// enabled
	[propget, requestedit, bindable,
		id(DISPID_ENABLED),
		helpstring("")]
	HRESULT Enabled([out, retval] VARIANT_BOOL* pVal);
	[propput, requestedit, bindable,
		id(DISPID_ENABLED),
		helpstring("")]
	HRESULT Enabled([in] VARIANT_BOOL newVal);
	////////////////////////////////////////
	// fill color
	[propget, requestedit, bindable,
		id(DISPID_FILLCOLOR),
		helpstring("")]
	HRESULT FillColor([out, retval] OLE_COLOR* pVal);
	[propput, requestedit, bindable,
		id(DISPID_FILLCOLOR),
		helpstring("")]
	HRESULT FillColor([in] OLE_COLOR newVal);
	////////////////////////////////////////
	// background color
	[propget, requestedit, bindable,
		id(DISPID_BACKCOLOR),
		helpstring("")]
	HRESULT BackColor([out, retval] OLE_COLOR* pVal);
	[propput, requestedit, bindable,
		id(DISPID_BACKCOLOR),
		helpstring("")]
	HRESULT BackColor([in] OLE_COLOR newVal);
	////////////////////////////////////////
	// foreground color
	[propget, requestedit, bindable,
		id(DISPID_FORECOLOR),
		helpstring("")]
	HRESULT ForeColor([out, retval] OLE_COLOR* pVal);
	[propput, requestedit, bindable,
		id(DISPID_FORECOLOR),
		helpstring("")]
	HRESULT ForeColor([in] OLE_COLOR newVal);
	////////////////////////////////////////
	// font
	[propget, requestedit, bindable,
		id(DISPID_FONT),
		helpstring("")]
	HRESULT Font([out, retval] IFontDisp** pVal);
	[propput, requestedit, bindable,
		id(DISPID_FONT),
		helpstring("")]
	HRESULT Font([in] IFontDisp* newVal);
	[propputref, requestedit, bindable,
		id(DISPID_FONT),
		helpstring("")]
	HRESULT Font([in] IFontDisp* newVal);
	////////////////////////////////////////
	// sorted alphabetically
	[propget, requestedit, bindable,
		id(DISPID_SORTED),
		helpstring("")]
	HRESULT Sorted([out, retval] VARIANT_BOOL* pVal);
	[propput, requestedit, bindable,
		id(DISPID_SORTED),
		helpstring("")]
	HRESULT Sorted([in] VARIANT_BOOL newVal);
	////////////////////////////////////////
	// text
	[propget, bindable, nonbrowsable,
		id(DISPID_TEXT),
		helpstring("")]
	HRESULT Text([out, retval] BSTR* pVal);
	[propput, bindable, nonbrowsable,
		id(DISPID_TEXT),
		helpstring("")]
	HRESULT Text([in] BSTR newVal);
	////////////////////////////////////////
	// default property
	[propget, nonbrowsable,
		id(DISPID_VALUE),
		helpstring("")]
	HRESULT _Default([out, retval] BSTR* pVal);
	[propput, nonbrowsable,
		id(DISPID_VALUE),
		helpstring("")]
	HRESULT _Default([in] BSTR newVal);
	////////////////////////////////////////
	[id(1), helpstring("")] HRESULT AddItem([in] BSTR Text);
	[id(2), helpstring("")] HRESULT RemoveItem([in] BSTR Text);
	[id(3), helpstring("")] HRESULT Clear();
};

/////////////////////////////////////////////////////////////////////////////
// _IDDComboBoxEvents
[
	uuid("E2B34CAE-D8DC-4920-85B8-81898800E512"),
	dispinterface,
	helpstring("_IDDComboBoxEvents Interface")
]
__interface _IDDComboBoxEvents
{
	[id(1), helpstring("")] HRESULT EditChange();
	[id(2), helpstring("")] HRESULT SelectionChange();
};

/////////////////////////////////////////////////////////////////////////////
// CDDComboBox
[
	coclass,
	threading("apartment"),
	vi_progid("DDControlPack.DDComboBox"),
	progid("DDControlPack.DDComboBox.1"),
	version(1.0),
	uuid("992B226E-B124-4F17-95B7-5BC32A0C6DB7"),
	helpstring("DDComboBox Class"),
	event_source("com"),
	support_error_info(IDDComboBox),
	registration_script("control.rgs")
]
class ATL_NO_VTABLE CDDComboBox :
	public IDispatchImpl<IDDComboBox>,
	public IPersistStreamInitImpl<CDDComboBox>,
	public IOleControlImpl<CDDComboBox>,
	public IOleObjectImpl<CDDComboBox>,
	public IOleInPlaceActiveObjectImpl<CDDComboBox>,
	public IViewObjectExImpl<CDDComboBox>,
	public IOleInPlaceObjectWindowlessImpl<CDDComboBox>,
	public IPersistStorageImpl<CDDComboBox>,
	public ISpecifyPropertyPagesImpl<CDDComboBox>,
	public IQuickActivateImpl<CDDComboBox>,
	public IDataObjectImpl<CDDComboBox>,
	public CComControl<CDDComboBox>
{
private:
	CContainedWindow m_ctlComboBox;

	__event __interface _IDDComboBoxEvents;

/////////////////////////////////////////////////////////////////////////////
// properties
	LONG					m_Reserved0;			// reserved
	LONG					m_Reserved1;			// reserved
	VARIANT_BOOL			m_Enabled;				// enabled
	OLE_COLOR				m_FillColor;			// fill color
	OLE_COLOR				m_BackColor;			// background color
	OLE_COLOR				m_ForeColor;			// foreground color
	CComPtr<IFontDisp>		m_spFontDisp;			// font
	VARIANT_BOOL			m_Sorted;				// sorted alphabetically
	CComBSTR				m_Text;					// text

/////////////////////////////////////////////////////////////////////////////
// property change validators
	HRESULT OnBackColorChanging(OLE_COLOR newVal);

/////////////////////////////////////////////////////////////////////////////
// property change handlers
	void OnEnabledChanged();
	void OnBackColorChanged();
	void OnForeColorChanged();

/////////////////////////////////////////////////////////////////////////////

	// the background brush
	CBrush m_BackBrush;

	// creates the background brush
	void CreateBackgroundBrush(OLE_COLOR BackColor);

	// combo box accelerators
	HACCEL m_hAccel;

public:
	CDDComboBox();

DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct();
	void FinalRelease();

static const TCHAR* GetObjectFriendlyName();

DECLARE_OLEMISC_STATUS(
	OLEMISC_RECOMPOSEONRESIZE |
	OLEMISC_CANTLINKINSIDE |
	OLEMISC_INSIDEOUT |
	OLEMISC_ACTIVATEWHENVISIBLE |
	OLEMISC_SETCLIENTSITEFIRST)

BEGIN_PROP_MAP(CDDComboBox)
	PROP_DATA_ENTRY("_reserved0", m_Reserved0, VT_I4)
	PROP_DATA_ENTRY("_reserved1", m_Reserved1, VT_I4)
	PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
	PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
	PROP_ENTRY("Enabled", DISPID_ENABLED, CLSID_NULL)
	PROP_ENTRY("FillColor", DISPID_FILLCOLOR, CLSID_NULL)
	PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_NULL)
	PROP_ENTRY("ForeColor", DISPID_FORECOLOR, CLSID_NULL)
	PROP_ENTRY("Font", DISPID_FONT, CLSID_NULL)
	PROP_ENTRY("Sorted", DISPID_SORTED, CLSID_NULL)
	// Example entries
	// PROP_ENTRY("Property Description", dispid, clsid)
	// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

BEGIN_MSG_MAP(CDDComboBox)
	MESSAGE_HANDLER(WM_CREATE, OnCreate)
	MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
	MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
	MESSAGE_HANDLER(WM_CTLCOLOREDIT, OnCtlColorComboBox)
	MESSAGE_HANDLER(WM_CTLCOLORLISTBOX, OnCtlColorComboBox)
	MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColorComboBox)
	MESSAGE_HANDLER(WM_FIRE_SELECTION_CHANGE, OnFireSelectionChange)
	COMMAND_HANDLER(IDC_COMBOBOX, CBN_EDITCHANGE, OnComboBoxEditChanged)
	COMMAND_HANDLER(IDC_COMBOBOX, CBN_SELCHANGE, OnComboBoxSelChanged)
	COMMAND_ID_HANDLER(ID_CUT, OnCut)
	COMMAND_ID_HANDLER(ID_COPY, OnCopy)
	COMMAND_ID_HANDLER(ID_PASTE, OnPaste)
	COMMAND_ID_HANDLER(ID_UNDO, OnUndo)
	CHAIN_MSG_MAP(CComControl<CDDComboBox>)
ALT_MSG_MAP(1)
	// Replace this with message map entries for superclassed ComboBox
END_MSG_MAP()
// Handler prototypes:
//  LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
//  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
//  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

// base class overrides
	HRESULT OnDraw(ATL_DRAWINFO& di);

// message handlers
	BOOL PreTranslateAccelerator(LPMSG pMsg, HRESULT& hRet);
	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnCtlColorComboBox(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnFireSelectionChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnComboBoxEditChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
	LRESULT OnComboBoxSelChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
	LRESULT OnCut(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
	LRESULT OnCopy(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
	LRESULT OnPaste(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
	LRESULT OnUndo(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);

// IOleObject
	STDMETHOD(SetClientSite)(IOleClientSite *pClientSite);

// IOleInPlaceObjectWindowless
	STDMETHOD(SetObjectRects)(LPCRECT prcPos,LPCRECT prcClip);

// IViewObjectEx
	DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IDDComboBox
	IMPLEMENT_CUSTOM_BOOL_PROPERTY(Enabled,m_Enabled,DISPID_ENABLED);
	IMPLEMENT_CUSTOM_COLOR_PROPERTY(FillColor,m_FillColor,DISPID_FILLCOLOR);
	IMPLEMENT_CUSTOM_COLOR_PROPERTY(BackColor,m_BackColor,DISPID_BACKCOLOR);
	IMPLEMENT_CUSTOM_COLOR_PROPERTY(ForeColor,m_ForeColor,DISPID_FORECOLOR);
	STDMETHOD(get_Font)(IFontDisp** pVal);
	STDMETHOD(put_Font)(IFontDisp* newVal);
	STDMETHOD(putref_Font)(IFontDisp* newVal);
	IMPLEMENT_CUSTOM_BOOL_PROPERTY(Sorted,m_Sorted,DISPID_SORTED);
	STDMETHOD(get_Text)(BSTR* pVal);
	STDMETHOD(put_Text)(BSTR newVal);
	STDMETHOD(AddItem)(BSTR Text);
	STDMETHOD(RemoveItem)(BSTR Text);
	STDMETHOD(Clear)();
	STDMETHOD(get__Default)(BSTR* pVal);
	STDMETHOD(put__Default)(BSTR newVal);
};

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)


Written By
Web Developer
United Kingdom United Kingdom
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions