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

📄 kedit.h

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

 Created: 12.10.99 22:07:13
 Version: 1.0.0

 Declaration of _kEdit class
*/

#ifndef __KEDIT_H_
#define __KEDIT_H_

#include "resource.h"       // main symbols
#include <atlctl.h>
#include "SingleEdit.h"
#include "RenderEdit.h"
#include "kSetEditorCP.h"
#include "CategorizeProperties.h"
#include "MouseMove.h"

#define k_inline inline

namespace 
{
	const TCHAR EDIT_DEFAULT_STR[] = _T("kEdit");

	typedef _sedit<TCHAR> _edit;
}

/////////////////////////////////////////////////////////////////////////////
// _kEdit
class ATL_NO_VTABLE _kEdit : 
	public CComObjectRootEx<CComSingleThreadModel>,
	public CStockPropImpl<_kEdit, IkEdit, &IID_IkEdit, &LIBID_KSETEDITORLib>,	
	public CComControl<_kEdit>,
	public IPersistStreamInitImpl<_kEdit>,
	public IOleControlImpl<_kEdit>,
	public IOleObjectImpl<_kEdit>,
	public IOleInPlaceActiveObjectImpl<_kEdit>,
	public IViewObjectExImpl<_kEdit>,
	public IOleInPlaceObjectWindowlessImpl<_kEdit>,
//	public ISupportErrorInfo,
	public IConnectionPointContainerImpl<_kEdit>,
	public IPersistStorageImpl<_kEdit>,
	public ISpecifyPropertyPagesImpl<_kEdit>,
	public IQuickActivateImpl<_kEdit>,
	public IDataObjectImpl<_kEdit>,
	public IProvideClassInfo2Impl<&CLSID_kEdit, &DIID__IkEditEvents, &LIBID_KSETEDITORLib>,
	public IPropertyNotifySinkCP<_kEdit>,
	public CComCoClass<_kEdit, &CLSID_kEdit>,	
	public CProxy_IkEditEvents< _kEdit >,
	public IObjectSafetyImpl<_kEdit, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA>,
	_RenderEdit<_kEdit>,
	_edit::_sink,
	public CProxyIkEditEvents< _kEdit >,
	public _kICategorizeProperiesImpl<_kEdit>

{	
	enum {kDefaultUndoStackSize = 64};

public:
	//for support macros IMPLEMENT_XXX
	typedef _kEdit T;
	T* m_pT;
	
	//properties
	BOOL m_bEnabled;
	BOOL m_bHideSelection;
	kCaretViewEnum m_eCaretView;
	kFontEffectEnum m_eFontEffect;
	kAlignmentEditEnum m_eAlignment;
	kAppearanceEnum m_nAppearance;	
	OLE_COLOR m_clrBackColor;	
	OLE_COLOR m_clrBorderColor;
	OLE_COLOR m_clrContainerColor;
	OLE_COLOR m_clrForeColor;		   
	CComPtr<IFontDisp> m_pFont;	
	CComPtr<IPictureDisp> m_pMouseIcon;	
	kMousePointerEnum m_eMousePointer;			
   long m_lUndoStackSize;

	//data	
	HPALETTE m_hPalette;
	OLE_COLOR m_clrShadowColor;
	OLE_COLOR m_clrHighlightColor;

	_edit* m_pedit;				
	
	//font and box characteristic for render class	
	_kGDIObject<HFONT> m_hFont;
	POINT m_pTxt;				 
	unsigned int m_uiScroll; 
	bool m_IsFocused;
	unsigned int m_uiLength; 
	SIZE  m_szControl;		 

private:
	enum {INDENT_LEFT = 3};

	POINT m_pCaret;			 
	SIZE  m_szTxt;				 
	
	unsigned int m_uiWidthBox; 
	unsigned int m_uiIndentRight; 
	unsigned int m_uiWidthCaret; 
	
	long m_baseline;
	long m_yChar;
	long m_xChar;
	long m_tmOverhang;
	unsigned char m_tmPitchAndFamily;

	HCURSOR m_hCursor;
	HMENU m_hMenu;
	HBITMAP m_hCacheBitmap;
	bool m_bMousePressed;	
	
	typedef BOOL (WINAPI *PTRF_TrackMouseEvent)(LPTRACKMOUSEEVENT);
	PTRF_TrackMouseEvent m_pfTrackMouseEvent;	

public:
	CComPtr<_IMouseMove> m_pUnkMouseMove;
	bool m_bMouseHover;

public:
	_kEdit() :
		m_bEnabled(TRUE),
		m_nAppearance(k3dHigh),	
		m_clrBackColor(0x80000000 | COLOR_WINDOW),	
		m_clrBorderColor(0x80000000 | COLOR_BTNTEXT),
		m_clrContainerColor(0x80000000 | COLOR_BTNFACE),
		m_clrForeColor(0x80000000 | COLOR_BTNTEXT),
		m_clrShadowColor(0x80000000 | COLOR_3DSHADOW),
		m_clrHighlightColor(0x80000000 | COLOR_3DHILIGHT),			
		m_hPalette(0),
		m_uiScroll(0),
		m_baseline(0),
		m_yChar(0),
		m_xChar(0),
		m_IsFocused(false),	
		m_hMenu(0),
		m_bMousePressed(false),		
		m_eMousePointer(kBeam),	
		m_bHideSelection(FALSE),
		m_eCaretView(kCaretHorz),
		m_eFontEffect(kNoEffect),
		m_lUndoStackSize(kDefaultUndoStackSize),
		m_eAlignment(kLeftJustify),
		m_uiWidthCaret(1),
		m_hCursor(0),
		m_uiWidthBox(0),
		m_uiIndentRight(0),
		m_uiLength(0),
		m_hCacheBitmap(0),
		m_tmOverhang(0),
		m_tmPitchAndFamily(0),
		m_bMouseHover(false),
		m_pfTrackMouseEvent(0)
	{
		m_pCaret.y = m_pCaret.x = 0;
		m_pTxt.y = m_pTxt.x = 0;
		m_szControl.cx = m_szControl.cy = 0;

		m_bWindowOnly = TRUE;
	}
	
	HRESULT FinalConstruct()
	{
		DetectTrackMouse();
		try
		{	
			m_pedit = new _edit(_T(""), m_lUndoStackSize, this);
		}
		catch(...){return E_FAIL;}
		return S_OK;
	}


DECLARE_REGISTRY_RESOURCEID(IDR_KEDIT)
DECLARE_NOT_AGGREGATABLE(_kEdit)
DECLARE_GET_CONTROLLING_UNKNOWN()

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(_kEdit)
	COM_INTERFACE_ENTRY(IkEdit)
	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_ENTRY(IOleInPlaceActiveObject)
	COM_INTERFACE_ENTRY(IOleControl)
	COM_INTERFACE_ENTRY(IOleObject)
	COM_INTERFACE_ENTRY(IPersistStreamInit)
//	COM_INTERFACE_ENTRY(ISupportErrorInfo)
	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_IMPL(IConnectionPointContainer)
	COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID__IMouseMove, _kMouseMoveImpl, m_pUnkMouseMove.p)
	COM_INTERFACE_ENTRY(ICategorizeProperties)
END_COM_MAP()

BEGIN_PROP_MAP(_kEdit)
	PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
	PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
	PROP_DATA_ENTRY("_scolor", m_clrShadowColor, VT_UI4)
	PROP_DATA_ENTRY("_hcolor", m_clrHighlightColor, VT_UI4)

	PROP_ENTRY("Appearance", dispidAppearance, CLSID_NULL)
	PROP_ENTRY("BackColor", DISPID_BACKCOLOR, CLSID_StockColorPage)	
	PROP_ENTRY("BorderColor", DISPID_BORDERCOLOR, CLSID_StockColorPage)
	PROP_ENTRY("ForeColor", DISPID_FORECOLOR, CLSID_StockColorPage)
	PROP_ENTRY("ContainerColor",dispidContainerColor, CLSID_StockColorPage)	
	PROP_ENTRY("Enabled", DISPID_ENABLED, CLSID_NULL)
	PROP_ENTRY("Font", DISPID_FONT, CLSID_StockFontPage)
	PROP_ENTRY("MouseIcon", DISPID_MOUSEICON, CLSID_StockPicturePage)
	PROP_ENTRY("MousePointer", DISPID_MOUSEPOINTER, CLSID_NULL)	
	PROP_ENTRY("Text", DISPID_TEXT, CLSID_NULL)
	PROP_ENTRY("HideSelection", dispidHideSelection, CLSID_NULL)
	PROP_ENTRY("CaretView", dispidCaret, CLSID_NULL)
	PROP_ENTRY("FontEffect", dispidFontEffect, CLSID_NULL)
	PROP_ENTRY("UndoStackSize", dispidStackSize, CLSID_NULL)
	PROP_ENTRY("Alignment", dispidAlignment, CLSID_NULL)
	
	// Example entries
	// PROP_ENTRY("Property Description", dispid, clsid)
	// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

BEGIN_CONNECTION_POINT_MAP(_kEdit)
	CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
	CONNECTION_POINT_ENTRY(DIID__IkEditEvents)
	CONNECTION_POINT_ENTRY(IID_IkEditEvents)
END_CONNECTION_POINT_MAP()

BEGIN_CATEGORY_MAP (_kEdit)
	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_MSG_MAP(_kEdit)
	MESSAGE_HANDLER(WM_CREATE, OnCreate)
	MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
	MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
	MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave)
	MESSAGE_HANDLER(WM_RBUTTONDOWN, OnRButtonDown)
	MESSAGE_HANDLER(WM_RBUTTONUP, OnRButtonUp)
	MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
	MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
	MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDbl)	
	MESSAGE_HANDLER(WM_CHAR, OnChar)
	MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown)	
	MESSAGE_HANDLER(WM_KEYUP, OnKeyUp)	
	MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode);
	MESSAGE_HANDLER(WM_SIZE, OnSize);
	MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd); 
	MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
	MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
	MESSAGE_HANDLER(WM_PAINT, OnPaint)

	CHAIN_MSG_MAP(CComControl<_kEdit>)
	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_PROP_NAME_MAP(_kEdit) 	
	CATEGORY_PROP_NAME(1, _T("Color"))
END_CATEGORY_PROP_NAME_MAP()

BEGIN_PROPERTY_TO_CATEGORY_NAME_MAP (_kEdit)		
	PROPERTY_TO_CATEGORY(DISPID_BACKCOLOR,      1)
	PROPERTY_TO_CATEGORY(DISPID_BORDERCOLOR,    1)
	PROPERTY_TO_CATEGORY(DISPID_FORECOLOR,      1)
	PROPERTY_TO_CATEGORY(dispidContainerColor,  1)	
	PROPERTY_TO_CATEGORY(dispidAlignment,       PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidAppearance,      PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidFontEffect,      PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidHideSelection,   PROPCAT_Appearance)
	PROPERTY_TO_CATEGORY(dispidCaret,           PROPCAT_Appearance) 	
	PROPERTY_TO_CATEGORY(DISPID_FONT,           PROPCAT_Font)
	PROPERTY_TO_CATEGORY(DISPID_TEXT,           PROPCAT_Text)		
END_PROPERTY_TO_CATEGORY_MAP()

static CWndClassInfo& GetWndClassInfo() 
{
	static CWndClassInfo wc = 
	{ 
		{ sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, StartWindowProc,
		  0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, EDIT_DEFAULT_STR, NULL },
		NULL, NULL, 0, TRUE, 0, _T("") 
	}; 
	return wc; 
}

// ISupportsErrorInfo
/*
	STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
	{
		static const IID* arr[] = 
		{
			&IID_IkEdit,
		};
		for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
		{
			if (InlineIsEqualGUID(*arr[i], riid))
				return S_OK;
		}
		return S_FALSE;
	}
*/

// IViewObjectEx
	DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
	
	BOOL PreTranslateAccelerator(MSG *pMsg, HRESULT& hr);
	HRESULT OnDrawAdvanced(ATL_DRAWINFO& di);
	HRESULT FireOnChanged (DISPID dispID);
	HRESULT FireOnRequestEdit(DISPID dispID);

//IkEdit
public:

IMPLEMENT_STOCKPROP(kAppearanceEnum, Appearance, nAppearance, dispidAppearance);
IMPLEMENT_STOCKPROP(OLE_COLOR, ContainerColor, clrContainerColor, dispidContainerColor);
IMPLEMENT_BOOL_STOCKPROP(HideSelection, bHideSelection, dispidHideSelection);
IMPLEMENT_STOCKPROP(kCaretViewEnum, CaretView, eCaretView, dispidCaret);
IMPLEMENT_STOCKPROP(kFontEffectEnum, FontEffect, eFontEffect, dispidFontEffect);
IMPLEMENT_STOCKPROP(kAlignmentEditEnum, Alignment, eAlignment, dispidAlignment);
IMPLEMENT_STOCKPROP(long, UndoStackSize, lUndoStackSize, dispidStackSize);
IMPLEMENT_STOCKPROP(kMousePointerEnum, MousePointer, eMousePointer, DISPID_MOUSEPOINTER);

	STDMETHOD(put_Text)(BSTR pText);	
	STDMETHOD(get_Text)(BSTR* ppText);	
	STDMETHOD(AboutBox)();

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

//window message
	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnRButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnRButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnLButtonDbl(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);	
	LRESULT OnChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnKeyUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnKeyDown(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 OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

private:

	void onchange() {FireChange();}

	void UpdateColors();
	void CreateMenu();	
	void ExecuteMenu (int id);		
	void SetWidthIndentValue();
	bool SetTextCoordSize(bool bCycleYes = true);
	void SetCaretPosition(unsigned int x);
	void ShowCaretHelper();
	bool MoveCaretLeft();
	bool MoveCaretRight();
	void SetCaretByMouseClick(POINT& p, bool bshift);
	void CreateCaretHelper();	
	void CalcCoordSizeCaret();	
	void SetMousePointer();	
	void CalcCoordY() {m_pTxt.y = max(0,  ((m_szControl.cy - m_yChar) >> 1));}
	int GetExtentChar (TCHAR ch);
	short CrackButton(short wParam);
	short CrackShift(short wParam);

	void FireChange();
	void FireSetFocus();
	void FireKillFocus();
	void FireMouseLeave();
	void FireClick();
	void FireDblClick();						
	void FireKeyDown(SHORT KeyCode, SHORT Shift);
	void FireKeyPress(SHORT KeyAscii);
	void FireKeyUp(SHORT KeyCode, SHORT Shift);
	void FireMouseDown(SHORT Button, SHORT Shift, LONG X, LONG Y);	
	void FireMouseUp(SHORT Button, SHORT Shift, LONG X, LONG Y);
	void FireMouseMove(SHORT Button, SHORT Shift, LONG X, LONG Y);

	void TrackMouse();
	void DetectTrackMouse();

public:
	void Get3DColors (COLORREF clr, COLORREF& clrShadow, COLORREF& clrHighlight);

};

#include "kEdit.inl"

#endif //__KEDIT_H_

⌨️ 快捷键说明

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