/** * Copyright (C) 2014-2050 SOUI团队 * All rights reserved. * * @file SRichEdit.h * @brief RichEdit控件 * @version v1.0 * @author soui * @date 2014-07-13 * * Describe RichEdit控件 */ #pragma once #include #include #include "core/SPanel.h" #include "core/SSingleton2.h" namespace SOUI { enum{ MENU_CUT = 1, MENU_COPY, MENU_PASTE, MENU_DEL, MENU_SELALL, //--------------- MENU_USER =20, }; class SRichEdit; /** * @class STextServiceHelper * @brief * * Describe */ class SOUI_EXP STextServiceHelper: public SSingleton2 { SINGLETON2_TYPE(SINGLETON_TEXTSERVICEHELPER) public: /** * STextServiceHelper::CreateTextServices * @brief * @param IUnknown *punkOuter * @param ITextHost *pITextHost * @param IUnknown **ppUnk * @return 返回HRESULT * * Describe */ HRESULT CreateTextServices( IUnknown *punkOuter, ITextHost *pITextHost, IUnknown **ppUnk ); protected: /** * STextServiceHelper::STextServiceHelper * @brief 构造函数 * * Describe 构造函数 */ STextServiceHelper(); /** * STextServiceHelper::~STextServiceHelper * @brief 析构函数 * * Describe 析构函数 */ ~STextServiceHelper(); HINSTANCE m_rich20; /**< richedit module */ PCreateTextServices m_funCreateTextServices; /**< 回调函数 */ }; /** * @class SRicheditMenuDef * @brief * * Describe */ class SOUI_EXP SRicheditMenuDef : public SSingleton2 { SINGLETON2_TYPE(SINGLETON_RICHEDITMENUDEF) public: /** * SRicheditMenuDef::SetMenuXml * @brief 加载xml文件 * * Describe 加载xml文件 */ void SetMenuXml(pugi::xml_node xmlMenu) { m_xmlMenu.reset(); m_xmlMenu.append_copy(xmlMenu); } /** * SRicheditMenuDef::GetMenuXml * @brief 获取xml文件 * * Describe 获取xml文件 */ pugi::xml_node GetMenuXml() { return m_xmlMenu.first_child(); } protected: pugi::xml_document m_xmlMenu; /**< xml文件对象 */ }; /** * @class STextHost * @brief * * Describe */ class SOUI_EXP STextHost : public ITextHost { friend class SRichEdit; public: /** * STextHost::STextHost * @brief 构造函数 * * Describe 构造函数 */ STextHost(void); /** * STextHost::~STextHost * @brief 析构函数 * * Describe 析构函数 */ ~STextHost(void); /** * STextHost::Init * @brief 初始化函数 * @param SRichEdit* pRichEdit -- SRichEdit对象 * * Describe 初始化函数 */ BOOL Init(SRichEdit* pRichEdit); /** * STextHost::GetTextService * @brief * * Describe */ ITextServices * GetTextService() { return pserv; } protected: /** * STextHost::QueryInterface * @brief * @param REFIID riid * @param void **ppvObject * * Describe */ virtual HRESULT _stdcall QueryInterface(REFIID riid, void **ppvObject); /** * STextHost::AddRef * @brief * @brief * @return 返回UNLONG * * Describe */ virtual ULONG _stdcall AddRef(void); /** * STextHost::Release * @brief * @return 返回UNLONG * * Describe */ virtual ULONG _stdcall Release(void); /** * STextHost::TxGetDC * @brief Get the DC for the host * @return 返回HDC * * Describe Get the DC for the host */ virtual HDC TxGetDC(); /** * STextHost::TxReleaseDC * @brief Release the DC gotten from the host * @return 返回INT * * Describe Release the DC gotten from the host */ virtual INT TxReleaseDC(HDC hdc); /** * STextHost::TxShowScrollBar * @brief Show the scroll bar * @param INT fnBar -- * @param BOOL fShow -- * @return 返回BOOL * * Describe Show the scroll bar */ virtual BOOL TxShowScrollBar(INT fnBar, BOOL fShow); /** * STextHost::TxEnableScrollBar * @brief Enable the scroll bar * @param INT fuSBFlags -- * @param INT fuArrowflags -- * @return 返回BOOL * * Describe Enable the scroll bar */ virtual BOOL TxEnableScrollBar (INT fuSBFlags, INT fuArrowflags); /** * STextHost::TxEnableScrollBar * @brief Set the scroll range * @param INT fnBar -- * @param LONG nMinPos -- * @param INT nMaxPos -- * @param BOOL fRedraw -- * @return 返回BOOL * * Describe Set the scroll range */ virtual BOOL TxSetScrollRange( INT fnBar, LONG nMinPos, INT nMaxPos, BOOL fRedraw); /** * STextHost::TxSetScrollPos * @brief Set the scroll position * @param INT fnBar -- * @param INT nPos -- * @param BOOL fRedraw -- * @return 返回BOOL * * Describe Set the scroll position */ virtual BOOL TxSetScrollPos (INT fnBar, INT nPos, BOOL fRedraw); /** * STextHost::TxInvalidateRect * @brief InvalidateRect * @param LPCRECT prc -- * @param BOOL fMode -- * * Describe Set the scroll position */ virtual void TxInvalidateRect(LPCRECT prc, BOOL fMode); /** * STextHost::TxViewChange * @brief Send a WM_PAINT to the window * @param BOOL fUpdate -- * * Describe Send a WM_PAINT to the window */ virtual void TxViewChange(BOOL fUpdate); /** * STextHost::TxCreateCaret * @brief Create the caret * @param HBITMAP hbmp -- caret bitmap * @param INT xWidth -- caret width * @param INT yHeight -- caret height * @return 返回BOOL * * Describe Create the caret */ virtual BOOL TxCreateCaret(HBITMAP hbmp, INT xWidth, INT yHeight); /** * STextHost::TxShowCaret * @brief Show the caret * @param BOOL fShow -- true to show the caret * @return 返回BOOL * * Describe Show the caret */ virtual BOOL TxShowCaret(BOOL fShow); /** * STextHost::TxSetCaretPos * @brief Set the caret position * @param INT x -- caret position:x * @param INT y -- caret position:y * @return 返回BOOL * * Describe Set the caret position */ virtual BOOL TxSetCaretPos(INT x, INT y); /** * STextHost::TxSetTimer * @brief Create a timer with the specified timeout * @param UINT idTimer -- timer ID * @param UINT uTimeout -- time interval * @return 返回BOOL * * Describe Create a timer with the specified timeout */ virtual BOOL TxSetTimer(UINT idTimer, UINT uTimeout); /** * STextHost::TxSetTimer * @brief Destroy a timer * @param UINT idTimer -- timer id * @return 返回BOOL * * Describe Destroy a timer */ virtual void TxKillTimer(UINT idTimer); /** * STextHost::TxScrollWindowEx * @brief Scroll the content of the specified window's client area * @param INT dx -- * @param INT dy -- * @param LPCRECT lprcScroll -- * @param LPCRECT lprcClip -- * @param HRGN hrgnUpdate -- * @param LPRECT lprcUpdate -- * @param UINT fuScroll -- * * Describe Scroll the content of the specified window's client area */ virtual void TxScrollWindowEx ( INT dx, INT dy, LPCRECT lprcScroll, LPCRECT lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate, UINT fuScroll); /** * STextHost::TxSetCapture * @brief Get mouse capture * @param BOOL fCapture -- * * Describe Get mouse capture */ virtual void TxSetCapture(BOOL fCapture); /** * STextHost::TxSetFocus * @brief Set the focus to the text window * * Describe Set the focus to the text window */ virtual void TxSetFocus(); /** * STextHost::TxSetCursor * @brief Establish a new cursor shape * @param HCURSOR hcur -- * @param BOOL fText -- * * Describe Establish a new cursor shape */ virtual void TxSetCursor(HCURSOR hcur, BOOL fText); /** * STextHost::TxScreenToClient * @brief Converts screen coordinates of a specified point to the client coordinates * @param LPPOINT lppt -- * @return 返回BOOL * * Describe Converts screen coordinates of a specified point to the client coordinates */ virtual BOOL TxScreenToClient (LPPOINT lppt); /** * STextHost::TxClientToScreen * @brief Converts the client coordinates of a specified point to screen coordinates * @param LPPOINT lppt -- * @return 返回BOOL * * Describe Converts the client coordinates of a specified point to screen coordinates */ virtual BOOL TxClientToScreen (LPPOINT lppt); /** * STextHost::TxActivate * @brief Request host to activate text services * @param LONG * plOldState -- * @return 返回HRESULT * * Describe Request host to activate text services */ virtual HRESULT TxActivate( LONG * plOldState ); /** * STextHost::TxDeactivate * @brief Request host to deactivate text services * @param LONG lNewState -- * @return 返回HRESULT * * Describe Request host to deactivate text services */ virtual HRESULT TxDeactivate( LONG lNewState ); /** * STextHost::TxGetClientRect * @brief Retrieves the coordinates of a window's client area * @param LPRECT prc -- * @return 返回HRESULT * * Describe Retrieves the coordinates of a window's client area */ virtual HRESULT TxGetClientRect(LPRECT prc); /** * STextHost::TxGetViewInset * @brief Get the view rectangle relative to the inset * @param LPRECT prc -- * @return 返回HRESULT * * Describe Get the view rectangle relative to the inset */ virtual HRESULT TxGetViewInset(LPRECT prc); /** * STextHost::TxGetCharFormat * @brief Get the default character format for the text * @param const CHARFORMATW **ppCF -- * @return 返回HRESULT * * Describe Get the default character format for the text */ virtual HRESULT TxGetCharFormat(const CHARFORMATW **ppCF ); /** * STextHost::TxGetParaFormat * @brief Get the default paragraph format for the text * @param const PARAFORMAT **ppPF -- * @return 返回HRESULT * * Describe Get the default character format for the text */ virtual HRESULT TxGetParaFormat(const PARAFORMAT **ppPF); /** * STextHost::TxGetSysColor * @brief Get the background color for the window * @param int nIndex -- * @return 返回COLORREF * * Describe Get the background color for the window */ virtual COLORREF TxGetSysColor(int nIndex); /** * STextHost::TxGetBackStyle * @brief Get the background (either opaque or transparent) * @param TXTBACKSTYLE *pstyle -- * @return 返回HRESULT * * Describe Get the background (either opaque or transparent) */ virtual HRESULT TxGetBackStyle(TXTBACKSTYLE *pstyle); /** * STextHost::TxGetMaxLength * @brief Get the maximum length for the text * @param DWORD *plength -- * @return 返回HRESULT * * Describe Get the maximum length for the text */ virtual HRESULT TxGetMaxLength(DWORD *plength); /** * STextHost::TxGetScrollBars * @brief Get the bits representing requested scroll bars for the window * @param DWORD *pdwScrollBar -- * @return 返回HRESULT * * Describe Get the bits representing requested scroll bars for the window */ virtual HRESULT TxGetScrollBars(DWORD *pdwScrollBar); /** * STextHost::TxGetPasswordChar * @brief Get the character to display for password input * @param TCHAR *pch -- * @return 返回HRESULT * * Describe Get the character to display for password input */ virtual HRESULT TxGetPasswordChar(TCHAR *pch); /** * STextHost::TxGetAcceleratorPos * @brief Get the accelerator character * @param LONG *pcp -- * @return 返回HRESULT * * Describe Get the accelerator character */ virtual HRESULT TxGetAcceleratorPos(LONG *pcp); /** * STextHost::TxGetExtent * @brief Get the native size * @param LPSIZEL lpExtent -- * @return 返回HRESULT * * Describe Get the native size */ virtual HRESULT TxGetExtent(LPSIZEL lpExtent); /** * STextHost::OnTxCharFormatChange * @brief Notify host that default character format has changed * @param const CHARFORMATW * pcf -- * @return 返回HRESULT * * Describe Notify host that default character format has changed */ virtual HRESULT OnTxCharFormatChange(const CHARFORMATW * pcf); /** * STextHost::OnTxParaFormatChange * @brief Notify host that default paragraph format has changed * @param const PARAFORMAT * ppf -- * @return 返回HRESULT * * Describe Notify host that default paragraph format has changed */ virtual HRESULT OnTxParaFormatChange (const PARAFORMAT * ppf); /** * STextHost::TxGetPropertyBits * @brief Bulk access to bit properties * @param DWORD dwMask -- * @param DWORD *pdwBits -- * @return 返回HRESULT * * Describe Bulk access to bit properties */ virtual HRESULT TxGetPropertyBits(DWORD dwMask, DWORD *pdwBits); /** * STextHost::TxNotify * @brief Notify host of events * @param DWORD iNotify -- * @param void *pv -- * @return 返回HRESULT * * Describe Bulk access to bit properties */ virtual HRESULT TxNotify(DWORD iNotify, void *pv); // Far East Methods for getting the Input Context //#ifdef WIN95_IME /** * STextHost::TxImmGetContext * @brief * @return 返回HIMC * * Describe */ virtual HIMC TxImmGetContext(); /** * STextHost::TxImmReleaseContext * @brief * @param HIMC himc -- * * Describe */ virtual void TxImmReleaseContext( HIMC himc ); //#endif /** * STextHost::TxGetSelectionBarWidth * @brief Returns HIMETRIC size of the control bar * @param LONG *plSelBarWidth -- * * Describe Returns HIMETRIC size of the control bar */ virtual HRESULT TxGetSelectionBarWidth (LONG *plSelBarWidth); protected: BOOL m_fUiActive; /**< Whether control is inplace active */ ULONG cRefs; /**< Reference Count */ ITextServices *pserv; /**< pointer to Text Services object */ SRichEdit *m_pRichEdit; /**< swindow for text host */ POINT m_ptCaret; }; /** * @class SRichEdit * @brief 使用Windowless Richedit实现的edit控件 * * Describe SRichEdit */ class SOUI_EXP SRichEdit :public SPanel { friend class STextHost; public: SOUI_CLASS_NAME(SRichEdit, L"richedit") /** * SRichEdit::SRichEdit * @brief 构造函数 * * Describe 构造函数 */ SRichEdit(); /** * SRichEdit::~SRichEdit * @brief 析构函数 * * Describe 析构函数 */ virtual ~SRichEdit() {} DWORD SaveRtf(LPCTSTR pszFileName); DWORD LoadRtf(LPCTSTR pszFileName); public://richedit interface /** * SRichEdit::GetWindowText * @brief 获取窗口标题 * @return 返回SStringT * * Describe 获取窗口标题 */ SStringT GetWindowText(BOOL bRawText=FALSE); /** * SRichEdit::GetWindowTextLength * @brief 获取窗口标题长度 * @return 返回int * * Describe 获取窗口标题长度 */ int GetWindowTextLength(); /** * SRichEdit::SetWindowText * @brief 设置窗口标题 * @param LPCWSTR lpszText -- 窗口标题 * * Describe 设置窗口标题 */ void SetWindowText(LPCTSTR lpszText); /** * SRichEdit::SetSel * @brief 设置选中 * @param DWORD dwSelection -- * @param BOOL bNoScroll -- * * Describe 设置选中 */ void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE); /** * SRichEdit::SetSel * @brief 设置选中 * @param long nStartChar -- * @param long nEndChar -- * @param BOOL bNoScroll -- * * Describe 设置选中, 支持超长文本 */ void SetSel(long nStartChar, long nEndChar, BOOL bNoScroll); /** * SRichEdit::ReplaceSel * @brief 替换选中项 * @param LPCWSTR pszText -- * @param BOOL bCanUndo -- * * Describe 替换选中项 */ void ReplaceSel(LPCWSTR pszText,BOOL bCanUndo=TRUE); /** * SRichEdit::GetWordWrap * @brief * @return 返回BOOL * * Describe */ BOOL GetWordWrap(void); /** * SRichEdit::SetWordWrap * @brief * @param BOOL fWordWrap -- * * Describe */ void SetWordWrap(BOOL fWordWrap); /** * SRichEdit::GetReadOnly * @brief 判断是否只读 * @return 返回BOOL * * Describe 判断是否只读 */ BOOL GetReadOnly(); /** * SRichEdit::SetReadOnly * @brief 设置只读 * @param BOOL bReadOnly -- 是否只读 * @return 返回BOOL * * Describe 设置只读 */ BOOL SetReadOnly(BOOL bReadOnly); /** * SRichEdit::GetLimitText * @brief 获取最小文本长度 * @return 返回BOOL * * Describe 获取最小文本长度 */ LONG GetLimitText(); /** * SRichEdit::SetLimitText * @brief 设置最小文本长度 * @param int nLength -- 长度 * @return 返回BOOL * * Describe 设置最小文本长度 */ BOOL SetLimitText(int nLength); /** * SRichEdit::GetDefaultAlign * @brief 获取对齐方式 * @return 返回WORD * * Describe 设置最小文本长度 */ WORD GetDefaultAlign(); /** * SRichEdit::SetDefaultAlign * @brief 设置默认对齐方式 * @param WORD wNewAlign -- 对齐方式 * * Describe 设置默认对齐方式 */ void SetDefaultAlign(WORD wNewAlign); /** * SRichEdit::GetRichTextFlag * @brief 获取标志 * @return 返回BOOL * * Describe 获取标志 */ BOOL GetRichTextFlag(); /** * SRichEdit::SetRichTextFlag * @brief 设置标志 * @param BOOL fRich -- 标志 * * Describe 设置标志 */ void SetRichTextFlag(BOOL fRich); /** * SRichEdit::SetRichTextFlag * @brief 设置标志 * @param BOOL fRich -- 标志 * @return 返回LONG * * Describe 设置标志 */ LONG GetDefaultLeftIndent(); /** * SRichEdit::SetDefaultLeftIndent * @brief 设置缩进 * @param LONG lNewIndent -- 缩进字符数 * * Describe 设置缩进 */ void SetDefaultLeftIndent(LONG lNewIndent); /** * SRichEdit::SetSaveSelection * @brief * @param BOOL fSaveSelection * @return 返回BOOL * * Describe */ BOOL SetSaveSelection(BOOL fSaveSelection); /** * SRichEdit::SetDefaultTextColor * @brief 默认文本颜色 * @param COLORREF cr -- 颜色 * @return 返回COLORREF * * Describe 设置默认文本颜色 */ COLORREF SetDefaultTextColor(COLORREF cr); protected: /** * SRichEdit::OnCreate * @brief 创建 * @return LRESULT * * Describe 此函数是消息响应函数 */ int OnCreate(LPVOID); /** * SRichEdit::OnDestroy * @brief 销毁窗口 * * Describe 消息响应函数 */ void OnDestroy(); /** * SRichEdit::OnPaint * @brief 绘制消息 * @param IRenderTarget * pRT -- 绘画设备上下文 * * Describe 此函数是消息响应函数 */ void OnPaint(IRenderTarget * pRT); /** * SRichEdit::OnSetFocus * @brief 获得焦点 * * Describe 此函数是消息响应函数 */ void OnSetFocus(SWND wndOld); /** * SRichEdit::OnKillFocus * @brief 失去焦点 * * Describe 此函数是消息响应函数 */ void OnKillFocus(SWND wndFocus); /** * SRichEdit::OnTimer * @brief 定时器 * @param char idEvent idEvent * * Describe 定时器 */ void OnTimer(char idEvent); /** * SRichEdit::OnTimer2 * @brief 定时器 * @param UINT_PTR idEvent * * Describe 定时器 */ void OnTimer2(UINT_PTR idEvent); /** * SRichEdit::OnGetDlgCode * @brief 获取窗口消息码 * @return 返回UINT * * Describe 获取窗口消息码 */ virtual UINT OnGetDlgCode(); /** * SRichEdit::OnScroll * @brief 滚动条事件 * @param BOOL bVertical -- 是否垂直滚动 * @param UINT uCode -- 消息码 * @param int nPos -- 位置 * @return 返回BOOL * * Describe 滚动条事件 */ virtual BOOL OnScroll(BOOL bVertical,UINT uCode,int nPos); /** * SRichEdit::OnSetCursor * @brief 设置鼠标位置 * @param const CPoint &pt -- 坐标 * @return 返回BOOL * * Describe 设置鼠标位置 */ virtual BOOL OnSetCursor(const CPoint &pt); /** * SRichEdit::SwndProc * @brief 窗口处理函数 * @param UINT uMsg -- 消息码 * @param WPARAM wParam -- * @param LPARAM lParam -- * @param LRESULT &lResult -- * @return 返回BOOL * * Describe 窗口处理函数 */ virtual BOOL SwndProc(UINT uMsg,WPARAM wParam,LPARAM lParam,LRESULT & lResult); virtual void OnScaleChanged(int nScale); virtual void OnRebuildFont(); virtual BOOL CreateCaret(HBITMAP pBmp,int nWid,int nHeight); void OnEnable(BOOL bEnable, UINT nStatus); /** * SRichEdit::InitDefaultCharFormat * @brief * @param CHARFORMAT2W* pcf -- * @param IFont *pFont -- * @return 返回HRESULT * * Describe */ HRESULT InitDefaultCharFormat(CHARFORMAT2W* pcf,IFont *pFont=NULL); /** * SRichEdit::InitDefaultParaFormat * @brief * @param PARAFORMAT2* ppf * @return 返回HRESULT * * Describe */ HRESULT InitDefaultParaFormat(PARAFORMAT2* ppf); /** * SRichEdit::OnTxNotify * @brief * @param DWORD iNotify -- * @param LPVOID pv -- * @return 返回HRESULT * * Describe */ virtual HRESULT OnTxNotify(DWORD iNotify,LPVOID pv); /** * SRichEdit::OnLButtonDown * @brief 左键按下事件 * @param UINT nFlags -- 标志 * @param CPoint point -- 鼠标坐标 * * Describe 此函数是消息响应函数 */ void OnLButtonDown(UINT nFlags, CPoint point); void OnLButtonUp(UINT nFlags, CPoint point); /** * SRichEdit::OnRButtonDown * @brief 右键按下事件 * @param UINT nFlags -- 标志 * @param CPoint point -- 鼠标坐标 * * Describe 此函数是消息响应函数 */ void OnRButtonDown(UINT nFlags, CPoint point); /** * SRichEdit::OnMouseMove * @brief 鼠标移动 * @param UINT nFlags -- 标志 * @param CPoint point -- 鼠标坐标 * * Describe 此函数是消息响应函数 */ void OnMouseMove(UINT nFlags, CPoint point); BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); /** * SRichEdit::OnKeyDown * @brief 键盘按下事件 * @param UINT nChar -- 按键对应的码值 * @param UINT nRepCnt -- 重复次数 * @param UINT nFlags -- 标志 * * Describe 此函数是消息响应函数 */ void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); /** * SRichEdit::OnButtonClick * @brief 通用鼠标事件 * @param UINT uMsg -- msg * @param WPARAM wParam -- wParam * @param LPARAM lParam -- lParam * @return 返回LRESULT * * Describe 此函数是消息响应函数 */ LRESULT OnButtonClick(UINT uMsg,WPARAM wParam,LPARAM lParam); /** * SRichEdit::OnChar * @brief 字符事件 * @param UINT nChar -- 按键对应的码值 * @param UINT nRepCnt -- 重复次数 * @param UINT nFlags -- 标志 * * Describe 此函数是消息响应函数 */ void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); /** * SRichEdit::OnSetFont * @brief 设置字体 * @param IFont * font -- 字体 * @param BOOL bRedraw -- 是否重绘 * * Describe 设置字体 */ void OnSetFont(IFont * font, BOOL bRedraw); /** * SRichEdit::OnSetText * @brief 设置文本 * @param UINT uMsg -- 消息码 * @param WPARAM wparam -- * @param LPARAM lparam -- * @return 返回LRESULT * * Describe 设置文本 */ LRESULT OnSetText(UINT uMsg,WPARAM wparam,LPARAM lparam); /** * SRichEdit::OnSetCharFormat * @brief * @param UINT uMsg -- 消息码 * @param WPARAM wparam -- * @param LPARAM lparam -- * @return 返回LRESULT * * Describe */ LRESULT OnSetCharFormat(UINT uMsg, WPARAM wParam, LPARAM lParam); /** * SRichEdit::OnSetParaFormat * @brief * @param UINT uMsg -- 消息码 * @param WPARAM wparam -- * @param LPARAM lparam -- * @return 返回LRESULT * * Describe */ LRESULT OnSetParaFormat(UINT uMsg, WPARAM wParam, LPARAM lParam); /** * SRichEdit::OnSetReadOnly * @brief 设置只读 * @param UINT uMsg -- 消息码 * @param WPARAM wparam -- * @param LPARAM lparam -- * @return 返回LRESULT * * Describe 设置只读 */ LRESULT OnSetReadOnly(UINT uMsg, WPARAM wParam, LPARAM lParam); /** * SRichEdit::OnSetLimitText * @brief 设置文本长度 * @param UINT uMsg -- 消息码 * @param WPARAM wparam -- * @param LPARAM lparam -- * @return 返回LRESULT * * Describe 设置文本长度 */ LRESULT OnSetLimitText(UINT uMsg, WPARAM wParam, LPARAM lParam); /** * SRichEdit::OnNcCalcSize * @brief 计算非客户大小 * @param BOOL bCalcValidRects -- * @param LPARAM lparam -- * @return 返回LRESULT * * Describe 消息响应函数 */ LRESULT OnNcCalcSize(BOOL bCalcValidRects, LPARAM lParam); /** * SRichEdit::OnEnableDragDrop * @brief 是否允许拖拽 * @param BOOL bEnable * * Describe 是否允许拖拽 */ void OnEnableDragDrop(BOOL bEnable); virtual pugi::xml_node GetMenuTemplate() const { return SRicheditMenuDef::getSingleton().GetMenuXml(); } LRESULT OnGetRect(UINT uMsg,WPARAM wp, LPARAM lp); BOOL OnTxSetScrollPos(INT fnBar, INT nPos, BOOL fRedraw); protected: SOUI_MSG_MAP_BEGIN() MSG_WM_CREATE(OnCreate) MSG_WM_DESTROY(OnDestroy) MSG_WM_PAINT_EX(OnPaint) MSG_WM_NCCALCSIZE(OnNcCalcSize) MSG_WM_SETFOCUS_EX(OnSetFocus) MSG_WM_KILLFOCUS_EX(OnKillFocus) MSG_WM_TIMER_EX(OnTimer) MSG_WM_TIMER2(OnTimer2) MSG_WM_LBUTTONDOWN(OnLButtonDown) MSG_WM_LBUTTONUP(OnLButtonUp) MSG_WM_RBUTTONDOWN(OnRButtonDown) MSG_WM_MOUSEMOVE(OnMouseMove) MSG_WM_MOUSEWHEEL(OnMouseWheel) MSG_WM_KEYDOWN(OnKeyDown) MSG_WM_CHAR(OnChar) MSG_WM_SETFONT_EX(OnSetFont) MESSAGE_HANDLER_EX(WM_LBUTTONDBLCLK,OnButtonClick) MESSAGE_HANDLER_EX(WM_SETTEXT,OnSetText) MESSAGE_HANDLER_EX(EM_SETPARAFORMAT,OnSetParaFormat) MESSAGE_HANDLER_EX(EM_SETCHARFORMAT,OnSetCharFormat) MESSAGE_HANDLER_EX(EM_SETREADONLY,OnSetReadOnly) MESSAGE_HANDLER_EX(EM_EXLIMITTEXT,OnSetLimitText) MESSAGE_HANDLER_EX(EM_GETRECT,OnGetRect) SOUI_MSG_MAP_END() protected: #define ATTR_RE_STYLE(attr,style,txtBit, func) \ if (0 == strAttribName.CompareNoCase(attr)) \ { \ hRet = func(strValue,style,txtBit,bLoading); \ } \ else \ /** * SRichEdit::OnAttrTextColor * @brief 设置文本颜色 * @param const SStringW & strValue -- 字符串 * @param BOOL bLoading -- 是否加载 * @return 返回HRESULT * * Describe 设置文本颜色 */ HRESULT OnAttrTextColor(const SStringW & strValue,BOOL bLoading); HRESULT OnAttrRTF(const SStringW & strValue,BOOL bLoading); HRESULT OnAttrAlign(const SStringW & strValue,BOOL bLoading); HRESULT OnAttrNotifyChange(const SStringW & strValue,BOOL bLoading); HRESULT OnAttrPasswordChar(const SStringW & strValue,BOOL bLoading); HRESULT OnAttrEnableDragdrop(const SStringW & strValue,BOOL bLoading); HRESULT OnAttrReStyle(const SStringW &strValue,DWORD dwStyle,DWORD txtBit,BOOL bLoading); HRESULT OnAttrReStyle2(const SStringW &strValue,DWORD dwStyle,DWORD txtBit,BOOL bLoading); public: SOUI_ATTRS_BEGIN() ATTR_INT(L"style",m_dwStyle,FALSE) ATTR_INT(L"maxBuf",m_cchTextMost,FALSE) ATTR_INT(L"transparent",m_fTransparent,FALSE) ATTR_INT(L"rich",m_fRich,FALSE) ATTR_INT(L"vertical",m_fVertical,FALSE) ATTR_INT(L"wordWrap",m_fWordWrap,FALSE) ATTR_INT(L"allowBeep",m_fAllowBeep,FALSE) ATTR_INT(L"autoWordSel",m_fEnableAutoWordSel,FALSE) ATTR_INT(L"vcenter",m_fSingleLineVCenter,FALSE) ATTR_INT(L"disableCaret",m_fDisableCaret,FALSE) ATTR_BOOL(L"wantTab",m_fWantTab,FALSE) ATTR_BOOL(L"autoSel",m_fAutoSel,FALSE) ATTR_CUSTOM(L"colorText",OnAttrTextColor) ATTR_CUSTOM(L"rtf",OnAttrRTF) ATTR_CUSTOM(L"align",OnAttrAlign) ATTR_CUSTOM(L"notifyChange",OnAttrNotifyChange) ATTR_RE_STYLE(L"wantReturn",ES_WANTRETURN,0,OnAttrReStyle) ATTR_RE_STYLE(L"number",ES_NUMBER,0,OnAttrReStyle) ATTR_RE_STYLE(L"upperCase",ES_UPPERCASE,0,OnAttrReStyle) ATTR_RE_STYLE(L"lowerCase",ES_LOWERCASE,0,OnAttrReStyle) ATTR_RE_STYLE(L"password",ES_PASSWORD,TXTBIT_USEPASSWORD, OnAttrReStyle) ATTR_RE_STYLE(L"readOnly",ES_READONLY,TXTBIT_READONLY,OnAttrReStyle) ATTR_RE_STYLE(L"multiLines",ES_MULTILINE,TXTBIT_MULTILINE,OnAttrReStyle) ATTR_RE_STYLE(L"autoHscroll",ES_AUTOHSCROLL,TXTBIT_SCROLLBARCHANGE,OnAttrReStyle2) ATTR_RE_STYLE(L"autoVscroll",ES_AUTOVSCROLL,TXTBIT_SCROLLBARCHANGE,OnAttrReStyle2) ATTR_RE_STYLE(L"hscrollBar",WS_HSCROLL,TXTBIT_SCROLLBARCHANGE,OnAttrReStyle2) ATTR_RE_STYLE(L"vscrollBar",WS_VSCROLL,TXTBIT_SCROLLBARCHANGE,OnAttrReStyle2) ATTR_CUSTOM(L"passwordChar",OnAttrPasswordChar) ATTR_CUSTOM(L"enableDragdrop",OnAttrEnableDragdrop) SOUI_ATTRS_END() protected: CHARFORMAT2W m_cfDef; /**< Default character format */ PARAFORMAT2 m_pfDef; /**< Default paragraph format */ DWORD m_cchTextMost; /**< Maximize Characters */ TCHAR m_chPasswordChar; /**< Password character */ LONG m_lAccelPos; /**< Accelerator position */ SIZEL m_sizelExtent; /**< Extent array */ CRect m_rcInset; /**< inset margin */ int m_nFontHeight; /**< 单行文字输出高度 */ DWORD m_dwStyle; UINT m_fEnableAutoWordSel :1; /**< enable Word style auto word selection? */ UINT m_fWordWrap :1; /**< Whether control should word wrap */ UINT m_fRich :1; /**< Whether control is rich text */ UINT m_fSaveSelection :1; /**< Whether to save the selection when inactive */ UINT m_fTransparent :1; /**< Whether control is transparent */ UINT m_fVertical :1; /**< Whether control is layout following vertical */ UINT m_fAllowBeep :1; /**< Whether message beep is allowed in the control */ UINT m_fWantTab :1; /**< Whether control will deal with tab input */ UINT m_fSingleLineVCenter:1; /**< Whether control that is single line will be vertical centered */ UINT m_fScrollPending :1; /**< Whether scroll is activated by richedit or by panelex */ UINT m_fEnableDragDrop :1; /**< 允许在该控件中使用拖放 */ UINT m_fAutoSel :1; /**< 有焦点时自动全选 */ UINT m_fNotifyChange :1; /**< receive re_notify when data changed */ UINT m_fDisableCaret :1; /**< disable caret flag */ BYTE m_byDbcsLeadByte; /**< DBCS输入时的中文头字节*/ SStringW m_strRtfSrc; /**< 在XML中指定的RTF数据源*/ STextHost *m_pTxtHost; /**< Host of Richedit*/ }; /** * @class SEdit * @brief 简单edit控件 * * Describe */ class SOUI_EXP SEdit : public SRichEdit { SOUI_CLASS_NAME(SEdit, L"edit") public: /** * SEdit::SEdit * @brief 构造函数 * * Describe 构造函数 */ SEdit(); SStringT GetCueText(BOOL bRawText=FALSE) const; SOUI_ATTRS_BEGIN() ATTR_COLOR(L"cueColor",m_crCue,TRUE) ATTR_I18NSTRT(L"cueText",m_strCue,TRUE) SOUI_ATTRS_END() protected: virtual HRESULT OnLanguageChanged(); /** * SEdit::OnPaint * @brief 绘制消息 * @param IRenderTarget * pRT -- 绘画设备上下文 * * Describe 此函数是消息响应函数 */ void OnPaint(IRenderTarget * pRT); /** * SEdit::OnSetFocus * @brief 获得焦点 * * Describe 此函数是消息响应函数 */ void OnSetFocus(SWND wndOld); UINT GetCueTextAlign(); /** * SEdit::OnKillFocus * @brief 失去焦点 * * Describe 此函数是消息响应函数 */ void OnKillFocus(SWND wndFocus); SOUI_MSG_MAP_BEGIN() MSG_WM_PAINT_EX(OnPaint) MSG_WM_SETFOCUS_EX(OnSetFocus) MSG_WM_KILLFOCUS_EX(OnKillFocus) SOUI_MSG_MAP_END() COLORREF m_crCue; STrText m_strCue; }; }//namespace SOUI