Click here to Skip to main content
15,860,972 members
Articles / Desktop Programming / WTL

Form Designer

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

#pragma once

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

/////////////////////////////////////////////////////////////////////////////
// IDDCheckBox
[
	object,
	uuid("25EB9333-82E4-4C8A-BDF1-5C7AB5B48CE3"),
	dual,
	helpstring("IDDCheckBox Interface"),
	pointer_default(unique)
]
__interface IDDCheckBox : 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);
	////////////////////////////////////////
	// 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);
	////////////////////////////////////////
	// text
	[propget, requestedit, bindable,
		id(DISPID_TEXT),
		helpstring("")]
	HRESULT Text([out, retval] BSTR* pVal);
	[propput, requestedit, bindable,
		id(DISPID_TEXT),
		helpstring("")]
	HRESULT Text([in] BSTR newVal);
	////////////////////////////////////////
	// text align
	[propget, requestedit, bindable,
		id(DISPID_TEXTALIGN),
		helpstring("")]
	HRESULT TextAlign([out, retval] ddcpTextAlign* pVal);
	[propput, requestedit, bindable,
		id(DISPID_TEXTALIGN),
		helpstring("")]
	HRESULT TextAlign([in] ddcpTextAlign newVal);
	////////////////////////////////////////
	// value
	[propget, requestedit, bindable,
		id(DISPID_VALUE_NOTDEFAULT),
		helpstring("")]
	HRESULT Value([out, retval] LONG* pVal);
	[propput, requestedit, bindable,
		id(DISPID_VALUE_NOTDEFAULT),
		helpstring("")]
	HRESULT Value([in] LONG newVal);
	////////////////////////////////////////
	// default property
	[propget, nonbrowsable,
		id(DISPID_VALUE),
		helpstring("")]
	HRESULT _Default([out, retval] LONG* pVal);
	[propput, nonbrowsable,
		id(DISPID_VALUE),
		helpstring("")]
	HRESULT _Default([in] LONG newVal);
};

/////////////////////////////////////////////////////////////////////////////
// _IDDCheckBoxEvents
[
	uuid("F0AA99B8-3166-4C2E-8334-16411E71773F"),
	dispinterface,
	helpstring("_IDDCheckBoxEvents Interface")
]
__interface _IDDCheckBoxEvents
{
	[id(1), helpstring("")] HRESULT Click();
};

/////////////////////////////////////////////////////////////////////////////
// CDDCheckBox
[
	coclass,
	threading("apartment"),
	vi_progid("DDControlPack.DDCheckBox"),
	progid("DDControlPack.DDCheckBox.1"),
	version(1.0),
	uuid("B2FABDD7-F674-4BD1-BC25-51057837DFBB"),
	helpstring("DDCheckBox Class"),
	event_source("com"),
	support_error_info(IDDCheckBox),
	registration_script("control.rgs")
]
class ATL_NO_VTABLE CDDCheckBox :
	public IDispatchImpl<IDDCheckBox>,
	public IPersistStreamInitImpl<CDDCheckBox>,
	public IOleControlImpl<CDDCheckBox>,
	public IOleObjectImpl<CDDCheckBox>,
	public IOleInPlaceActiveObjectImpl<CDDCheckBox>,
	public IViewObjectExImpl<CDDCheckBox>,
	public IOleInPlaceObjectWindowlessImpl<CDDCheckBox>,
	public IPersistStorageImpl<CDDCheckBox>,
	public ISpecifyPropertyPagesImpl<CDDCheckBox>,
	public IQuickActivateImpl<CDDCheckBox>,
	public IDataObjectImpl<CDDCheckBox>,
	public CComControl<CDDCheckBox>
{
private:
	CContainedWindow m_ctlButton;

	__event __interface _IDDCheckBoxEvents;

/////////////////////////////////////////////////////////////////////////////
// properties
	LONG					m_Reserved0;			// reserved
	LONG					m_Reserved1;			// reserved
	VARIANT_BOOL			m_Enabled;				// enabled
	OLE_COLOR				m_BackColor;			// background color
	OLE_COLOR				m_ForeColor;			// foreground color
	CComPtr<IFontDisp>		m_spFontDisp;			// font
	CComBSTR				m_Text;					// text
	ddcpTextAlign			m_TextAlign;			// text align
	LONG					m_Value;				// value

/////////////////////////////////////////////////////////////////////////////
// property change validators
	HRESULT OnTextAlignChanging(ddcpTextAlign newVal);
	HRESULT OnValueChanging(LONG newVal);

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

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

	// draws the button
	void DrawButton(CDCHandle hDC,CRect Rect,BOOL HasFocus,BOOL IsSelected);

public:
	CDDCheckBox();

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(CDDCheckBox)
	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("BackColor", DISPID_BACKCOLOR, CLSID_NULL)
	PROP_ENTRY("ForeColor", DISPID_FORECOLOR, CLSID_NULL)
	PROP_ENTRY("Font", DISPID_FONT, CLSID_NULL)
	PROP_ENTRY("Text", DISPID_TEXT, CLSID_NULL)
	PROP_ENTRY("TextAlign", DISPID_TEXTALIGN, CLSID_NULL)
	PROP_ENTRY("Value", DISPID_VALUE_NOTDEFAULT, CLSID_NULL)
	// Example entries
	// PROP_ENTRY("Property Description", dispid, clsid)
	// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

BEGIN_MSG_MAP(CDDCheckBox)
	MESSAGE_HANDLER(WM_CREATE, OnCreate)
	MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
	MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
	COMMAND_CODE_HANDLER(BN_CLICKED, OnBNClicked)
	CHAIN_MSG_MAP(CComControl<CDDCheckBox>)
ALT_MSG_MAP(1)
	// Replace this with message map entries for superclassed Button
	MESSAGE_HANDLER(WM_ERASEBKGND, OnButtonEraseBkgnd)
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 FireViewChange();

// message handlers
	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnBNClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);

// button message handlers
	LRESULT OnButtonEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

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

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

// IViewObjectEx
	DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IDDCheckBox
	IMPLEMENT_CUSTOM_BOOL_PROPERTY(Enabled,m_Enabled,DISPID_ENABLED);
	IMPLEMENT_CUSTOM_COLOR_PROPERTY(BackColor,m_BackColor,DISPID_BACKCOLOR);
	IMPLEMENT_CUSTOM_COLOR_PROPERTY(ForeColor,m_ForeColor,DISPID_FORECOLOR);
	IMPLEMENT_CUSTOM_FONT_PROPERTY(Font,m_spFontDisp,DISPID_FONT);
	IMPLEMENT_CUSTOM_TEXT_PROPERTY(Text,m_Text,DISPID_TEXT);
	IMPLEMENT_CUSTOM_PROPERTY(ddcpTextAlign,TextAlign,m_TextAlign,DISPID_TEXTALIGN);
	IMPLEMENT_CUSTOM_PROPERTY(LONG,Value,m_Value,DISPID_VALUE_NOTDEFAULT);
	STDMETHOD(get__Default)(LONG* pVal);
	STDMETHOD(put__Default)(LONG 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