#ifndef UI_CONTROL_RICHEDIT_H_ #define UI_CONTROL_RICHEDIT_H_ #pragma once #include #include #include #include namespace ui { class CTxtWinHost; class UILIB_API RichEdit : public ScrollableBox { public: friend class CTxtWinHost; typedef std::function FunGetNaturalSize; public: RichEdit(); RichEdit(const RichEdit& r) = delete; RichEdit& operator=(const RichEdit& r) = delete; ~RichEdit(); /** * @brief 判断是否接受 TAB 按键消息 * @return 返回 true 表示接受,false 表示不接受 */ bool IsWantTab(); /** * @brief 判断是否接受 TAB 按键消息 * @param[in] bWantTab 为 true 则接受该消息,false 为不接受 * @return 无 */ void SetWantTab(bool bWantTab = true); /** * @brief 判断是否接受 RETURN 按键消息 * @return 返回 true 表示接受,false 表示不接受 */ bool IsNeedReturnMsg(); /** * @brief 设置是否接受 RETURN 按键消息 * @param[in] bNeedReturnMsg 为 true 则接受该消息,false 为不接受 * @return 无 */ void SetNeedReturnMsg(bool bNeedReturnMsg = true); /** * @brief 判断是否接受CTRL+RETURN 组合键消息 * @return 返回 true 表示接受,false 表示不接受 */ bool IsReturnMsgWantCtrl(); /** * @brief 设置是否接受CTRL+RETUREN 组合键消息 * @param[in] bReturnMsgWantCtrl 为 true 则接受该消息,false 为不接受 * @return 无 */ void SetReturnMsgWantCtrl(bool bReturnMsgWantCtrl = true); /** * @brief 是否是富文本状态 * @return 返回 true 为是,否则为 false */ bool IsRich(); /** * @brief 设置控件为富文本编辑状态 * @param[in] bRich 设置 true 为富文本状态,false 为普通状态 * @return 无 */ void SetRich(bool bRich = true); /** * @brief 是否是只读状态 * @return 返回 true 为只读状态,否则为 false */ bool IsReadOnly(); /** * @brief 设置控件为只读状态 * @param[in] bReadOnly 设置 true 让控件变为只读状态,false 为可写入状态 * @return 无 */ void SetReadOnly(bool bReadOnly = true); /** * @brief 是否是密码状态控件 * @return 返回 true 表示是密码控件,否则为 false */ bool IsPassword(); /** * @brief 设置控件为密码控件(显示 ***) * @param[in] bPassword 设置为 true 让控件显示内容为 ***,false 为显示正常内容 * @return 无 */ void SetPassword(bool bPassword); /** * @brief 获取超出矩形区域的文本显示方式 * @return 返回 true 时并且在多行模式下内容被换行显示,false 则表示截断显示 */ bool GetWordWrap(); /** * @brief 设置超出矩形区域的文本显示方式 * @param[in] bWordWrap 为 true 时并且在多行模式下内容被换行显示,false 则表示截断显示 * @return 无 */ void SetWordWrap(bool bWordWrap = true); /** * @brief 获取当前设置的字体索引 * @return 返回字体索引(对应 global.xml 中字体的顺序) */ std::wstring GetFont() const; /** * @brief 设置字体索引 * @param[in] index 要设置的字体索引(对应 global.xml 中字体的顺序) * @return 无 */ void SetFont(const std::wstring& strFontId); void SetFont(HFONT font); /** * @brief 根据字体名称设置字体 * @param[in] pStrFontName 字体名称 * @param[in] nSize 字体大小 * @param[in] bBold 是否粗体显示 * @param[in] bUnderline 是否带有下划线 * @param[in] bItalic 是否斜体显示 * @return 无 */ void SetFont(const std::wstring& pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic); /** * @brief 获取窗口样式 * @return 返回窗口样式 */ LONG GetWinStyle(); /** * @brief 设置窗口样式 * @param[in] lStyle 要设置的窗口样式 * @return 无 */ void SetWinStyle(LONG lStyle); /** * @brief 获取内容垂直对其方式 * @return 返回内容垂直对其方式(顶端对齐、居中、底端对齐) */ VerAlignType GetTextVerAlignType(); /** * @brief 设置文本颜色 * @param[in] dwTextColor 要设置的文本颜色,该颜色必须在 global.xml 中存在 * @return 无 */ virtual void SetTextColor(const std::wstring& dwTextColor); void SetTextColor(DWORD color); /** * @brief 获取文本颜色 * @return 返回当前文本颜色 */ std::wstring GetTextColor(); /** * @brief 获取限制字符数量 * @return 返回限制字符数量 */ int GetLimitText(); /** * @brief 设置限制字符数量 * @param[in] iChars 要限制的字符数量 * @return 无 */ void SetLimitText(int iChars); /** * @brief 获取内容的长度 * @param[in] dwFlags 指定用以确定文本长度的方式,参考 https://docs.microsoft.com/en-us/windows/desktop/controls/em-gettextlengthex * @return 返回内容长度 */ long GetTextLength(DWORD dwFlags = GTL_DEFAULT) const; /** * @brief 获取控件中的文本 * @return 返回控件中的文本内容 */ std::wstring GetText() const; /** * @brief 获取控件中的文本 * @return 返回控件中的文本内容 UTF8 格式 */ virtual std::string GetUTF8Text() const; /** * @brief 设置控件的文本 * @param[in] strText 要设置的文本内容 * @return 无 */ void SetText(const std::wstring& strText); /** * @brief 设置控件的文本对应 ID * @param[in] strTextId 要设置的 ID,该 ID 必须在加载的语言文件中存在 * @return 无 */ void SetTextId(const std::wstring& strTextId); /** * @brief 设置控件的文本对应 ID * @param[in] strTextId 要设置的 UTF8 格式 ID,该 ID 必须在加载的语言文件中存在 * @return 无 */ virtual void SetUTF8Text(const std::string& strText); /** * @brief 获取修改标志 * @return 返回 true 为设置了修改标志,否则为 false */ bool GetModify() const; /** * @brief 设置修改标志 * @param[in] bModified 设置为 true 表示文本已经被修改,false 为未修改,默认为 true * @return 无 */ void SetModify(bool bModified = true) const; /** * @brief 获取所选文本的起始位置和结束位置 * @param[out] cr 返回起始位置和结束位置 * @return 无 */ void GetSel(CHARRANGE &cr) const; /** * @brief 获取所选文本的起始位置和结束位置 * @param[in] nStartChar 返回起始位置 * @param[in] nEndChar 返回结束位置 * @return 无 */ void GetSel(long& nStartChar, long& nEndChar) const; /** * @brief 选择一部分内容 * @param[in] cr 要选择的文字起始位置和结束位置 * @return 返回选择的文字数量 */ int SetSel(CHARRANGE &cr); /** * @brief 选择一部分内容 * @param[in] nStartChar 要选择的起始位置 * @param[in] nEndChar 要选择的结束位置 * @return 返回选择的文字数量 */ int SetSel(long nStartChar, long nEndChar); /** * @brief 替换所选内容 * @param[in] lpszNewText 要替换的文字 * @param[in] bCanUndo 是否可以撤销,true 为可以,否则为 false * @return 无 */ void ReplaceSel(const std::wstring& lpszNewText, bool bCanUndo); /** * @brief 替换所选内容 * @param[in] lpszNewText 要替换的文字 * @param[in] bCanUndo 是否可以撤销,true 为可以,否则为 false * @return 无 */ void ReplaceSelW(LPCWSTR lpszNewText, bool bCanUndo = false); /** * @brief 获取所选文字内容 * @return 返回所选文字内容 */ std::wstring GetSelText() const; /** * @brief 全选 * @return 返回选择的内容数量 */ int SetSelAll(); /** * @brief 不选择任何内容 * @return 始终返回 0 */ int SetSelNone(); /** * @brief 获取控件的选择类型 * @return 返回控件的选择类型,参考:https://docs.microsoft.com/en-us/windows/desktop/controls/em-selectiontype */ WORD GetSelectionType() const; /** * @brief 获取当前缩放比 * @param[out] nNum 缩放比率分子 * @param[out] nDen 缩放比率分母 * @return 如果处理了消息则返回 TRUE */ bool GetZoom(int& nNum, int& nDen) const; /** * @brief 设置缩放比 * @param[in] nNum 缩放比率分子 * @param[in] nDen 缩放比率分母 * @return 成功返回 true,失败返回 false */ bool SetZoom(int nNum, int nDen); /** * @brief 恢复缩放到初始状态 * @return 成功返回 true,否则返回 false */ bool SetZoomOff(); /** * @brief 获取是否开启了自动 URL 检测 * @return 返回 true 表示开启了自动检测,否则为 false */ bool GetAutoURLDetect() const; /** * @brief 设置是否开启 URL 自动检测 * @param[in] bAutoDetect 设置为 true 表示检测 URL,false 为不检测,默认为 true * @return 返回 true 为设置成功,false 为失败 */ bool SetAutoURLDetect(bool bAutoDetect = true); /** * @brief 获取控件的事件掩码 * @return 返回事件掩码 */ DWORD GetEventMask() const; /** * @brief 设置控件的事件掩码 * @param[in] dwEventMask 要设置的事件掩码值 * @return 返回设置之前的事件掩码值 */ DWORD SetEventMask(DWORD dwEventMask); /** * @brief 获取指定范围的内容 * @param[in] nStartChar 起始位置 * @param[in] nEndChar 结束为止 * @return 返回设置的指定位置的内容 */ std::wstring GetTextRange(long nStartChar, long nEndChar) const; /** * @brief 设置是否隐藏或显示选择的值 * @param[in] bHide 是否显示,true 为显示,false 为不显示 * @param[in] bChangeStyle 是否修改样式,true 为修改,false 为不修改 * @return 无 */ void HideSelection(bool bHide = true, bool bChangeStyle = false); /** * @brief 设置光标到可见位置 * @return 无 */ void ScrollCaret(); /** * @brief 插入文字 * @param[in] nInsertAfterChar 要插入的位置 * @param[in] lpstrText 要插入的文本 * @param[in] bCanUndo 是否可以撤销,true 为可以,否则为 false,默认为 false * @return 返回插入后的文本位置 */ int InsertText(long nInsertAfterChar, LPCTSTR lpstrText, bool bCanUndo = false); /** * @brief 追加文字 * @param[in] strText 要追加的文字 * @param[in] bCanUndo 是否可以撤销,true 为可以,否则为 false,默认为 false * @return 返回追加后的文字位置 */ int AppendText(const std::wstring& strText, bool bCanUndo = false); /** * @brief 获取字符格式 * @param[out] cf 返回获取的字符格式 * @return 返回参数 cf 中 dwMask 的值 */ DWORD GetDefaultCharFormat(CHARFORMAT2 &cf) const; /** * @brief 设置默认的字符格式 * @param[in] cf 要设置字符格式 * @return 返回 true 表示成功,false 为失败 */ bool SetDefaultCharFormat(CHARFORMAT2 &cf); /** * @brief 获取被选择的字符格式 * @param[out] cf 返回获取的字符格式 * @return 返回参数 cf 中 dwMask 的值 */ DWORD GetSelectionCharFormat(CHARFORMAT2 &cf) const; /** * @brief 设置被选择的字符格式 * @param[in] cf 要设置的字符格式 * @return 返回 true 表示成功,false 为失败 */ bool SetSelectionCharFormat(CHARFORMAT2 &cf); /** * @brief 设置当前插入点的单词格式 * @param[in] cf 要设置的单词格式 * @return 成功返回 true,失败返回 false */ bool SetWordCharFormat(CHARFORMAT2 &cf); /** * @brief 获取当前段落格式 * @param[out] pf 返回当前段落格式 * @return 返回 pf 参数的 dwMask 成员 */ DWORD GetParaFormat(PARAFORMAT2 &pf) const; /** * @brief 设置当前段落格式 * @param[in] pf 要设置的段落格式样式 * @return 成功返回 true,否则返回 false */ bool SetParaFormat(PARAFORMAT2 &pf); /** * @brief 恢复操作 * @return 成功返回 true,失败返回 false */ bool Redo(); /** * @brief 撤销操作 * @return 成功返回 true,失败返回 false */ bool Undo(); /** * @brief 清空 * @return 无 */ void Clear(); /** * @brief 复制所选内容 * @return 无 */ void Copy(); /** * @brief 剪切所选内容 * @return 无 */ void Cut(); /** * @brief 粘贴 * @return 无 */ void Paste(); /** * @brief 检测是否可以粘贴指定剪切板格式 * @param[in] nFormat 要检测的格式 * @return 可以返回 true,否则返回 false */ BOOL CanPaste(UINT nFormat = 0); /** * @brief 在控件中粘贴特定的剪贴板格式 * @param[in] uClipFormat 指定剪切板格式 * @param[in] dwAspect 指定展示形式 * @param[in] hMF 如果 dwAspect 为 DVASPECT_ICON,该函数应该包含图标句柄 * @return 无 */ void PasteSpecial(UINT uClipFormat, DWORD dwAspect = 0, HMETAFILE hMF = 0); /** * @brief 获取总行数 * @return 返回总行数 */ int GetLineCount() const; /** * @brief 获取一行数据 * @param[in] nIndex 要获取的行数 * @param[in] nMaxLength 要获取当前行最大的数据长度 * @return 返回获取的一行数据 */ std::wstring GetLine(int nIndex, int nMaxLength) const; /** * @brief 获取指定行的第一个字符索引 * @param[in] nLine 要获取第几行数据,默认为 -1 * @return 返回指定行的第一个字符索引 */ int LineIndex(int nLine = -1) const; /** * @brief 获取指定行的数据长度 * @param[in] nLine 要获取第几行数据,默认为 -1 * @return 返回指定行的数据长度 */ int LineLength(int nLine = -1) const; /** * @brief 滚动文本 * @param[in] nLines 指定垂直滚动方向 * @param[in] nChars 指定水平滚动方向 * @return 成功返回 true,失败返回 false */ bool LineScroll(int nLines, int nChars = 0); /** * @brief 获取指定位置字符的客户区坐标 * @param[in] lChar 字符索引位置 * @return 返回客户区坐标 */ CPoint GetCharPos(long lChar) const; /** * @brief 获取指定字符所在行数 * @param[in] nIndex 字符的索引位置 * @return 返回当前字符所在的行数 */ long LineFromChar(long nIndex) const; /** * @brief 获取指定位置字符的客户区坐标 * @param[in] nChar 字符索引位置 * @return 返回客户区坐标 */ CPoint PosFromChar(UINT nChar) const; /** * @brief 根据坐标返回指定字符索引 * @param[in] pt 坐标信息 * @return 返回最接近参数 pt 所指定的坐标位置 */ int CharFromPos(CPoint pt) const; /** * @brief 清空撤销列表 * @return 无 */ void EmptyUndoBuffer(); /** * @brief 设置撤销列表容纳的内容数量 * @param[in] nLimit * @return 返回设置后的撤销列表可容纳内容数量 */ UINT SetUndoLimit(UINT nLimit); /** * @brief 增加一个回调用于控制输入内容 * @param[in] nFormat 指定数据格式的替换选项,见:https://docs.microsoft.com/en-us/windows/desktop/controls/em-streamin * @param[in] es 包含自定义回调的结构体 * @return 返回读入数据流的数据大小 */ long StreamIn(int nFormat, EDITSTREAM &es); /** * @brief 指定一个回调用于控制输出内容 * @param[in] nFormat 指定数据格式的替换选项,见:https://docs.microsoft.com/en-us/windows/desktop/controls/em-streamin * @param[in] es 包含自定义回调的结构体 * @return 返回写入数据流的数据大小 */ long StreamOut(int nFormat, EDITSTREAM &es); // 注意:TxSendMessage和SendMessage是有区别的,TxSendMessage没有multibyte和unicode自动转换的功能, // 而richedit2.0内部是以unicode实现的,在multibyte程序中,必须自己处理unicode到multibyte的转换 virtual HRESULT TxSendMessage(UINT msg, WPARAM wparam, LPARAM lparam, LRESULT *plresult) const; IDropTarget* GetTxDropTarget(); bool SetDropAcceptFile(bool bAccept); virtual void OnTxNotify(DWORD iNotify, void *pv); virtual bool OnTxTextChanged(); ITextHost* GetTextHost(); ITextServices* GetTextServices(); BOOL SetOleCallback(IRichEditOleCallback* pCallback); CSize GetNaturalSize(LONG width, LONG height); void SetImmStatus(BOOL bOpen); void SetTimer(UINT idTimer, UINT uTimeout); void KillTimer(UINT idTimer); /** * @brief 设置滚动条位置 * @param[in] szPos 要设置的滚动条位置信息 * @return 无 */ void SetScrollPos(CSize szPos); /** * @brief 向上一行 * @return 无 */ void LineUp(); /** * @brief 向下一行 * @return 无 */ void LineDown(); /** * @brief 向上翻页 * @return 无 */ void PageUp(); /** * @brief 向下翻页 * @return 无 */ void PageDown(); /** * @brief 返回到顶端 * @return 无 */ void HomeUp(); /** * @brief 返回到底部 * @return 无 */ void EndDown(); /** * @brief 水平向左滚动 * @return 无 */ void LineLeft(); /** * @brief 水平向右滚动 * @return 无 */ void LineRight(); /** * @brief 水平向左翻页 * @return 无 */ void PageLeft(); /** * @brief 水平向右翻页 * @return 无 */ void PageRight(); /** * @brief 返回到最左侧 * @return 无 */ void HomeLeft(); /** * @brief 返回到最后侧 * @return 无 */ void EndRight(); virtual void DoInit() override; virtual void SetEnabled(bool bEnable = true) override; virtual CSize EstimateSize(CSize szAvailable) override; virtual void SetPos(UiRect rc) override; virtual UINT GetControlFlags() const override; virtual void HandleMessage(EventArgs& event) override; void OnSetCursor(EventArgs& event); void OnSetFocus(EventArgs& event); void OnKillFocus(EventArgs& event); void OnChar(EventArgs& event); void OnKeyDown(EventArgs& event); void OnImeStartComposition(EventArgs& event); void OnImeEndComposition(EventArgs& event); void OnMouseMessage(UINT uMsg, EventArgs& event); virtual void Paint(IRenderContext* pRender, const UiRect& rcPaint) override; virtual void PaintChild(IRenderContext* pRender, const UiRect& rcPaint) override; virtual void SetAttribute(const std::wstring& pstrName, const std::wstring& pstrValue) override; /** * @brief 创建光标 * @param[in] xWidth 光标宽度 * @param[in] yHeight 光标高度 * @return 成功返回 true,失败返回 false */ BOOL CreateCaret(INT xWidth, INT yHeight); /** * @brief 设置是否显示光标 * @param[in] fShow 设置 true 为显示,false 为不显示 * @return 成功返回 true,失败返回 false */ BOOL ShowCaret(BOOL fShow); /** * @brief 设置光标颜色 * @param[in] dwColor 要设置的颜色值,该值必须在 global.xml 中存在 * @return 无 */ void SetCaretColor(const std::wstring& dwColor); /** * @brief 获取光标颜色 * @return 返回光标颜色 */ std::wstring GetCaretColor(); /** * @brief 获取光标矩形位置 * @return 返回光标矩形位置 */ RECT GetCaretRect(); /** * @brief 设置光标位置 * @param[in] x X 轴坐标 * @param[in] y Y 轴坐标 * @return 成功返回 true,失败返回 false */ BOOL SetCaretPos(INT x, INT y); /** * @brief 切换光标是否显示 * @return 无 */ void ChangeCaretVisiable(); /** * @brief 绘制光标 * @param[in] pRender 绘制引擎 * @param[in] rcPaint 绘制位置 * @return 无 */ void PaintCaret(IRenderContext* pRender, const UiRect& rcPaint); /** * @brief 设置是否显示提示文字 * @param[in] bPrompt 设置为 true 为显示,false 为不显示 * @return 无 */ void SetPromptMode(bool bPrompt); /** * @brief 获取提示文字 * @return 返回提示文字内容 */ std::wstring GetPromptText() const; /** * @brief 获取提示文字 * @return 返回 UTF8 格式的提示文字 */ std::string GetUTF8PromptText() const; /** * @brief 设置提示文字 * @param[in] strText 要设置的提示文字 * @return 无 */ void SetPromptText(const std::wstring& strText); /** * @brief 设置提示文字 * @param[in] strText 要设置的 UTF8 格式提示文字 * @return 无 */ void SetUTF8PromptText(const std::string& strText); /** * @brief 设置提示文字 ID * @param[in] strText 要设置的提示文字 ID,该 ID 必须在加载的语言文件中存在 * @return 无 */ void SetPromptTextId(const std::wstring& strTextId); /** * @brief 设置提示文字 ID * @param[in] strText 要设置的 UTF8 格式提示文字 ID,该 ID 必须在加载的语言文件中存在 * @return 无 */ void SetUTF8PromptTextId(const std::string& strTextId); /** * @brief 绘制提示文字 * @param[in] pRender 绘制引擎 * @return 无 */ void PaintPromptText(IRenderContext* pRender); /** * @brief 获取焦点状态下的图片 * @return 返回焦点状态下的图片 */ std::wstring GetFocusedImage(); /** * @brief 设置焦点状态下的图片 * @param[in] strImage 要设置的图片位置 * @return 无 */ void SetFocusedImage(const std::wstring& strImage); /** * @brief 绘制指定状态下的图片 * @param[in] pRender 绘制引擎 * @return 无 */ virtual void PaintStatusImage(IRenderContext* pRender) override; /** * @brief 设置失去焦点后是否取消选择项 * @param[in] bOnSel 设置为 true 表示取消选择项,false 为不取消 * @return 无 */ void SetNoSelOnKillFocus(bool bOnSel); /** * @brief 设置获取焦点后是否选择所有内容 * @param[in] bSelAll 设置 true 表示在获取焦点时选择所有内容,false 为不选择 * @return 无 */ void SetSelAllOnFocus(bool bSelAll); /** * @brief 设置只读模式不显示光标 * @return 无 */ void SetNoCaretReadonly(); /** * @brief 添加带颜色的文本 * @param[in] str 文本内容 * @param[in] color 颜色值,该值必须在 global.xml 中存在 * @return 无 */ void AddColorText(const std::wstring &str, const std::wstring &color); /** * @brief 添加一个带有文字颜色的超链接 * @param[in] str 文字内容 * @param[in] color 文字颜色 * @param[in] linkInfo 链接地址 * @return 无 */ void AddLinkColorText(const std::wstring &str, const std::wstring &color, const std::wstring &linkInfo = L""); /** * @brief 添加一个指定字体带有文字颜色的超链接 * @param[in] str 文字内容 * @param[in] color 文字颜色 * @param[in] linkInfo 链接地址 * @param[in] font 字体索引 * @return 无 */ void AddLinkColorTextEx(const std::wstring& str, const std::wstring &color, const std::wstring &linkInfo = L"", const std::wstring& strFontId = L""); /** * @brief 添加一个范围用于 hittest 判断是否是链接信息 * @param[in] cr 范围的起始位置和结束位置 * @param[in] linkInfo 自定义 link 属性 * @return 无 */ void AddLinkInfo(const CHARRANGE cr, const std::wstring &linkInfo); /** * @brief 根据point来hittest自定义link的数据 * @param[in] pt 位置信息 * @param[in] info 表示 link 的自定义属性 * @return 返回 true 表示在 link 上 */ bool HittestCustomLink(CPoint pt, std::wstring& info); /** * @brief 清理图片缓存 * @return 无 */ virtual void ClearImageCache() override; /** * @brief 监听回车按键按下事件 * @param[in] callback 回车被按下的自定义回调函数 * @return 无 */ void AttachReturn(const EventCallback& callback) { OnEvent[kEventReturn] += callback; } /** * @brief 监听 TAB 按键按下事件 * @param[in] callback TAB 被按下的自定义回调函数 * @return 无 */ void AttachTab(const EventCallback& callback) { OnEvent[kEventTab] += callback; } /** * @brief 监听文本被修改事件 * @param[in] callback 文本被修改后的自定义回调函数 * @return 无 */ void AttachTextChange(const EventCallback& callback) { OnEvent[kEventTextChange] += callback; } /** * @brief 监听自定义链接被点击事件 * @param[in] callback 自定义链接被点击后的自定义回调函数 * @return 无 */ void AttachCustomLinkClk(const EventCallback& callback) { OnEvent[kEventCustomLinkClick] += callback; } /** * @brief 监听大小变化事件 * @param[in] callback 大小被改变后的自定义回调函数 * @return 无 */ void AttachGetNaturalSize(const FunGetNaturalSize& callback) { m_cbGetNaturalSize = callback; }; protected: CTxtWinHost* m_pTwh; bool m_bVScrollBarFixing; bool m_bWantTab; bool m_bNeedReturnMsg; bool m_bReturnMsgWantCtrl; bool m_bRich; bool m_bReadOnly; bool m_bPassword; bool m_bWordWrap; bool m_bNumberOnly; bool m_bInited; bool m_bAllowPrompt; bool m_bSelAllEver; //只在第一次时全选 bool m_bNoSelOnKillFocus; //针对 m_bEnabled && m_bReadOnly bool m_bSelAllOnFocus; //针对 m_bEnabled && !m_bReadOnly bool m_bNoCaretReadonly; bool m_bIsCaretVisiable; bool m_bIsComposition; int m_iCaretPosX; int m_iCaretPosY; int m_iCaretWidth; int m_iCaretHeight; std::wstring m_sFontId; int m_iLimitText; LONG m_lTwhStyle; VerAlignType m_textVerAlignType; std::wstring m_sCurrentColor; std::wstring m_sTextColor; std::wstring m_sDisabledTextColor; std::wstring m_sPromptColor; std::wstring m_sCaretColor; std::wstring m_sText; std::wstring m_sPromptText; std::wstring m_sPromptTextId; nbase::WeakCallbackFlag m_drawCaretFlag; std::weak_ptr m_windowFlag; //记录所属窗体的flag FunGetNaturalSize m_cbGetNaturalSize; protected: struct LinkInfo { CHARRANGE cr; std::wstring info; }; std::map m_timeFlagMap; std::vector m_linkInfo; Image m_sFocusedImage; }; //判断是否是字节: 可打印字符(0x20-0x7e) bool IsAsciiChar(const wchar_t ch); //获取字符串的字节数 int GetAsciiCharNumber(const std::wstring &str); //删除字符串中超过limit字节个数之后的字符 void LimitAsciiNumber(std::wstring &src, int limit); //获取粘贴板字符串 void GetClipboardText(std::wstring &out); //设置粘贴板字符串 void SetClipBoardText(const std::wstring &str); } // namespace ui #endif // UI_CONTROL_RICHEDIT_H_