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