⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kbutton.h

📁 vc编写的
💻 H
字号:
/*
 Copyright (c) 1999, kSet Lab 
 Author: Konstantin Bukreev 
 E-mail: konstantin@mail.primorye.ru 

 Created: 15.10.99 19:25:13
 Version: 1.0.0

 kButton.h : Declaration of the _kButton
*/

#ifndef __KBUTTON_H_
#define __KBUTTON_H_

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


#include "RenderButton.h"
#include "HelperPicture.h"
#include "HelperFontProperty.h"
#include "ApartmentThread.h"
#include "CategorizeProperties.h"
#include "kSetButtonCP.h"

#include "MouseMove.h"
#include "AnimationClick.h"

/////////////////////////////////////////////////////////////////////////////
// _kButton
class ATL_NO_VTABLE _kButton : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public CStockPropImpl<_kButton, IkButton, &IID_IkButton, &LIBID_KSETBUTTONLib>,
	public CComControl<_kButton>,
	public IPersistStreamInitImpl<_kButton>,
	public IOleControlImpl<_kButton>,
	public IOleObjectImpl<_kButton>,
	public IOleInPlaceActiveObjectImpl<_kButton>,
	public IViewObjectExImpl<_kButton>,
	public IOleInPlaceObjectWindowlessImpl<_kButton>,
	public IConnectionPointContainerImpl<_kButton>,
	public IPersistStorageImpl<_kButton>,
	public ISpecifyPropertyPagesImpl<_kButton>,
	public IQuickActivateImpl<_kButton>,
	public IDataObjectImpl<_kButton>,
	public IProvideClassInfo2Impl<&CLSID_kButton, &DIID__IkButtonEvents, &LIBID_KSETBUTTONLib>,
	public IPropertyNotifySinkCP<_kButton>,
	public CComCoClass<_kButton, &CLSID_kButton>,
	public IObjectSafetyImpl<_kButton, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
	_HelperPictureProperty<_kButton>,
	_HelperFontProperty<_kButton>,
	_Render<_kButton>,
	public _kICategorizeProperiesImpl<_kButton>,
	public CProxy_IkButtonEvents< _kButton >,
	public CProxyIkButtonEvents< _kButton >
	
{	
	//for support macros IMPLEMENT_STOCKPROP
	typedef _kButton T;	
	T* m_pT;

public:
	enum Status {stStatic = 0, stHover, stPush, stDisabled};

	//stock  properties
	short m_sPictureSpacing;
	BOOL m_bShowStateAsFlat;
	BOOL m_bEnabled;	
	BOOL m_bHoverEnabled;

	kFocusEnum m_ShowFocus;	
	kAlignmentEnum m_Alignment;
	kAppearanceEnum m_AppearanceStatic;
	kAppearanceEnum m_AppearanceHover;
	kAppearanceEnum m_AppearancePush;
	
	OLE_COLOR m_clrBackColor;
	OLE_COLOR m_clrBorderColor;	
	OLE_COLOR m_clrTextHoverColor;
	OLE_COLOR m_clrTextPushColor;
	OLE_COLOR m_clrTextStaticColor;
	OLE_COLOR m_clrHighlightColor;
	OLE_COLOR m_clrShadowColor;
	
	CComBSTR m_bstrTextStatic;
	CComBSTR m_bstrTextPush;
	CComBSTR m_bstrTextHover;
			
	CComPtr<IPictureDisp> m_pPictureHover;
	CComPtr<IPictureDisp> m_pPictureStatic;
	CComPtr<IPictureDisp> m_pPicturePush;
	CComPtr<IPictureDisp> m_pPictureDisabled;	
	CComPtr<IFontDisp> m_pFontHover;
	CComPtr<IFontDisp> m_pFontStatic;
	CComPtr<IFontDisp> m_pFontPush;

	HPALETTE m_hPal;
	bool m_bFocused;
	WORD m_AccelSymbol;

	Status m_Status;
private:	
	HACCEL m_hAccel;
	HBITMAP m_hCacheBitmap;

	typedef BOOL (WINAPI *PTRF_TrackMouseEvent)(LPTRACKMOUSEEVENT);
	PTRF_TrackMouseEvent m_pfTrackMouseEvent;	

public:
	CComPtr<_IMouseMove> m_pUnkMouseMove;
	CComPtr<_IAnimationClick> m_pUnkAnimClick;

//	CComPtr<IUnknown> m_pUnkMarshaler;

public:
	_kButton() :
		m_pT(this), 		
		m_hAccel(0),
		m_bEnabled(TRUE),
		m_Alignment(kLeft),
		m_bHoverEnabled(TRUE),
		m_clrBorderColor(0x80000000 | COLOR_WINDOWTEXT),
		m_clrTextHoverColor(0x80000000 | COLOR_BTNTEXT),	
		m_clrTextPushColor(0x80000000 | COLOR_BTNTEXT),	
		m_clrTextStaticColor(0x80000000 | COLOR_BTNTEXT),		
		m_clrBackColor(0x80000000 | COLOR_BTNFACE),		
		m_clrHighlightColor(0x80000000 | COLOR_3DHILIGHT),
		m_clrShadowColor(0x80000000 | COLOR_3DSHADOW),		
		m_AppearanceStatic(k3dLow),
		m_AppearanceHover(k3dHigh),
		m_AppearancePush(k3dLow),		
		m_ShowFocus(kDrawRect),		
		m_sPictureSpacing(5),
		m_bShowStateAsFlat(FALSE),	
		m_bFocused(false),
		m_Status(stStatic),
		m_AccelSymbol(0),
		m_hCacheBitmap(0),
		m_hPal(0),
		m_pfTrackMouseEvent(0)
	{
		m_bWindowOnly = TRUE;
	}

	~_kButton()
	{		
	}

	HRESULT FinalConstruct()
	{	
		DetectTrackMouse();
//		return CoCreateFreeThreadedMarshaler(GetControllingUnknown(), &m_pUnkMarshaler.p);
		return S_OK;
	}

	void FinalRelease()
	{		
		//m_pUnkMarshaler.Release();		
	}

DECLARE_REGISTRY_RESOURCEID(IDR_KBUTTON)
DECLARE_NOT_AGGREGATABLE(_kButton)
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(_kButton)
	COM_INTERFACE_ENTRY(IkButton)
	COM_INTERFACE_ENTRY(IDispatch)
	COM_INTERFACE_ENTRY(IViewObjectEx)
	COM_INTERFACE_ENTRY(IViewObject2)
	COM_INTERFACE_ENTRY(IViewObject)
	COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
	COM_INTERFACE_ENTRY(IOleInPlaceObject)
	COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
	COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
	COM_INTERFACE_ENTRY(IOleControl)
	COM_INTERFACE_ENTRY(IOleObject)
	COM_INTERFACE_ENTRY(IPersistStreamInit)
	COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
	COM_INTERFACE_ENTRY(IConnectionPointContainer)
	COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
	COM_INTERFACE_ENTRY(IQuickActivate)
	COM_INTERFACE_ENTRY(IPersistStorage)
	COM_INTERFACE_ENTRY(IDataObject)
	COM_INTERFACE_ENTRY(IProvideClassInfo)
	COM_INTERFACE_ENTRY(IProvideClassInfo2)
	COM_INTERFACE_ENTRY(ICategorizeProperties)
	COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
	
	COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID__IAnimationClick, _kAnimationClickImpl, m_pUnkAnimClick.p)
	COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID__IMouseMove, _kMouseMoveImpl, m_pUnkMouseMove.p)
	
	//COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
END_COM_MAP()

BEGIN_PROP_MAP(_kButton)
	PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
	PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
	PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)
	PROP_ENTRY("BorderColor", DISPID_BORDERCOLOR, CLSID_StockColorPage)
	PROP_ENTRY("Enabled", DISPID_ENABLED, CLSID_NULL)

	PROP_ENTRY("PictureAlignment", dispidAlignment, CLSID_NULL)
	PROP_ENTRY("HoverEnabled", dispidHoverEnabled, CLSID_NULL)
	PROP_ENTRY("TextPushColor", dispidTextPushColor, CLSID_StockColorPage)
	PROP_ENTRY("TextHoverColor", dispidTextHoverColor, CLSID_StockColorPage)
	PROP_ENTRY("TextStaticColor", dispidTextStaticColor, CLSID_StockColorPage)
	PROP_ENTRY("TextPush", dispidTextPush, CLSID_NULL)
	PROP_ENTRY("TextStatic", dispidTextStatic, CLSID_NULL)
	PROP_ENTRY("TextHover", dispidTextHover, CLSID_NULL)
	PROP_ENTRY("PictureSpacing", dispidPictureSpacing, CLSID_NULL)
	PROP_ENTRY("AppearanceStatic", dispidAppearanceStatic, CLSID_NULL)
	PROP_ENTRY("AppearanceHover", dispidAppearanceHover, CLSID_NULL)
	PROP_ENTRY("AppearancePush", dispidAppearancePush, CLSID_NULL)
	PROP_ENTRY("PicturePush", dispidPicturePush, CLSID_StockPicturePage)
	PROP_ENTRY("PictureHover", dispidPictureHover, CLSID_StockPicturePage)
	PROP_ENTRY("PictureStatic", dispidPictureStatic, CLSID_StockPicturePage)
	PROP_ENTRY("PictureDisabled", dispidPictureDisabled, CLSID_StockPicturePage)
	PROP_ENTRY("FontHover", dispidFontHover, CLSID_StockFontPage)
	PROP_ENTRY("FontStatic", dispidFontStatic, CLSID_StockFontPage)
	PROP_ENTRY("FontPush", dispidFontPush, CLSID_StockFontPage)
	PROP_ENTRY("HighlightColor", dispidHighlightColor, CLSID_StockColorPage)
	PROP_ENTRY("ShadowColor", dispidShadowColor, CLSID_StockColorPage)	
	PROP_ENTRY("ShowFocus", dispidShowFocus, CLSID_NULL)
	PROP_ENTRY("ShowStateAsFlat", dispidShowStateAsFlat, CLSID_NULL)

	PROP_PAGE(CLSID_kButtonPropPage)

	// Example entries
	// PROP_ENTRY("Property Description", dispid, clsid)
	// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

BEGIN_CONNECTION_POINT_MAP(_kButton)
	CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
	CONNECTION_POINT_ENTRY(DIID__IkButtonEvents)
	CONNECTION_POINT_ENTRY(IID_IkButtonEvents)
END_CONNECTION_POINT_MAP()

BEGIN_MSG_MAP(_kButton)
	MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
	MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
	MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUP)
	MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
	MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
	MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
	MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)	
	MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)
	MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)
	MESSAGE_HANDLER(WM_SIZE, OnSize)
	MESSAGE_HANDLER(WM_DESTROY, OnDestroy)

	CHAIN_MSG_MAP(CComControl<_kButton>)
	DEFAULT_REFLECTION_HANDLER()
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);

BEGIN_CATEGORY_MAP (_kButton)
	IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
	IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
	IMPLEMENTED_CATEGORY(CATID_PersistsToStreamInit)
	IMPLEMENTED_CATEGORY(CATID_PersistsToStorage)
	IMPLEMENTED_CATEGORY(CATID_Insertable)
	IMPLEMENTED_CATEGORY(CATID_Control)
	IMPLEMENTED_CATEGORY(CATID_Programmable)
END_CATEGORY_MAP ()

BEGIN_CATEGORY_PROP_NAME_MAP(_kButton) 
	CATEGORY_PROP_NAME(1, _T("Picture"))
	CATEGORY_PROP_NAME(2, _T("Color"))
END_CATEGORY_PROP_NAME_MAP()

BEGIN_PROPERTY_TO_CATEGORY_NAME_MAP (_kButton)
	PROPERTY_TO_CATEGORY(dispidTextPush,   PROPCAT_Text)
	PROPERTY_TO_CATEGORY(dispidTextStatic, PROPCAT_Text)
	PROPERTY_TO_CATEGORY(dispidTextHover,  PROPCAT_Text)
	PROPERTY_TO_CATEGORY(dispidFontHover,  PROPCAT_Font)
	PROPERTY_TO_CATEGORY(dispidFontStatic, PROPCAT_Font)
	PROPERTY_TO_CATEGORY(dispidFontPush,   PROPCAT_Font)
	PROPERTY_TO_CATEGORY(dispidPictureDisabled, 1)
	PROPERTY_TO_CATEGORY(dispidPictureStatic,   1)
	PROPERTY_TO_CATEGORY(dispidPictureHover,    1)
	PROPERTY_TO_CATEGORY(dispidPicturePush,     1)
	PROPERTY_TO_CATEGORY(DISPID_BACKCOLOR,      2)
	PROPERTY_TO_CATEGORY(DISPID_BORDERCOLOR,    2)
	PROPERTY_TO_CATEGORY(dispidHighlightColor,  2)
	PROPERTY_TO_CATEGORY(dispidShadowColor,     2)
	PROPERTY_TO_CATEGORY(dispidPicturePush,     2)
	PROPERTY_TO_CATEGORY(dispidTextStaticColor, 2)
	PROPERTY_TO_CATEGORY(dispidTextPushColor,   2)
	PROPERTY_TO_CATEGORY(dispidTextHoverColor,  2)
	PROPERTY_TO_CATEGORY(dispidAlignment,       PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidPictureSpacing,  PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidAppearanceStatic,PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidAppearanceHover, PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidAppearancePush,  PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidShowFocus,       PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidShowStateAsFlat, PROPCAT_Appearance)	
	PROPERTY_TO_CATEGORY(dispidShowStateAsFlat, PROPCAT_Appearance)	
END_PROPERTY_TO_CATEGORY_MAP()


// IViewObjectEx
	DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

public:

// IkButton
IMPLEMENT_STOCKPROP(kAlignmentEnum, PictureAlignment, Alignment, dispidAlignment);
IMPLEMENT_BOOL_STOCKPROP(HoverEnabled, bHoverEnabled, dispidHoverEnabled);
IMPLEMENT_STOCKPROP(OLE_COLOR, TextHoverColor, clrTextHoverColor, dispidTextHoverColor);
IMPLEMENT_STOCKPROP(OLE_COLOR, TextPushColor, clrTextPushColor, dispidTextPushColor);
IMPLEMENT_STOCKPROP(OLE_COLOR, TextStaticColor, clrTextStaticColor, dispidTextStaticColor);
IMPLEMENT_BSTR_STOCKPROP(TextPush, bstrTextPush, dispidTextPush);
IMPLEMENT_BSTR_STOCKPROP(TextStatic, bstrTextStatic, dispidTextStatic);
IMPLEMENT_BSTR_STOCKPROP(TextHover, bstrTextHover, dispidTextHover);
IMPLEMENT_STOCKPROP(kAppearanceEnum, AppearanceStatic, AppearanceStatic, dispidAppearanceStatic);
IMPLEMENT_STOCKPROP(kAppearanceEnum, AppearanceHover, AppearanceHover, dispidAppearanceHover);
IMPLEMENT_STOCKPROP(kAppearanceEnum, AppearancePush, AppearancePush, dispidAppearancePush);
IMPLEMENT_STOCKPROP(short, PictureSpacing, sPictureSpacing, dispidPictureSpacing);
IMPLEMENT_STOCKPROP(OLE_COLOR, HighlightColor, clrHighlightColor, dispidHighlightColor);
IMPLEMENT_STOCKPROP(OLE_COLOR, ShadowColor, clrShadowColor, dispidShadowColor);
IMPLEMENT_STOCKPROP(kFocusEnum, ShowFocus, ShowFocus, dispidShowFocus);
IMPLEMENT_BOOL_STOCKPROP(ShowStateAsFlat, bShowStateAsFlat, dispidShowStateAsFlat);
IMPLEMENT_FONT_PROPERTY(FontStatic, pFontStatic, dispidFontStatic);
IMPLEMENT_FONT_PROPERTY(FontHover, pFontHover, dispidFontHover);
IMPLEMENT_FONT_PROPERTY(FontPush, pFontPush, dispidFontPush);
IMPLEMENT_PICTURE_PROPERTY(PicturePush, pPicturePush, dispidPicturePush);
IMPLEMENT_PICTURE_PROPERTY(PictureHover, pPictureHover, dispidPictureHover);
IMPLEMENT_PICTURE_PROPERTY(PictureStatic, pPictureStatic, dispidPictureStatic);
IMPLEMENT_PICTURE_PROPERTY(PictureDisabled, pPictureDisabled, dispidPictureDisabled);

	STDMETHOD(AboutBox)();
	STDMETHOD(DoClick)(VARIANT_BOOL bAnimate);

//IPersistXXX
	STDMETHOD(InitNew)();

//IOleControl
	STDMETHOD(OnMnemonic)(LPMSG pMsg);
	STDMETHOD(GetControlInfo)( LPCONTROLINFO pCI );

//IOleObjectImpl
	STDMETHOD(DoVerb)(LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite,	LONG lindex, HWND hwndParent, LPCRECT lprcPosRect);

//CComControl overrride
	HRESULT OnDrawAdvanced(ATL_DRAWINFO& di);
	HRESULT FireOnChanged (DISPID dispID);

//windows handlers
	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnLButtonUP(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnKeyUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	
private:
	void Get3DColors (COLORREF clr, COLORREF& clrShadow, COLORREF& clrHighlight);
	void Free();
	void UpdateColors();
	wchar_t GetAccelSymbol(wchar_t* txt, int length);
	void TrackMouse();
	void DetectTrackMouse();
	void FireClick();	
};

#include "kButton.inl"

#endif //__KBUTTON_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -