MagicEdit.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:6k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // MagicRichEdit.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MagicEdit.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CMagicDlg dialog
  12. CMagicDlg::CMagicDlg(CWnd* pParent /*=NULL*/)
  13. : CDialog(CMagicDlg::IDD, pParent)
  14. {
  15. //{{AFX_DATA_INIT(CMagicDlg)
  16. // NOTE: the ClassWizard will add member initialization here
  17. //}}AFX_DATA_INIT
  18. }
  19. void CMagicDlg::SetListStrings( CStringArray & astr )
  20. {
  21. m_nMaxLength = 0;
  22. ASSERT( ::IsWindow(m_hWnd) );
  23. if( ::IsWindow( m_hWnd ) )
  24. {
  25. for( int i=0; i<astr.GetSize(); i++ )
  26. {
  27. m_listMagic.AddString( astr[i] );
  28. if( astr[i].GetLength() > m_nMaxLength )
  29. m_nMaxLength = astr[i].GetLength();
  30. }
  31. if( m_listMagic.GetCount() > 0 )
  32. m_listMagic.SetCurSel( 0 );
  33. }
  34. m_nMaxLength += 1;
  35. }
  36. int CMagicDlg::GetMaxLength( )
  37. {
  38. return m_nMaxLength;
  39. }
  40. void CMagicDlg::DoDataExchange(CDataExchange* pDX)
  41. {
  42. CDialog::DoDataExchange(pDX);
  43. //{{AFX_DATA_MAP(CMagicDlg)
  44. DDX_Control(pDX, IDC_XFLISTMAGIC, m_listMagic);
  45. //}}AFX_DATA_MAP
  46. }
  47. BEGIN_MESSAGE_MAP(CMagicDlg, CDialog)
  48. //{{AFX_MSG_MAP(CMagicDlg)
  49. //}}AFX_MSG_MAP
  50. END_MESSAGE_MAP()
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CMagicDlg message handlers
  53. BOOL CMagicDlg::OnInitDialog() 
  54. {
  55. CDialog::OnInitDialog();
  56. return TRUE;  // return TRUE unless you set the focus to a control
  57.               // EXCEPTION: OCX Property Pages should return FALSE
  58. }
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CMagicEdit
  61. CMagicEdit::CMagicEdit()
  62. {
  63. m_bOpen = FALSE;
  64. m_nMagicBegin = 0;
  65. }
  66. CMagicEdit::~CMagicEdit()
  67. {
  68. }
  69. void CMagicEdit::SetListStrings( CStringArray & astr )
  70. {
  71. if( !::IsWindow( m_dlgMagic.m_hWnd ) )
  72. {
  73. m_dlgMagic.Create( CMagicDlg::IDD, NULL );
  74. HideMagicDialog();
  75. }
  76. m_dlgMagic.SetListStrings( astr );
  77. }
  78. BEGIN_MESSAGE_MAP(CMagicEdit, CEdit)
  79. //{{AFX_MSG_MAP(CMagicEdit)
  80. ON_WM_CHAR()
  81. ON_WM_KEYDOWN()
  82. //}}AFX_MSG_MAP
  83. END_MESSAGE_MAP()
  84. /////////////////////////////////////////////////////////////////////////////
  85. // CMagicEdit message handlers
  86. void CMagicEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
  87. {
  88. if( m_bOpen )
  89. {
  90. if( VK_RETURN == nChar || VK_SPACE == nChar )
  91. {
  92. int nCurPos;
  93. nCurPos = m_dlgMagic.m_listMagic.GetCurSel();
  94. if( LB_ERR != nCurPos )
  95. {
  96. CString strWord;
  97. m_dlgMagic.m_listMagic.GetText( nCurPos, strWord );
  98. SetSel( -1, 0 );
  99. CPoint pt = GetCaretPos( );
  100. int nCurChar = CharFromPos( pt );
  101. WORD nIndex = LOWORD( nCurChar );
  102. WORD nLine = HIWORD( nCurChar );
  103. if( nIndex >= m_nMagicBegin )
  104. SetSel( m_nMagicBegin, nIndex );
  105. ReplaceSel( strWord, TRUE);
  106. if( VK_SPACE == nChar )
  107. CEdit::OnChar(nChar, nRepCnt, nFlags);
  108. }
  109. HideMagicDialog();
  110. return;
  111. }
  112. else if( isalpha(nChar) || ('_' == nChar) )
  113. {
  114. m_strSearch += (unsigned char)nChar;
  115. int nFind = m_dlgMagic.m_listMagic.FindString( -1, m_strSearch );
  116. m_dlgMagic.m_listMagic.SetCurSel( nFind );
  117. if( m_strSearch.GetLength() > m_dlgMagic.GetMaxLength() )
  118. HideMagicDialog( );
  119. }
  120. else if( VK_BACK == nChar && m_strSearch.GetLength() > 1 )
  121. {
  122. m_strSearch = m_strSearch.Left( m_strSearch.GetLength() -1 );
  123. int nFind = m_dlgMagic.m_listMagic.FindString( -1, m_strSearch );
  124. m_dlgMagic.m_listMagic.SetCurSel( nFind );
  125. }
  126. else if( VK_ESCAPE == nChar )
  127. {
  128. HideMagicDialog();
  129. return;
  130. }
  131. }
  132. else
  133. {
  134. if( ':' == nChar )
  135. {
  136. CPoint pt = GetCaretPos( );
  137. int nCurChar = CharFromPos( pt );
  138. WORD nIndex = LOWORD( nCurChar );
  139. WORD nLine = HIWORD( nCurChar );
  140. CString strText;
  141. GetWindowText( strText );
  142. if( nIndex > 0 && nIndex-1 < strText.GetLength() && strText[nIndex-1] == ':' )
  143. {
  144. m_nMagicBegin = nIndex+1;
  145. CEdit::OnChar(nChar, nRepCnt, nFlags);
  146. ShowMagicDialog();
  147. SetFocus( );
  148. return;
  149. }
  150. }
  151. }
  152. CEdit::OnChar(nChar, nRepCnt, nFlags);
  153. }
  154. void CMagicEdit::ShowMagicDialog( )
  155. {
  156. if( !::IsWindow( m_dlgMagic.m_hWnd ) )
  157. {
  158. m_dlgMagic.Create( CMagicDlg::IDD, NULL );
  159. }
  160. CPoint pt = GetCaretPos( );
  161. ClientToScreen( &pt );
  162. CFont * pFont = GetFont( );
  163. LOGFONT logfont;
  164. if( pFont && pFont->GetLogFont( &logfont ) && 0 != logfont.lfHeight )
  165. pt.y += abs(logfont.lfHeight);
  166. else
  167. pt.y += 12;
  168. m_dlgMagic.SetWindowPos( &wndTopMost, pt.x, pt.y, 0, 0, 
  169. SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE );
  170. SetFocus();
  171. m_bOpen = TRUE;
  172. }
  173. void CMagicEdit::HideMagicDialog( )
  174. {
  175. if( ::IsWindow( m_dlgMagic.m_hWnd ) )
  176. {
  177. m_dlgMagic.ShowWindow( SW_HIDE );
  178. m_dlgMagic.m_listMagic.SetCurSel( 0 );
  179. m_bOpen = FALSE;
  180. m_strSearch = "";
  181. }
  182. }
  183. void CMagicEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  184. {
  185. if( m_bOpen )
  186. {
  187. int nCurPos;
  188. nCurPos = m_dlgMagic.m_listMagic.GetCurSel();
  189. switch( nChar )
  190. {
  191. case VK_UP:
  192. case VK_DOWN:
  193. case VK_NEXT:
  194. case VK_PRIOR:
  195. if( LB_ERR != nCurPos )
  196. {
  197. if( VK_UP == nChar )
  198. nCurPos--;
  199. else if( VK_DOWN == nChar )
  200. nCurPos++;
  201. else if( VK_NEXT == nChar )
  202. nCurPos += 8;
  203. else if( VK_PRIOR == nChar )
  204. nCurPos -= 8;
  205. int nCount = m_dlgMagic.m_listMagic.GetCount();
  206. if( nCurPos < 0 )
  207. nCurPos = 0;
  208. else if ( nCurPos >= nCount )
  209. nCurPos = nCount - 1;
  210. m_dlgMagic.m_listMagic.SetCurSel( nCurPos );
  211. }
  212. else
  213. {
  214. int nCount = m_dlgMagic.m_listMagic.GetCount();
  215. if( nCount > 0 )
  216. m_dlgMagic.m_listMagic.SetCurSel( 0 );
  217. }
  218. return;
  219. case VK_ESCAPE:
  220. HideMagicDialog();
  221. return;
  222. case VK_LEFT:
  223. case VK_RIGHT:
  224. case VK_HOME:
  225. case VK_END:
  226. HideMagicDialog();
  227. break;
  228. }
  229. }
  230. CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
  231. }
  232. BOOL CMagicEdit::PreTranslateMessage(MSG* pMsg) 
  233. {
  234. // TODO: Add your specialized code here and/or call the base class
  235. if( WM_KEYFIRST == pMsg->message
  236. || WM_KEYDOWN == pMsg->message
  237. || WM_KEYUP == pMsg->message
  238. || WM_CHAR == pMsg->message
  239. || WM_DEADCHAR == pMsg->message
  240. || WM_SYSKEYDOWN == pMsg->message
  241. || WM_SYSKEYUP == pMsg->message
  242. || WM_SYSCHAR == pMsg->message
  243. || WM_SYSDEADCHAR == pMsg->message
  244. || WM_KEYLAST == pMsg->message )
  245. {
  246. if( VK_ESCAPE == pMsg->wParam && m_bOpen )
  247. {
  248. HideMagicDialog( );
  249. return TRUE;
  250. }
  251. }
  252. return CEdit::PreTranslateMessage(pMsg);
  253. }