ExtEdit.h
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:45k
源码类别:

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #if (!defined __EXT_EDIT_H)
  22. #define __EXT_EDIT_H
  23. #if (!defined __EXT_MFC_DEF_H)
  24. #include <ExtMfcDef.h>
  25. #endif // __EXT_MFC_DEF_H
  26. #include <AfxRich.h>
  27. #if _MSC_VER >= 1000
  28. #pragma once
  29. #endif // _MSC_VER >= 1000
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CExtEditBase window
  32. class __PROF_UIS_API CExtEditBase
  33. : public CEdit
  34. , public CExtPmBridge
  35. {
  36. public:
  37. struct __PROF_UIS_API CExtNotImplRichEditOleCallBack : public IRichEditOleCallback
  38. {
  39. STDMETHOD( QueryInterface ) ( REFIID riid, LPVOID FAR * lplpObj )
  40. {
  41. if( lplpObj == NULL )
  42. return E_INVALIDARG;
  43. (*lplpObj) = NULL;
  44. if( riid == IID_IUnknown || riid == IID_IRichEditOleCallback )
  45. {
  46. (*lplpObj) = this;
  47. return S_OK;
  48. }
  49. return E_NOTIMPL;
  50. }
  51. STDMETHOD_( ULONG, AddRef ) ()
  52. { return 1; }
  53. STDMETHOD_( ULONG, Release ) ()
  54. { return 1; }
  55. STDMETHOD( GetNewStorage ) ( LPSTORAGE FAR * lplpstg )
  56. { lplpstg; return E_NOTIMPL; }
  57. STDMETHOD( GetInPlaceContext ) (LPOLEINPLACEFRAME FAR * lplpFrame, LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo )
  58. { lplpFrame; lplpDoc; lpFrameInfo; return E_NOTIMPL; }
  59. STDMETHOD( ShowContainerUI ) ( BOOL fShow )
  60. { fShow; return E_NOTIMPL; }
  61. STDMETHOD( QueryInsertObject ) (LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp )
  62. { lpclsid; lpstg; cp; return E_NOTIMPL; }
  63. STDMETHOD( DeleteObject ) ( LPOLEOBJECT lpoleobj )
  64. { lpoleobj; return E_NOTIMPL; }
  65. STDMETHOD( QueryAcceptData ) ( LPDATAOBJECT lpdataobj, CLIPFORMAT FAR * lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict )
  66. { lpdataobj; lpcfFormat; reco; fReally; hMetaPict; return E_NOTIMPL; }
  67. STDMETHOD( ContextSensitiveHelp ) ( BOOL fEnterMode )
  68. { fEnterMode; return E_NOTIMPL; }
  69. STDMETHOD( GetClipboardData ) ( CHARRANGE FAR * lpchrg, DWORD reco, LPDATAOBJECT FAR * lplpdataobj )
  70. { lpchrg; reco; lplpdataobj; return E_NOTIMPL; }
  71. STDMETHOD( GetDragDropEffect ) ( BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect )
  72. { fDrag; grfKeyState; (*pdwEffect) = DROPEFFECT_NONE; return S_OK; }
  73. STDMETHOD( GetContextMenu ) ( WORD seltype, LPOLEOBJECT lpoleobj, CHARRANGE FAR * lpchrg, HMENU FAR * lphmenu )
  74. { seltype; lpoleobj; lpchrg; lphmenu; return E_NOTIMPL; }
  75. };
  76. DECLARE_DYNCREATE( CExtEditBase );
  77. DECLARE_CExtPmBridge_MEMBERS( CExtEditBase );
  78. DECLARE_PROF_UIS_WINDOW_METHODS;
  79. CExtEditBase();
  80. virtual ~CExtEditBase();
  81. public:
  82. bool m_bRichMode:1, m_bHandleCtxMenus:1, m_bHandleAltKeyCodes:1;
  83. static HWND g_hWndEditInAltKeyCodeMode;
  84. protected:
  85. bool m_bAltKeyCodeMode:1;
  86. LONG m_nTrackedAltKeyCode;
  87. CToolTipCtrl m_wndToolTip;
  88. void InitToolTip();
  89. COLORREF m_clrBack;
  90. COLORREF m_clrBackPrev;
  91. CBrush m_brBack;
  92. COLORREF m_clrText;
  93. protected:
  94.     CExtSafeString m_strCueBanner;
  95. public:
  96.     bool SetCueBanner( __EXT_MFC_SAFE_LPCTSTR lpcText );
  97.     bool GetCueBanner( __EXT_MFC_SAFE_LPTSTR lpText, int cchText ) const;
  98.     CExtSafeString GetCueBanner() const;
  99. //{{AFX_VIRTUAL(CExtEditBase)
  100. virtual BOOL PreTranslateMessage( MSG * pMsg );
  101. virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
  102. protected:
  103. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  104. //}}AFX_VIRTUAL
  105. public:
  106. void SetTooltipText(
  107. int nId,
  108. BOOL bActivate = TRUE
  109. );
  110. void SetTooltipText(
  111. CExtSafeString * spText,
  112. BOOL bActivate = TRUE
  113. );
  114. void SetTooltipText(
  115. CExtSafeString & sText,
  116. BOOL bActivate = TRUE
  117. );
  118. void SetTooltipText(
  119. __EXT_MFC_SAFE_LPCTSTR sText,
  120. BOOL bActivate = TRUE
  121. );
  122. void ActivateTooltip(
  123. BOOL bEnable = TRUE
  124. );
  125. void SetBkColor( COLORREF clrBk );
  126. COLORREF GetBkColor() const;
  127. void SetTextColor( COLORREF clrText );
  128. COLORREF GetTextColor() const;
  129. protected:
  130. virtual __EXT_MFC_INT_PTR OnToolHitTest( CPoint point, TOOLINFO * pTI ) const;
  131. virtual COLORREF OnQueryBackColor() const;
  132. virtual COLORREF OnQueryTextColor() const;
  133. virtual int OnQueryMaxTipWidth( __EXT_MFC_SAFE_LPCTSTR lpszText );
  134. public:
  135. static void stat_DoPaintNc(
  136. bool bEnabled,
  137. bool bMouseOver,
  138. CWnd * pWnd,
  139. CExtPmBridge * pPmBridge,
  140. CDC * pDC
  141. );
  142. static void stat_DrawEditImpl(
  143. bool bEnabled,
  144. bool bMouseOver,
  145. CWnd * pWnd,
  146. CExtPmBridge * pPmBridge,
  147. CRect rectClient,
  148. CDC * pDC
  149. );
  150. static void stat_PrintClient(
  151. bool bEnabled,
  152. bool bMouseOver,
  153. UINT message,
  154. LPARAM lParam,
  155. CWnd * pWnd,
  156. CExtPmBridge * pPmBridge,
  157. CDC * pDC
  158. );
  159. protected:
  160. //{{AFX_MSG(CExtEditBase)
  161. afx_msg void OnPaint();
  162. afx_msg void OnContextMenu(CWnd* pWnd,CPoint pos );
  163. afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
  164. //}}AFX_MSG
  165. DECLARE_MESSAGE_MAP()
  166. public:
  167. INT Rich_GetLine( INT nIndex, __EXT_MFC_SAFE_LPTSTR lpszBuffer ) const
  168. {
  169. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  170. return (INT) ::SendMessage( m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer );
  171. }
  172. INT Rich_LineIndex( INT nLine = -1 ) const
  173. {
  174. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  175. return (int)::SendMessage( m_hWnd, EM_LINEINDEX, nLine, 0 );
  176. }
  177. INT Rich_LineLength( INT nLine = -1 ) const
  178. {
  179. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  180. return (INT)::SendMessage( m_hWnd, EM_LINELENGTH, nLine, 0 );
  181. }
  182. void Rich_LineScroll( INT nLines, INT nChars = 0 )
  183. {
  184. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  185. ::SendMessage( m_hWnd, EM_LINESCROLL, nChars, nLines );
  186. }
  187. void Rich_SetSel( LONG nStartChar, LONG nEndChar )
  188. {
  189. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  190. CHARRANGE cr; cr.cpMin = nStartChar; cr.cpMax = nEndChar;
  191. ::SendMessage( m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr );
  192. }
  193. void Rich_SetSel( CHARRANGE & cr )
  194. {
  195. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  196. ::SendMessage( m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr );
  197. }
  198. BOOL Rich_CanPaste( UINT nFormat ) const
  199. {
  200. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  201. COleMessageFilter * pFilter = AfxOleGetMessageFilter();
  202. if( pFilter != NULL )
  203. pFilter->BeginBusyState();
  204. BOOL b = (BOOL)::SendMessage( m_hWnd, EM_CANPASTE, nFormat, 0L );
  205. if( pFilter != NULL )
  206. pFilter->EndBusyState();
  207. return b;
  208. }
  209. void Rich_PasteSpecial( UINT nClipFormat, DWORD dvAspect, HMETAFILE hMF )
  210. {
  211. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  212. REPASTESPECIAL reps; reps.dwAspect = dvAspect; reps.dwParam = (__EXT_MFC_DWORD_PTR)hMF;
  213. ::SendMessage( m_hWnd, EM_PASTESPECIAL, nClipFormat, (LPARAM)&reps );
  214. }
  215. INT Rich_GetLine( INT nIndex, __EXT_MFC_SAFE_LPTSTR lpszBuffer, INT nMaxLength ) const
  216. {
  217. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  218. if( nMaxLength < sizeof(INT) )
  219. {
  220. ASSERT( FALSE );
  221. return 0;
  222. }
  223. (*(LPINT(LPVOID(LPCTSTR(lpszBuffer))))) = nMaxLength;
  224. return (INT)::SendMessage( m_hWnd, EM_GETLINE, nIndex, (LPARAM)LPCTSTR(lpszBuffer) );
  225. }
  226. CPoint Rich_GetCharPos( LONG lChar ) const
  227. {
  228. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  229. CPoint pt; ::SendMessage( m_hWnd, EM_POSFROMCHAR, (WPARAM)&pt, (LPARAM)lChar ); return pt;
  230. }
  231. void Rich_GetSel( LONG & nStartChar, LONG & nEndChar ) const
  232. {
  233. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  234. CHARRANGE cr; ::SendMessage( m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr ); nStartChar = cr.cpMin; nEndChar = cr.cpMax;
  235. }
  236. void Rich_GetSel( CHARRANGE & cr ) const
  237. {
  238. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  239.   ::SendMessage( m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr );
  240. }
  241. void Rich_LimitText( LONG nChars )
  242. {
  243. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  244. ::SendMessage( m_hWnd, EM_EXLIMITTEXT, 0, nChars );
  245. }
  246. LONG Rich_LineFromChar( LONG nIndex ) const
  247. {
  248. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  249. return (LONG)::SendMessage( m_hWnd, EM_EXLINEFROMCHAR, 0, nIndex );
  250. }
  251. LONG Rich_FindText( DWORD dwFlags, FINDTEXTEX * pFindText ) const
  252. {
  253. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  254. return (LONG)::SendMessage( m_hWnd, EM_FINDTEXTEX, dwFlags, (LPARAM)pFindText );
  255. }
  256. LONG Rich_FormatRange( FORMATRANGE * pfr, BOOL bDisplay )
  257. {
  258. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  259. return (LONG)::SendMessage( m_hWnd, EM_FORMATRANGE, (WPARAM)bDisplay, (LPARAM)pfr );
  260. }
  261. LONG Rich_GetEventMask() const
  262. {
  263. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  264. return (LONG)::SendMessage( m_hWnd, EM_GETEVENTMASK, 0, 0L );
  265. }
  266. LONG Rich_GetLimitText() const
  267. {
  268. ASSERT_VALID( this );
  269. ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  270. return (LONG)::SendMessage( m_hWnd, EM_GETLIMITTEXT, 0, 0L );
  271. }
  272. LONG Rich_GetSelText( __EXT_MFC_SAFE_LPTSTR lpBuf ) const
  273. {
  274. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  275. return (LONG)::SendMessage( m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpBuf );
  276. }
  277. void Rich_HideSelection( bool bHide, bool bPerm )
  278. {
  279. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  280. ::SendMessage( m_hWnd, EM_HIDESELECTION, WPARAM( bHide ? TRUE : FALSE ), LPARAM( bPerm ? TRUE : FALSE ) );
  281. }
  282. void Rich_RequestResize()
  283. {
  284. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  285. ::SendMessage( m_hWnd, EM_REQUESTRESIZE, 0, 0L );
  286. }
  287. WORD Rich_GetSelectionType() const
  288. {
  289. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  290. return (WORD)::SendMessage( m_hWnd, EM_SELECTIONTYPE, 0, 0L );
  291. }
  292. COLORREF Rich_SetBackgroundColor(BOOL bSysColor, COLORREF cr)
  293. {
  294. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  295. return (COLORREF)::SendMessage( m_hWnd, EM_SETBKGNDCOLOR, bSysColor, cr );
  296. }
  297. DWORD Rich_SetEventMask(DWORD dwEventMask)
  298. {
  299. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  300. return (DWORD)::SendMessage( m_hWnd, EM_SETEVENTMASK, 0, dwEventMask );
  301. }
  302. BOOL Rich_SetOLECallback(IRichEditOleCallback* pCallback)
  303. {
  304. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  305. return (BOOL)::SendMessage( m_hWnd, EM_SETOLECALLBACK, 0, (LPARAM)pCallback );
  306. }
  307. BOOL Rich_SetTargetDevice(HDC hDC, LONG lLineWidth)
  308. {
  309. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  310. return (BOOL)::SendMessage( m_hWnd, EM_SETTARGETDEVICE, (WPARAM)hDC, lLineWidth );
  311. }
  312. BOOL Rich_SetTargetDevice(CDC &dc, LONG lLineWidth)
  313. {
  314. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  315. return (BOOL)::SendMessage( m_hWnd, EM_SETTARGETDEVICE, (WPARAM)dc.m_hDC, lLineWidth );
  316. }
  317. LONG Rich_GetTextLength() const
  318. {
  319. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  320. return (LONG)::SendMessage( m_hWnd, WM_GETTEXTLENGTH, NULL, NULL );
  321. }
  322. CExtSafeString Rich_GetSelText() const
  323. {
  324. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  325. CHARRANGE cr; cr.cpMin = cr.cpMax = 0;
  326. ::SendMessage( m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr );
  327. LPTSTR lpsz = (LPTSTR)_alloca((cr.cpMax - cr.cpMin + 1)*2);
  328. lpsz[0] = NULL;
  329. ::SendMessage( m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz );
  330. return lpsz;
  331. }
  332. IRichEditOle * Rich_GetIRichEditOle() const
  333. {
  334. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  335. IRichEditOle * pRichItem = NULL;
  336. ::SendMessage( m_hWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichItem );
  337. return pRichItem;
  338. }
  339. PARAFORMAT Rich_GetParagraphFormat() const
  340. {
  341. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  342. PARAFORMAT _pf; ::memset( &_pf, 0, sizeof(PARAFORMAT) ); _pf.cbSize = sizeof(PARAFORMAT);
  343. _pf.dwMask = PFM_ALIGNMENT | PFM_NUMBERING;
  344. ::SendMessage( m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&_pf );
  345. return _pf;
  346. }
  347. bool Rich_Paragraph_Bulleted_Get() const
  348. {
  349. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  350. PARAFORMAT _pf; ::memset( &_pf, 0, sizeof(PARAFORMAT) ); _pf.cbSize = sizeof(PARAFORMAT);
  351. bool bRetVal = ( _pf.wNumbering == PFN_BULLET ) ? true : false;
  352. return bRetVal;
  353. }
  354. void Rich_Paragraph_Bulleted_Set()
  355. {
  356. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  357. PARAFORMAT _pf = Rich_GetParagraphFormat();
  358. if ( (_pf.dwMask & PFM_NUMBERING) && (_pf.wNumbering == PFN_BULLET) )
  359. {
  360. _pf.wNumbering = 0;
  361. _pf.dxOffset = 0;
  362. _pf.dxStartIndent = 0;
  363. _pf.dwMask = PFM_NUMBERING|PFM_STARTINDENT|PFM_OFFSET;
  364. }
  365. else
  366. {
  367. _pf.wNumbering = PFN_BULLET;
  368. _pf.dwMask = PFM_NUMBERING;
  369. if (_pf.dxOffset == 0)
  370. {
  371. _pf.dxOffset = 4;
  372. _pf.dwMask = PFM_NUMBERING|PFM_STARTINDENT|PFM_OFFSET;
  373. }
  374. }
  375. ::SendMessage( m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&_pf );
  376. }
  377. bool Rich_Paragraph_Right_Get() const
  378. {
  379. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  380. PARAFORMAT _pf = Rich_GetParagraphFormat();
  381. bool bRetVal = ( _pf.wAlignment == PFA_RIGHT ) ? true : false;
  382. return bRetVal;
  383. }
  384. bool Rich_Paragraph_Left_Get() const
  385. {
  386. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  387. PARAFORMAT _pf = Rich_GetParagraphFormat();
  388. bool bRetVal = ( _pf.wAlignment == PFA_LEFT ) ? true : false;
  389. return bRetVal;
  390. }
  391. bool Rich_Paragraph_Centered_Get() const
  392. {
  393. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  394. PARAFORMAT _pf = Rich_GetParagraphFormat();
  395. bool bRetVal = ( _pf.wAlignment == PFA_CENTER ) ? true : false;
  396. return bRetVal;
  397. }
  398. void Rich_SetParagraphRight()
  399. {
  400. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  401. PARAFORMAT _pf; ::memset( &_pf, 0, sizeof(PARAFORMAT) ); _pf.cbSize = sizeof(PARAFORMAT);
  402. _pf.dwMask = PFM_ALIGNMENT; _pf.wAlignment = PFA_RIGHT;
  403. ::SendMessage( m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&_pf );
  404. }
  405. void Rich_SetParagraphLeft()
  406. {
  407. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  408. PARAFORMAT _pf; ::memset( &_pf, 0, sizeof(PARAFORMAT) ); _pf.cbSize = sizeof(PARAFORMAT);
  409. _pf.dwMask = PFM_ALIGNMENT; _pf.wAlignment = PFA_LEFT;
  410. ::SendMessage( m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&_pf );
  411. }
  412. void Rich_SetParagraphCenter()
  413. {
  414. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  415. PARAFORMAT _pf; ::memset( &_pf, 0, sizeof(PARAFORMAT) ); _pf.cbSize = sizeof(PARAFORMAT);
  416. _pf.dwMask = PFM_ALIGNMENT; _pf.wAlignment = PFA_CENTER;
  417. ::SendMessage( m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&_pf );
  418. }
  419. CHARFORMAT Rich_GetCharFormat( DWORD dwMask = CFM_COLOR|CFM_FACE|CFM_SIZE|CFM_BOLD|CFM_ITALIC|CFM_UNDERLINE ) const
  420. {
  421. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  422. CHARFORMAT _cf; ::memset( &_cf, 0, sizeof(CHARFORMAT) ); _cf.cbSize = sizeof(CHARFORMAT); _cf.dwMask = dwMask;
  423. ::SendMessage( m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&_cf );
  424. return _cf;
  425. }
  426. void Rich_SetCharStyle( INT nMask, INT nStyle /*, INT nStart, INT nEnd*/ )
  427. {
  428. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  429. CHARFORMAT _cf; ::memset( &_cf, 0, sizeof(CHARFORMAT) ); _cf.cbSize = sizeof(CHARFORMAT);
  430. //cf.dwMask = nMask;
  431. ::SendMessage( m_hWnd, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&_cf );
  432. if( _cf.dwMask & nMask )
  433. _cf.dwEffects ^= nStyle; 
  434. else
  435. _cf.dwEffects |= nStyle;
  436. _cf.dwMask = nMask;
  437. ::SendMessage( m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&_cf );
  438. }
  439. bool Rich_Selection_Bold_Get() const
  440. {
  441. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  442. CHARFORMAT _cf = Rich_GetCharFormat();
  443. bool bRetVal = ( ( _cf.dwEffects & CFM_BOLD ) != 0 ) ? true : false;
  444. return bRetVal;
  445. }
  446. bool Rich_Selection_Italic_Get() const
  447. {
  448. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  449. CHARFORMAT _cf = Rich_GetCharFormat();
  450. bool bRetVal = ( ( _cf.dwEffects & CFM_ITALIC ) != 0 ) ? true : false;
  451. return bRetVal;
  452. }
  453. bool Rich_Selection_Underlined_Get() const
  454. {
  455. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  456. CHARFORMAT _cf = Rich_GetCharFormat();
  457. bool bRetVal = ( ( _cf.dwEffects & CFM_UNDERLINE ) != 0 ) ? true : false;
  458. return bRetVal;
  459. }
  460. bool Rich_Selection_StrikeOut_Get() const
  461. {
  462. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  463. CHARFORMAT _cf = Rich_GetCharFormat();
  464. bool bRetVal = ( ( _cf.dwEffects & CFM_STRIKEOUT ) != 0 ) ? true : false;
  465. return bRetVal;
  466. }
  467. void Rich_Selection_Bold_Set( bool bSet = true )
  468. {
  469. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  470. Rich_SetCharStyle( CFM_BOLD, bSet ? CFE_BOLD : 0 );
  471. }
  472. void Rich_Selection_Italic_Set( bool bSet = true )
  473. {
  474. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  475. Rich_SetCharStyle( CFM_ITALIC, bSet ? CFE_ITALIC : 0 );
  476. }
  477. void Rich_Selection_Underlined_Set( bool bSet = true )
  478. {
  479. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  480. Rich_SetCharStyle( CFM_UNDERLINE, bSet ? CFE_UNDERLINE : 0 );
  481. }
  482. void Rich_Selection_StrikeOut_Set( bool bSet = true )
  483. {
  484. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  485. Rich_SetCharStyle( CFM_STRIKEOUT, bSet ? CFE_STRIKEOUT : 0 );
  486. }
  487. void Rich_SetSelectionColor( COLORREF clr )
  488. {
  489. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  490. INT nStart = 0, nEnd = 0; GetSel( nStart, nEnd );
  491. CHARFORMAT _cf; ::memset( &_cf, 0, sizeof(CHARFORMAT) ); _cf.cbSize = sizeof(CHARFORMAT); _cf.crTextColor = clr; _cf.dwMask = CFM_COLOR;
  492. ::SendMessage( m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&_cf );
  493. }
  494. LONG Rich_StreamIn( INT nFormat, EDITSTREAM & _es ) { ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode ); return (LONG)::SendMessage( m_hWnd, EM_STREAMIN,  nFormat, (LPARAM)&_es ); }
  495. LONG Rich_StreamOut( INT nFormat, EDITSTREAM & _es ) const { ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode ); return (long)::SendMessage( m_hWnd, EM_STREAMOUT, nFormat, (LPARAM)&_es ); }
  496. static DWORD CALLBACK stat_Rich_CallBack_StreamIn( __EXT_MFC_DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb );
  497. static DWORD CALLBACK stat_Rich_CallBack_StreamOut( __EXT_MFC_DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG * pcb );
  498. CExtSafeString Rich_PlainText_Get() const
  499. {
  500. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  501. EDITSTREAM _es; ::memset( &_es, 0, sizeof(EDITSTREAM) );
  502. _es.dwError = 0; _es.pfnCallback = stat_Rich_CallBack_StreamOut;
  503. CExtSafeString str = _T(""); _es.dwCookie = (__EXT_MFC_DWORD_PTR)&str;
  504. Rich_StreamOut( SF_TEXT, _es );
  505. return str;
  506. }
  507. CExtSafeString Rich_RTF_Get() const
  508. {
  509. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  510. EDITSTREAM _es; ::memset( &_es, 0, sizeof(EDITSTREAM) );
  511. _es.dwError = 0; _es.pfnCallback = stat_Rich_CallBack_StreamOut;
  512. CExtSafeString str = _T(""); _es.dwCookie = (__EXT_MFC_DWORD_PTR)&str;
  513. Rich_StreamOut( SF_RTF, _es );
  514. return str;
  515. }
  516. void Rich_PlainText_Set( const CExtSafeString & str ) 
  517. {
  518. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  519. EDITSTREAM _es; ::memset( &_es, 0, sizeof(EDITSTREAM) );
  520. _es.dwError = 0; _es.pfnCallback = stat_Rich_CallBack_StreamIn; _es.dwCookie = (__EXT_MFC_DWORD_PTR)&str;
  521. Rich_StreamIn( SF_TEXT, _es );
  522. }
  523. void Rich_RTF_Set( const CExtSafeString & str ) 
  524. {
  525. ASSERT_VALID( this ); ASSERT( ::IsWindow( m_hWnd ) ); ASSERT( m_bRichMode );
  526. EDITSTREAM _es; ::memset( &_es, 0, sizeof(EDITSTREAM) );
  527. _es.dwError = 0; _es.pfnCallback = stat_Rich_CallBack_StreamIn; _es.dwCookie = (__EXT_MFC_DWORD_PTR)&str;
  528. Rich_StreamIn( SF_RTF, _es );
  529. }
  530. }; // class CExtEditBase
  531. /////////////////////////////////////////////////////////////////////////////
  532. // CExtED (for CExtEdit and CExtEditHotKey classes)
  533. #define __EXT_EDIT_UPDATE_TIMER 1
  534. #define __EXT_EDIT_UPDATE_TIMER_PERIOD 100
  535. template < class _BED >
  536. class CExtED : public _BED
  537. {
  538. public:
  539. CExtED()
  540. : m_bMouseOver( false )
  541. {
  542. }
  543. protected:
  544. virtual void _DoPaintNC( CDC * pDC )
  545. {
  546. ASSERT_VALID( this );
  547. ASSERT_VALID( pDC );
  548. ASSERT( pDC->GetSafeHdc() != NULL );
  549. CExtEditBase::stat_DoPaintNc( OnQueryWindowEnabledState(), m_bMouseOver, this, this, pDC );
  550. }
  551. virtual void _PostRedraw()
  552. {
  553. if( m_hWnd != NULL && ::IsWindow( m_hWnd ) )
  554. {
  555. VERIFY( RedrawWindow( NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW|RDW_FRAME|RDW_ALLCHILDREN ) );
  556. }
  557. }
  558. virtual void _DrawEditImpl( CRect rectClient, CDC * pDC = NULL )
  559. {
  560. CExtEditBase::stat_DrawEditImpl( OnQueryWindowEnabledState(), m_bMouseOver, this, this, rectClient, pDC );
  561. }
  562. bool m_bMouseOver:1;
  563. protected:
  564. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  565. {
  566. switch( message )
  567. {
  568. case WM_PRINT:
  569. case WM_PRINTCLIENT:
  570. {
  571. _BED::WindowProc(message, wParam, (lParam&(~(PRF_NONCLIENT|PRF_CHECKVISIBLE))|PRF_CLIENT|PRF_ERASEBKGND) );
  572. CDC * pDC = CDC::FromHandle( (HDC) wParam );
  573. CExtEditBase::stat_PrintClient( OnQueryWindowEnabledState(), m_bMouseOver, message, lParam, this, this, pDC );
  574. return (!0L);
  575. }
  576. break;
  577. case WM_TIMER:
  578. {
  579. if( wParam == __EXT_EDIT_UPDATE_TIMER )
  580. {
  581. POINT pt;
  582. if( IsWindowVisible()
  583. && ::GetCursorPos( &pt ) 
  584. )
  585. {
  586. bool bOldMouseOver = m_bMouseOver;
  587. CRect rectItem;
  588. GetWindowRect( &rectItem );
  589. if( !rectItem.PtInRect(pt) )
  590. {
  591. KillTimer( __EXT_EDIT_UPDATE_TIMER );
  592. m_bMouseOver = false;
  593. }
  594. else 
  595. if( ::WindowFromPoint( pt ) == m_hWnd )
  596. m_bMouseOver = true;
  597. if( bOldMouseOver != m_bMouseOver )
  598. _PostRedraw();
  599. }
  600. return 0L;
  601. }
  602. }
  603. break;
  604. case WM_SETFOCUS:
  605. case WM_KILLFOCUS:
  606. {
  607. LRESULT lRes = _BED::WindowProc(message, wParam, lParam);
  608. _PostRedraw();
  609. return lRes;
  610. }
  611. break;
  612. case WM_SETCURSOR:
  613. {
  614. if( HIWORD( lParam ) == WM_MOUSEMOVE )
  615. {
  616. CRect rcWnd;
  617. GetWindowRect( &rcWnd );
  618. if( rcWnd.PtInRect( GetCurrentMessage()->pt ) )
  619. {
  620. SetTimer( __EXT_EDIT_UPDATE_TIMER, __EXT_EDIT_UPDATE_TIMER_PERIOD, NULL );
  621. SendMessage( WM_TIMER, __EXT_EDIT_UPDATE_TIMER, 0L );
  622. }
  623. }
  624. }
  625. break;
  626. case WM_NCPAINT:
  627. {
  628. CWindowDC dc( this );
  629. _DoPaintNC( &dc );
  630. return 0L;
  631. }
  632. break;
  633. }
  634. return _BED::WindowProc(message, wParam, lParam);
  635. }
  636. }; // class CExtED
  637. /////////////////////////////////////////////////////////////////////////////
  638. // CExtEdit window
  639. #if _MFC_VER >= 0x700
  640. #ifndef __EXT_PROFUIS_STATIC_LINK
  641. template class __PROF_UIS_API CExtED < CExtEditBase >;
  642. #endif  // #ifndef __EXT_PROFUIS_STATIC_LINK
  643. #endif // _MFC_VER >= 0x700
  644. class __PROF_UIS_API CExtEdit : public CExtED < CExtEditBase >
  645. {
  646. public:
  647. DECLARE_DYNCREATE( CExtEdit );
  648. CExtEdit();
  649. virtual ~CExtEdit();
  650. //{{AFX_VIRTUAL(CExtEdit)
  651. //}}AFX_VIRTUAL
  652. protected:
  653. //{{AFX_MSG(CExtEdit)
  654. //}}AFX_MSG
  655. DECLARE_MESSAGE_MAP()
  656. }; // class CExtEdit
  657. /////////////////////////////////////////////////////////////////////////////
  658. // CExtIPAddressCtrl window
  659. class __PROF_UIS_API CExtIPAddressCtrl 
  660. : public CIPAddressCtrl
  661. , public CExtPmBridge
  662. {
  663. public:
  664. DECLARE_DYNCREATE( CExtIPAddressCtrl );
  665. DECLARE_CExtPmBridge_MEMBERS( CExtIPAddressCtrl );
  666. CExtIPAddressCtrl();
  667. virtual ~CExtIPAddressCtrl();
  668. BOOL Create(
  669. DWORD dwStyle, 
  670. const RECT & rect,
  671. CWnd * pParentWnd, 
  672. UINT nID
  673. );
  674. //{{AFX_VIRTUAL(CExtIPAddressCtrl)
  675. public:
  676. virtual BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext * pContext = NULL );
  677. protected:
  678. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  679. virtual void PreSubclassWindow();
  680. //}}AFX_VIRTUAL
  681. protected:
  682. virtual bool _CreateHelper();
  683. virtual void _DoPaintNC( CDC * pDC );
  684. virtual void _PostRedraw();
  685. virtual void _DrawEditImpl( CRect rectClient, CDC * pDC = NULL );
  686. bool m_bDirectCreateCall:1;
  687. bool m_bInitialized:1;
  688. bool m_bMouseOver:1;
  689. WNDPROC m_pWNDPROC[4];
  690. HWND m_hWndHooked[4];
  691. static CTypedPtrList < CPtrList, CExtIPAddressCtrl * > g_listTargets;
  692. static LRESULT CALLBACK g_HookWndProc( HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam );
  693. protected:
  694. //{{AFX_MSG(CExtIPAddressCtrl)
  695.   afx_msg void OnDestroy();
  696. afx_msg void OnTimer(__EXT_MFC_UINT_PTR nIDEvent);
  697. afx_msg void OnSetFocus(CWnd* pOldWnd);
  698. afx_msg void OnKillFocus(CWnd* pNewWnd);
  699. afx_msg void OnNcPaint();
  700. afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  701. //}}AFX_MSG
  702. DECLARE_MESSAGE_MAP()
  703. }; // class CExtIPAddressCtrl
  704. /////////////////////////////////////////////////////////////////////////////
  705. // CExtEditHotKeyBase window
  706. class __PROF_UIS_API CExtEditHotKeyBase : public CExtEditBase
  707. {
  708. // Construction
  709. public:
  710. DECLARE_DYNCREATE(CExtEditHotKeyBase);
  711. CExtEditHotKeyBase();
  712. virtual ~CExtEditHotKeyBase();
  713. protected:
  714. bool m_bAllowTabKeyInput:1;
  715. BYTE m_nSimpleKeyModifiers;
  716. ACCEL m_dataAccel;
  717. void _SyncEditText();
  718. void _Empty();
  719. public:
  720. static CExtSafeString stat_GetSingleKeyName(
  721. HKL hKeyboardLayout,
  722. WORD nKey,
  723. __EXT_MFC_SAFE_LPCTSTR strAppendIfNonEmpty = NULL,
  724. bool bMakeOnlyFirstLettersUpper = true
  725. );
  726. static CExtSafeString stat_FormatAccelText( const ACCEL & _dataAccel );
  727. bool IsAccelDefined() const;
  728. bool IsEmpty() const;
  729. void Empty();
  730. const ACCEL & AccelGet() const;
  731. void AccelSet( const ACCEL & _dataAccel );
  732. WORD KeyGet() const;
  733. void KeySet( WORD nKey );
  734. BYTE ModifiersGet() const;
  735. void ModifiersSet( BYTE nModifiers );
  736. BYTE SimpleKeyModifiersGet() const;
  737. void SimpleKeyModifiersSet( BYTE nModifiers );
  738. bool AllowTabKeyInputGet() const;
  739. void AllowTabKeyInputSet( bool bAllowTabKeyInput );
  740. virtual CExtSafeString OnGetEmptyText();
  741. virtual CExtSafeString OnGetAccelText();
  742. virtual bool OnAccelChanging( const ACCEL & _dataAccelOld, const ACCEL & _dataAccelNew );
  743. virtual void OnAccelChanged();
  744. virtual void OnAccelDefined();
  745. virtual bool OnTestEraseAccel( const ACCEL & _dataAccel );
  746. virtual bool OnTestSimpleKey( WORD nKey );
  747. virtual bool OnTestDisabledKey( WORD nKey );
  748. public:
  749.     //{{AFX_VIRTUAL(CExtEditHotKeyBase)
  750. virtual BOOL PreTranslateMessage( MSG * pMsg );
  751. protected:
  752. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );
  753. //}}AFX_VIRTUAL
  754. protected:
  755.     //{{AFX_MSG(CExtEditHotKeyBase)
  756. //}}AFX_MSG
  757. DECLARE_MESSAGE_MAP()
  758. }; /// class CExtEditHotKeyBase
  759. /////////////////////////////////////////////////////////////////////////////
  760. // CExtEditHotKey window
  761. #if _MFC_VER >= 0x700
  762. #ifndef __EXT_PROFUIS_STATIC_LINK
  763. template class __PROF_UIS_API CExtED < CExtEditHotKeyBase >;
  764. #endif  // #ifndef __EXT_PROFUIS_STATIC_LINK
  765. #endif // _MFC_VER >= 0x700
  766. class __PROF_UIS_API CExtEditHotKey : public CExtED < CExtEditHotKeyBase >
  767. {
  768. public:
  769. DECLARE_DYNCREATE( CExtEditHotKey );
  770. CExtEditHotKey();
  771. virtual ~CExtEditHotKey();
  772. //{{AFX_VIRTUAL(CExtEditHotKey)
  773. //}}AFX_VIRTUAL
  774. protected:
  775. //{{AFX_MSG(CExtEditHotKey)
  776. //}}AFX_MSG
  777. DECLARE_MESSAGE_MAP()
  778. }; /// class CExtEditHotKey
  779. __PROF_UIS_API void AFXAPI __EXT_MFC_DDX_HotKey( CDataExchange * pDX, INT nIDC, ACCEL & value );
  780. /////////////////////////////////////////////////////////////////////////////
  781. // CExtEditWithBehavior
  782. class __PROF_UIS_API CExtEditWithBehavior : public CExtEdit
  783. {
  784. public:
  785. DECLARE_DYNAMIC( CExtEditWithBehavior );
  786. CExtEditWithBehavior();
  787. virtual ~CExtEditWithBehavior();
  788. virtual void TextSet( __EXT_MFC_SAFE_LPCTSTR strText );
  789. virtual CExtSafeString TextGet() const;
  790. virtual CExtSafeString TextGetTrimmed() const;
  791. COLORREF m_clrRichTextNormal, m_clrRichTextReadOnly, m_clrRichTextDisabled;
  792. COLORREF m_clrRichBackNormal, m_clrRichBackReadOnly, m_clrRichBackDisabled;
  793. virtual void _Rich_OnDraw();
  794. virtual BOOL _Rich_OnProtected( ENPROTECTED * pEP );
  795. protected:
  796. bool m_bRichPainting:1;
  797. virtual void _UpdateContent();
  798. public:
  799. virtual CExtSafeString TextGetValid() const;
  800. virtual bool Behavior_OnQueryCharEnabledTyping( __EXT_MFC_SAFE_TCHAR _tchr ) const;
  801. private:
  802. enum e_InternalStateFlags_t
  803. {
  804. __EISF_CLEAN = 0x0000,
  805. __EISF_TCWAS = 0x0001, // text color was already set
  806. };
  807. UINT m_nInternalFlags;
  808. public:
  809. class __PROF_UIS_API CBehaviorBase
  810. {
  811. public:
  812. CBehaviorBase();
  813. virtual ~CBehaviorBase();
  814. bool _FlagsModify( UINT uAdd, UINT uRemove );
  815. UINT _FlagsGet() const;
  816. virtual CExtSafeString Behavior_GetValidText( bool bSetSel = false ) const = 0;
  817. virtual void Behavior_OnChar( UINT uChar, UINT nRepCnt, UINT nFlags ) = 0;
  818. virtual void Behavior_OnKeyDown( UINT uChar, UINT nRepCnt, UINT nFlags );
  819. virtual void Behavior_OnKillFocus( CWnd * pNewWnd );
  820. virtual LRESULT Behavior_OnPaste( WPARAM wParam, LPARAM lParam );
  821. protected:
  822. virtual LRESULT _Default();
  823. virtual void _Redraw();
  824. public:
  825. virtual bool Behavior_OnQueryCharEnabledTyping(__EXT_MFC_SAFE_TCHAR _tchr ) const;
  826. CExtEditWithBehavior * m_pEditWithBehaviorWnd;
  827. protected:
  828. UINT m_nBehaviorFlags;
  829. }; /// class CBehaviorBase
  830. friend class CBehaviorBase;
  831. class __PROF_UIS_API CBehaviorMasked : public CBehaviorBase
  832. {
  833. public:
  834. CBehaviorMasked(
  835. __EXT_MFC_SAFE_LPCTSTR strMask = _T("")
  836. );
  837. void MaskSet( __EXT_MFC_SAFE_LPCTSTR strMask );
  838. __EXT_MFC_SAFE_LPCTSTR MaskGet() const;
  839. CExtSafeString _GetNumericText() const;
  840. void InsertModeSet( bool bInsertMode );
  841. bool InsertModeGet() const;
  842. void NullableModeSet( bool bNullableMode );
  843. bool NullableModeGet() const;
  844. void NullCharSet( __EXT_MFC_SAFE_TCHAR _tchrNullChar );
  845. __EXT_MFC_SAFE_TCHAR NullCharGet() const;
  846. void FieldSelectionModeSet( bool bFieldSelectionMode );
  847. bool FieldSelectionModeGet() const;
  848. class __PROF_UIS_API CharRule
  849. {
  850. public:
  851. #ifndef _UNICODE
  852. typedef int   (*ValidationFunction)(UINT); // similar to _istdigit, _istalpha
  853. typedef UINT  (*ConversionFunction)(UINT); // similar to _totupper, _totlower
  854. #else
  855. typedef int   (*ValidationFunction)(__EXT_MFC_SAFE_TCHAR);
  856. typedef __EXT_MFC_SAFE_TCHAR (*ConversionFunction)(__EXT_MFC_SAFE_TCHAR);
  857. #endif
  858. CharRule();
  859. CharRule( __EXT_MFC_SAFE_TCHAR cSymbol, ValidationFunction fnValidation, ConversionFunction fnConversion = NULL );
  860. CharRule( COLORREF clrSymbol, __EXT_MFC_SAFE_TCHAR cSymbol, ValidationFunction fnValidation, ConversionFunction fnConversion = NULL );
  861. virtual ~CharRule();
  862. virtual bool Validate( __EXT_MFC_SAFE_TCHAR _tchr ) const;
  863. virtual __EXT_MFC_SAFE_TCHAR Convert( __EXT_MFC_SAFE_TCHAR _tchr ) const;
  864. void Set( __EXT_MFC_SAFE_TCHAR cSymbol );
  865. __EXT_MFC_SAFE_TCHAR Get() const;
  866. operator __EXT_MFC_SAFE_TCHAR() const;
  867. __EXT_MFC_SAFE_TCHAR m_cSymbol;
  868. COLORREF m_clrSymbol;
  869. ValidationFunction m_fnValidation;
  870. ConversionFunction m_fnConversion;
  871. virtual void Serialize( CArchive & ar );
  872. }; /// class CharRule
  873. class __PROF_UIS_API CharRuleArray : public CArray < CharRule, CharRule & >
  874. {
  875. public:
  876. INT FindPos( __EXT_MFC_SAFE_TCHAR tchrMask ) const
  877. {
  878. INT nIndex, nCount = INT( GetSize() );
  879. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  880. {
  881. const CharRule & _rule = (*this)[ nIndex ];
  882. __EXT_MFC_SAFE_TCHAR tchrMaskRule = _rule.Get();
  883. if( tchrMask == tchrMaskRule )
  884. return nIndex;
  885. }
  886. return -1;
  887. }
  888. bool CheckRule(
  889. __EXT_MFC_SAFE_TCHAR tchrMask,
  890. __EXT_MFC_SAFE_TCHAR tchrInput,
  891. bool * p_bRuleWasFound = NULL,
  892. bool bConvert = false
  893. ) const
  894. {
  895. INT nIndex = FindPos( tchrMask );
  896. if( nIndex >= 0 )
  897. {
  898. if( p_bRuleWasFound != NULL )
  899. (*p_bRuleWasFound) = true;
  900. const CharRule & _rule = (*this)[ nIndex ];
  901. if( bConvert )
  902. tchrInput = _rule.Convert( tchrInput );
  903. return _rule.Validate( tchrInput );
  904. }
  905. else
  906. {
  907. if( p_bRuleWasFound != NULL )
  908. (*p_bRuleWasFound) = false;
  909. if( tchrMask == tchrInput )
  910. return true;
  911. else
  912. return false;
  913. }
  914. }
  915. virtual void Serialize( CArchive & ar );
  916. }; /// class CharRuleArray
  917. CharRuleArray & GetSymbolArray();
  918. protected:
  919. virtual CExtSafeString Behavior_GetValidText( bool bSetSel = false ) const;
  920. virtual void Behavior_OnChar( UINT uChar, UINT nRepCnt, UINT nFlags );
  921. virtual void Behavior_OnKeyDown( UINT uChar, UINT nRepCnt, UINT nFlags );
  922. void _GetMaskBasedGroupArrays(
  923. CExtSafeStringArray & arrMaskGroups,
  924. CExtSafeStringArray * p_arrEnteredValues = NULL,
  925. bool bJoinSimilarRules = true,
  926. bool bJoinDifferentRules = false,
  927. bool bPutNullableCharIntoValueArray = false
  928. );
  929. public:
  930. virtual void OnCheckText( bool bAppendEndChars );
  931. virtual void OnInputChar( CExtSafeString & str );
  932. protected:
  933. bool _IsNullChar( int & _pos ) const;
  934. void _ShowNullableMask();
  935. bool _GetFieldSelection( int _currentPosition );
  936. void _DefineNewPosition( int & _nStart, int & _nEnd );
  937. void _MaskSymbolDelete( CExtSafeString & _str );
  938. void _MaskSymbolInsert( CExtSafeString _str );
  939. void _SymbolInsert( CExtSafeString _str );
  940. bool _NullCharBefore( int _nPos );
  941. bool _AddSymbolMaskToEnd();
  942. INT _GetCountMaskSymbolsFromEnd();
  943. public:
  944. CharRuleArray m_arrRules;
  945. protected:
  946. CExtSafeString m_strMask;
  947. bool m_bInsertMode:1;
  948. bool m_bNullableMode:1;
  949. bool m_bFieldSelectionMode:1;
  950. __EXT_MFC_SAFE_TCHAR m_tchrNullChar;
  951. bool m_bBack:1;
  952. }; /// class CBehaviorMasked
  953. protected:
  954. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  955. virtual void PreSubclassWindow();
  956. //{{AFX_MSG(CExtEditWithBehavior)
  957. // afx_msg void OnChange();
  958. // afx_msg void OnUpdate();
  959. //}}AFX_MSG
  960. afx_msg LRESULT OnCut( WPARAM wParam, LPARAM lParam );
  961. afx_msg LRESULT OnPaste( WPARAM wParam, LPARAM lParam );
  962. afx_msg LRESULT OnClear( WPARAM wParam, LPARAM lParam );
  963. afx_msg LRESULT OnSetText( WPARAM wParam, LPARAM lParam );
  964. afx_msg void OnProtected( NMHDR * pNMHDR, LRESULT * pResult );
  965. DECLARE_MESSAGE_MAP()
  966. }; /// class CExtEditWithBehavior
  967. /////////////////////////////////////////////////////////////////////////////
  968. // CExtEditMasked window
  969. class __PROF_UIS_API CExtEditMasked
  970. : public CExtEditWithBehavior
  971. , public CExtEditWithBehavior::CBehaviorMasked
  972. {
  973. public:
  974. DECLARE_DYNCREATE( CExtEditMasked );
  975. COLORREF m_clrDefault;
  976. CExtEditMasked(
  977. __EXT_MFC_SAFE_LPCTSTR strMask = _T("")
  978. );
  979. virtual void _Rich_OnDraw();
  980. virtual CExtSafeString TextGetValid() const;
  981. #ifndef _UNICODE
  982. static int stat_IsCharDigit( UINT c ); // similar to _istdigit()
  983. static int stat_IsCharAlpha( UINT c ); // similar to _istalpha()
  984. static int stat_IsCharAlphaOrDigit( UINT c ); // similar to _istalnum()
  985. #else
  986. static int stat_IsCharDigit( __EXT_MFC_SAFE_TCHAR c ); // similar to _istdigit()
  987. static int stat_IsCharAlpha( __EXT_MFC_SAFE_TCHAR c ); // similar to _istalpha()
  988. static int stat_IsCharAlphaOrDigit( __EXT_MFC_SAFE_TCHAR c ); // similar to _istalnum()
  989. #endif
  990. public:
  991. //{{AFX_VIRTUAL(CExtEditMasked)
  992. //}}AFX_VIRTUAL
  993. protected:
  994. //{{AFX_MSG(CExtEditMasked)
  995. afx_msg void OnChar( UINT uChar, UINT nRepCnt, UINT nFlags );
  996. afx_msg void OnKeyDown( UINT uChar, UINT nRepCnt, UINT nFlags );
  997. afx_msg void OnKillFocus( CWnd * pNewWnd );
  998. //}}AFX_MSG
  999. DECLARE_MESSAGE_MAP()
  1000. }; /// CExtEditMasked
  1001. /////////////////////////////////////////////////////////////////////////////
  1002. // CExtEditSystemNumberCurrencyBase window
  1003. #define __EXT_MFC_SYSTEM_NUMBER_MIN -1.7976931348623158e+308
  1004. #define __EXT_MFC_SYSTEM_NUMBER_MAX  1.7976931348623158e+308
  1005. #define __EXT_MFC_DEFAULT_MAX_WHOLE_DIGITS 9
  1006. #define __EXT_MFC_DEFAULT_FRACTION_WHOLE_DIGITS 2
  1007. #define __ESE_KF_PAD_WITH_ZEROS_BEFORE_DECIMAL 0x00000010
  1008. #define __ESE_KF_PAD_WITH_ZEROS_AFTER_DECIMAL 0x00000020
  1009. #define __ESE_KF_DONT_PAD_WITH_ZEROS_IF_EMPTY 0x00000040
  1010. #define __ESE_KF_REMOVE_EXTRA_LEADING_ZEROS 0x00000080
  1011. #define __ESE_KF_MASK 0x000000FF
  1012. #define __ESE_DISABLE_NEGATIVE 0x00001000
  1013. #define __ESE_ADD_DECIMAL_AFTER_MAX_WHOLE_DIGITS 0x00002000
  1014. class __PROF_UIS_API CExtEditSystemNumberCurrencyBase
  1015. : public CExtEditWithBehavior
  1016. , public CExtEditWithBehavior::CBehaviorBase
  1017. {
  1018. public:
  1019. DECLARE_DYNAMIC( CExtEditSystemNumberCurrencyBase );
  1020. CExtEditSystemNumberCurrencyBase(
  1021. INT nMaxWholeDigits = __EXT_MFC_DEFAULT_MAX_WHOLE_DIGITS,
  1022. INT nMaxFractionDigits = __EXT_MFC_DEFAULT_FRACTION_WHOLE_DIGITS
  1023. );
  1024. virtual ~CExtEditSystemNumberCurrencyBase();
  1025. virtual void CurrencySet( const CURRENCY & _cy );
  1026. virtual COleCurrency CurrencyGet() const;
  1027. virtual void LongDoubleSet( long double lfValue, bool bTrimTrailingZeros = true );
  1028. virtual long double LongDoubleGet() const = 0;
  1029. virtual void IntSet( INT nVal ) = 0;
  1030. virtual INT IntGet() const = 0;
  1031. virtual void MaxWholeDigitsSet( INT nMaxWholeDigits );
  1032. virtual INT MaxWholeDigitsGet() const;
  1033. virtual void MaxFractionDigitsSet( INT nMaxFractionDigits );
  1034. virtual INT MaxFractionDigitsGet() const;
  1035. virtual void AllowNegativeSet( bool bAllowNegative = true );
  1036. virtual bool AllowNegativeGet() const;
  1037. virtual void RangeSet( long double lfMin, long double lfMax );
  1038. virtual void RangeGet( long double * p_lfMin, long double * p_lfMax ) const;
  1039. virtual void NumberColorSet( COLORREF clrNumber = COLORREF(-1L) );
  1040. virtual COLORREF NumberColorGet() const;
  1041. virtual void FractionColorSet( COLORREF clrFraction = COLORREF(-1L) );
  1042. virtual COLORREF FractionColorGet() const;
  1043. virtual void GroupSeparatorColorSet( COLORREF clrGroupSeparator = COLORREF(-1L) );
  1044. virtual COLORREF GroupSeparatorColorGet() const;
  1045. virtual void DecimalSeparatorColorSet( COLORREF clrDecimalSeparator = COLORREF(-1L) );
  1046. virtual COLORREF DecimalSeparatorColorGet() const;
  1047. virtual void SignColorSet( COLORREF clrSign = COLORREF(-1L) );
  1048. virtual COLORREF SignColorGet() const;
  1049. virtual void BracketsColorSet( COLORREF clrBrackets = COLORREF(-1L) );
  1050. virtual COLORREF BracketsColorGet() const;
  1051. protected:
  1052. virtual bool _IsValid() const;
  1053. virtual bool _IsNegative( __EXT_MFC_SAFE_LPCTSTR strText ) const = 0;
  1054. virtual CExtSafeString TextGetValid() const;
  1055. virtual bool _DeleteSymbols( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bBackspace = false ) = 0;
  1056. virtual INT _GetGroupSeparatorCount( const CExtSafeString & strText ) const;
  1057. virtual CExtSafeString _GetNumericText( const CExtSafeString & strText, bool bUseMathSymbols = false ) const = 0;
  1058. virtual CExtSafeString _GetDoubleText( long double lfValue, bool bTrimTrailingZeros = true ) const = 0;
  1059. virtual void _GetTextWithoutMarks( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bCutDecimalPoint = false ) const = 0;
  1060. virtual void _GetTextWithMarks( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bInsertNegSign = false ) const = 0;
  1061. virtual void _AdjustSeparators( INT nCurrentSeparatorCount, bool bDecimalPoint = false );
  1062. static void stat_InsertZeros( CExtSafeString * pStrText, INT nPos, INT nCount );
  1063. virtual void _AdjustWithinRange() = 0;
  1064. virtual void _CheckFlags();
  1065. virtual void Behavior_OnKeyDown( UINT uChar, UINT nRepCnt, UINT nFlags );
  1066. virtual void Behavior_OnKillFocus( CWnd * pNewWnd );
  1067. virtual LRESULT Behavior_OnPaste( WPARAM wParam, LPARAM lParam );
  1068. INT m_nMaxWholeDigits, m_nMaxFractionDigits,
  1069. m_nDisplayLeadingZeros, m_nNegativeFormatIndex, m_nPositiveFormatIndex,
  1070. m_nNegSignMatch, m_nStartSel, m_nEndSel;
  1071. CExtSafeString m_strNegativeSign, m_strCurrencySymbol, m_strDecimalPoint, m_strGroupSeparator;
  1072. long double m_lfMin, m_lfMax;
  1073. bool m_bBackspace:1, m_bAdjustingSeparators:1;
  1074. CList < INT, INT > m_listDigitGrouping;
  1075. COLORREF m_clrNumber, m_clrFraction, m_clrGroupSeparator, m_clrDecimalSeparator, m_clrSign, m_clrBrackets;
  1076. public:
  1077. virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult);
  1078. protected:
  1079. //{{AFX_MSG(CExtEditWithBehavior)
  1080. afx_msg void OnChar( UINT uChar, UINT nRepCnt, UINT nFlags );
  1081. afx_msg void OnKeyDown( UINT uChar, UINT nRepCnt, UINT nFlags );
  1082. afx_msg void OnKillFocus( CWnd * pNewWnd );
  1083. afx_msg LRESULT OnPaste( WPARAM wParam, LPARAM lParam );
  1084. //}}AFX_MSG
  1085. DECLARE_MESSAGE_MAP()
  1086. }; /// class CExtEditSystemNumberCurrencyBase
  1087. /////////////////////////////////////////////////////////////////////////////
  1088. // CExtEditSystemNumber window
  1089. class __PROF_UIS_API CExtEditSystemNumber : public CExtEditSystemNumberCurrencyBase
  1090. {
  1091. public:
  1092. DECLARE_DYNCREATE( CExtEditSystemNumber );
  1093. CExtEditSystemNumber(
  1094. INT nMaxWholeDigits = __EXT_MFC_DEFAULT_MAX_WHOLE_DIGITS,
  1095. INT nMaxFractionDigits = __EXT_MFC_DEFAULT_FRACTION_WHOLE_DIGITS
  1096. );
  1097. virtual ~CExtEditSystemNumber();
  1098. virtual long double LongDoubleGet() const;
  1099. virtual void IntSet( INT nVal );
  1100. virtual INT IntGet() const;
  1101. protected:
  1102. void _Init();
  1103. virtual bool _IsNegative( __EXT_MFC_SAFE_LPCTSTR strText ) const;
  1104. virtual bool _DeleteSymbols( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bBackspace = false );
  1105. virtual void _GetTextWithoutMarks( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bCutDecimalPoint = false ) const;
  1106. virtual void _GetTextWithMarks( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bInsertNegSign = false ) const;
  1107. virtual CExtSafeString Behavior_GetValidText( bool bSetSel = false ) const;
  1108. virtual void Behavior_OnChar( UINT uChar, UINT nRepCnt, UINT nFlags );
  1109. virtual CExtSafeString _GetNumericText( const CExtSafeString & strText, bool bUseMathSymbols = false ) const;
  1110. virtual CExtSafeString _GetDoubleText( long double lfValue, bool bTrimTrailingZeros = true ) const;
  1111. virtual void _AdjustWithinRange();
  1112. public:
  1113. virtual void _Rich_OnDraw();
  1114. protected:
  1115. //{{AFX_MSG(CExtEditSystemNumber)
  1116. //}}AFX_MSG
  1117. afx_msg void OnSettingChange( UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection );
  1118. DECLARE_MESSAGE_MAP()
  1119. }; /// class CExtEditSystemNumber
  1120. /////////////////////////////////////////////////////////////////////////////
  1121. // CExtEditSystemCurrency window
  1122. class __PROF_UIS_API CExtEditSystemCurrency : public CExtEditSystemNumberCurrencyBase
  1123. {
  1124. public:
  1125. DECLARE_DYNCREATE( CExtEditSystemCurrency );
  1126. CExtEditSystemCurrency(
  1127. INT nMaxWholeDigits = __EXT_MFC_DEFAULT_MAX_WHOLE_DIGITS,
  1128. INT nMaxFractionDigits = __EXT_MFC_DEFAULT_FRACTION_WHOLE_DIGITS
  1129. );
  1130. virtual ~CExtEditSystemCurrency();
  1131. virtual long double LongDoubleGet() const;
  1132. virtual void IntSet( INT nVal );
  1133. virtual INT IntGet() const;
  1134. protected:
  1135. virtual INT _GetSignLengthBeforeCurrency( bool bNegative = false ) const;
  1136. virtual void _GetSignStrings( CExtSafeString & strBeforeCurrency, CExtSafeString & strAfterCurrency, bool bNegative = true ) const;
  1137. void _Init();
  1138. virtual bool _IsNegative( __EXT_MFC_SAFE_LPCTSTR strText ) const;
  1139. virtual bool _DeleteSymbols( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bBackspace = false );
  1140. virtual void _GetTextWithoutMarks( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bCutDecimalPoint = false ) const;
  1141. virtual void _GetTextWithMarks( CExtSafeString & strText, INT & nStart, INT & nEnd, bool bInsertNegSign = false ) const;
  1142. virtual CExtSafeString Behavior_GetValidText( bool bSetSel = false ) const;
  1143. virtual void Behavior_OnChar( UINT uChar, UINT nRepCnt, UINT nFlags );
  1144. virtual CExtSafeString _GetNumericText( const CExtSafeString & strText, bool bUseMathSymbols = false ) const;
  1145. virtual CExtSafeString _GetDoubleText( long double lfValue, bool bTrimTrailingZeros = true ) const;
  1146. virtual void _AdjustWithinRange();
  1147. public:
  1148. virtual void _Rich_OnDraw();
  1149. protected:
  1150. //{{AFX_MSG(CExtEditSystemCurrency)
  1151. //}}AFX_MSG
  1152. afx_msg void OnSettingChange( UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection );
  1153. DECLARE_MESSAGE_MAP()
  1154. }; /// class CExtEditSystemCurrency
  1155. /////////////////////////////////////////////////////////////////////////////
  1156. //{{AFX_INSERT_LOCATION}}
  1157. // Microsoft Developer Studio will insert additional declarations immediately before the previous line.
  1158. #endif // __EXT_EDIT_H