📄 kbutton.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 + -