GShiEdit.cpp
上传用户:wenjimin
上传日期:2014-08-12
资源大小:111k
文件大小:13k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // GShiEdit.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyStock.h"
  5. #include "GShiEdit.h"
  6. #include "InstFunDlg.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CGShiEdit dialog
  14. CGShiEdit::CGShiEdit(CWnd* pParent /*=NULL*/)
  15. : CDialog(CGShiEdit::IDD, pParent)
  16. {
  17. //{{AFX_DATA_INIT(CGShiEdit)
  18. m_passw = FALSE;
  19. //}}AFX_DATA_INIT
  20. }
  21. void CGShiEdit::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialog::DoDataExchange(pDX);
  24. //{{AFX_DATA_MAP(CGShiEdit)
  25. DDX_Control(pDX, IDC_EDIT2, m_edit2);
  26. DDX_Control(pDX, IDC_EDIT1, m_edit1);
  27. DDX_Control(pDX, IDC_RICHEDIT1, m_RichEdit);
  28. DDX_Check(pDX, IDC_CHECK1, m_passw);
  29. //}}AFX_DATA_MAP
  30. }
  31. BEGIN_MESSAGE_MAP(CGShiEdit, CDialog)
  32. //{{AFX_MSG_MAP(CGShiEdit)
  33. ON_WM_SIZE()
  34. ON_WM_CREATE()
  35. ON_EN_CHANGE(IDC_RICHEDIT1, OnChangeRichedit)
  36. ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
  37. ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
  38. //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CGShiEdit message handlers
  42. static CString/*LPCTSTR*/ szKeywords = " Program Const Var Procedure Function "//程序、函数
  43. "DATE DAY HOUR MINUTE MONTH TIME WEEKDAY YEAR "//时间
  44. "ABS BETWEEN CROSS LONGCROSS MAX MIN MOD NOT RANGE REVERSE SGN "//算术函数
  45. "BACKSET BARSCOUNT BARSLAST BARSSINCE COUNT DMA EMA FILTER HHV HHVBARS LLV LLVBARS MA REF SMA SUM SUMBARS "//引用函数
  46. "IF ISDOWN ISEQUAL ISUP "//逻辑函数
  47. "ACOS ASIN ATAN CEILING COS EXP FLOOP INTPART LN LOG POW SIN SQRT TAN "//数学函数
  48. "AVEDEV DEVSQ FORCAST SLOPE STD STDP VAR VARP "//统计函数
  49. "COST PEAK PEAKBARS SAR SARTURN TROUGH TROUGHBARS WINNER ZIG "//指标函数
  50. "OPEN HIGH LOW CLOSE O H L C AMOUNT VOL "//行情函数  
  51. "Integer Real Char Array Record Begin End While Repeat For Case Print "
  52. "Read If Until Then Else To DownTo Step Do "//语句
  53. "And Mod Div Not Or ";//关系运算符
  54. static LPCTSTR szConstants = " MAXINT ";
  55. BOOL CGShiEdit::OnInitDialog() 
  56. {
  57. CDialog::OnInitDialog();
  58. m_passw=true;
  59. if(m_passw)
  60. {
  61. m_edit2.SetReadOnly();
  62. }
  63. else
  64. {
  65. m_edit2.SetReadOnly(FALSE);
  66. }
  67. PARAFORMAT pf;//这个结构包含RichEdit的段落格式信息
  68. pf.cbSize = sizeof(PARAFORMAT);
  69. pf.dwMask = PFM_TABSTOPS ;//可以有几个值,中间用||连接
  70. pf.cTabCount = MAX_TAB_STOPS; //
  71. for( int itab = 0 ; itab < pf.cTabCount  ; itab++ )
  72. pf.rgxTabs[itab] = (itab + 1) * 1440/5 ;
  73. m_RichEdit.SetParaFormat( pf );//设置段落格式化属性
  74. CHARFORMAT cfDefault;//这个结构包含字符的格式化信息
  75. cfDefault.cbSize = sizeof(cfDefault);
  76. cfDefault.dwEffects = CFE_PROTECTED; 
  77. cfDefault.dwMask = CFM_BOLD | CFM_FACE | CFM_SIZE | CFM_CHARSET | CFM_PROTECTED;
  78. cfDefault.yHeight = 220;
  79. cfDefault.bCharSet = /*0xEE*/ANSI_CHARSET; 
  80. strcpy(cfDefault.szFaceName, _T("Courier New"));//设置字体的有关属性
  81. m_RichEdit.SetDefaultCharFormat(cfDefault);//设置字体的格式化属性
  82. //GetRichEditCtrl().SetEventMask(ENM_CHANGE | ENM_SELCHANGE | ENM_PROTECTED);//允许产生消息
  83.    
  84. m_chComment = 1;
  85. m_chComment = _T('/');
  86. m_chComment2 =_T('/');
  87. m_strComment=_T("rem");
  88. m_bCaseSensitive = FALSE;
  89. m_bChangeCase = TRUE;
  90. //SetStringQuotes(_T("""));
  91. m_strStringQuotes = _T(""");//转义序列,表示双引号
  92. m_icKeyword.clrColor =RGB(0,0,255);
  93. m_icKeyword.bBold = FALSE;
  94. m_icNumber.clrColor = RGB(255,0,255);
  95. m_icNumber.bBold = FALSE;
  96. m_icComment.clrColor = RGB(0,128,0);
  97. m_icComment.bBold =FALSE ;
  98. m_icConstant.clrColor =RGB(0,0,0);
  99. m_icConstant.bBold =TRUE;
  100. m_icString.clrColor = RGB(255,128,255);
  101. m_icString.bBold =FALSE ;
  102. // SetKeywordColor(RGB(0,0,255), FALSE);
  103. // SetConstantColor(RGB(0,0,0), TRUE);
  104. // SetCommentColor(RGB(0,128,0), FALSE);
  105. // SetNumberColor(RGB(255,0,255), FALSE);
  106. // SetStringColor(RGB(255,128,255), FALSE);
  107. m_RichEdit.SetEventMask(ENM_CHANGE|ENM_SELCHANGE|ENM_PROTECTED);
  108. m_bInForcedChange = FALSE;
  109. //m_changeType = ctUndo;
  110. m_crOldSel.cpMin = m_crOldSel.cpMax = 0;
  111. m_strKeywords = m_strKeywords + szKeywords;
  112. int bbb=m_strKeywords.GetLength();
  113. m_strKeywordsLower = m_strKeywords;
  114. //if (!m_bCaseSensitive)
  115. m_strKeywordsLower.MakeLower();//变为小写
  116.     int aaa=m_strKeywordsLower.GetLength();
  117. m_strConstants = m_strConstants + szConstants;
  118.     m_strConstantsLower = m_strConstants;//m_strConstants和m_strConstantsLower都是字符串变量
  119.     //if (!m_bCaseSensitive)//m_bCaseSensitive是布尔型变量
  120. m_strConstantsLower.MakeLower();//变为小写
  121. //m_RichEdit.SetWindowText(m_strKeywordsLower);
  122. return TRUE;  // return TRUE unless you set the focus to a control
  123.               // EXCEPTION: OCX Property Pages should return FALSE
  124. }
  125. void CGShiEdit::OnSize(UINT nType, int cx, int cy) 
  126. {
  127. CDialog::OnSize(nType, cx, cy);
  128. /* if(m_isFirst==FALSE)
  129. {
  130. RECT rect;
  131. m_RichEdit.GetWindowRect(&rect);
  132. rect.bottom=cy;
  133. rect.right=cx;
  134. m_RichEdit.SetWindowPos(NULL,1,197,rect.right,rect.bottom,NULL);
  135. }
  136. m_isFirst=FALSE;*/
  137. CRect rect;
  138. if (m_RichEdit.GetSafeHwnd())
  139. {
  140. GetClientRect(&rect);
  141. rect.top += 195;
  142. rect.DeflateRect(0,0);
  143. m_RichEdit.MoveWindow(rect);
  144. }
  145. }
  146. int CGShiEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  147. {
  148. if (CDialog::OnCreate(lpCreateStruct) == -1)
  149. return -1;
  150. m_isFirst=TRUE;
  151. return 0;
  152. }
  153. void CGShiEdit::OnChangeRichedit() 
  154. {
  155. //if (m_bInForcedChange)
  156. // return;
  157. CHARRANGE crCurSel; //这个结构指定一个字串的范围
  158. m_RichEdit.GetSel(crCurSel);//得到控键中当前行中字符串的范围
  159. // switch(m_changeType)
  160. // {
  161. // case ctUndo:   // old=(?,?) -> cur=(x,y)
  162. //MessageBox("Undo");
  163. FormatTextLines(crCurSel.cpMin, crCurSel.cpMax);//其实一直就运行这一句,其他case没有编//撤销
  164. //格式化当前行
  165. // break;
  166. // default:
  167. // FormatAll();
  168. // FormatTextRange(0, GetTextLength());//调用函数
  169. // break;
  170. // }
  171. //undo action does not call OnProtected, so make it default
  172. //m_changeType = ctUndo;
  173. }
  174. void CGShiEdit::FormatTextLines(int nLineStart, int nLineEnd)
  175. {
  176. long nStart = m_RichEdit.LineIndex(m_RichEdit.LineFromChar(nLineStart));
  177. long nEnd = m_RichEdit.LineIndex(m_RichEdit.LineFromChar(nLineEnd));
  178. nEnd += m_RichEdit.LineLength(nLineEnd);
  179. FormatTextRange(nStart, nEnd);//格式化当前行,看不出闪烁
  180. //FormatTextRange(0, GetTextLength());//格式化全部,会有更新时的闪烁
  181. //都是从头至尾对每个字符处理
  182. }
  183. void CGShiEdit::FormatTextRange(int nStart, int nEnd)
  184. {
  185. if (nStart >= nEnd)
  186. return;
  187. m_bInForcedChange = TRUE;
  188. CHARRANGE crOldSel;//这个结构指定一个Richedit中的字符串的范围
  189. m_RichEdit.GetSel(crOldSel);//返回范围
  190. m_RichEdit.LockWindowUpdate();//锁窗口
  191. m_RichEdit.HideSelection(TRUE, FALSE);//隐藏选择
  192. //参数1表示隐藏或显示
  193. //参数2表示这个改变是否是永久性的
  194. TCHAR *pBuffer = NULL;//定义一个字符缓冲区的指针
  195. try //异常捕获
  196. {
  197. m_RichEdit.SetSel(nStart, nEnd);//设置选择范围
  198. pBuffer = new TCHAR[nEnd - nStart + 1];//创建缓冲区
  199. long nLen = m_RichEdit.GetSelText(pBuffer);//拷贝一个副本到缓冲区,但不包括终止符
  200.                     //返回值是拷贝的大小--缓冲区的大小
  201. ASSERT(nLen <= nEnd - nStart);
  202. pBuffer[nLen] = 0;//填加终止符
  203. TCHAR *pStart, *pPtr;//定义指针
  204. pStart = pPtr = pBuffer;//都指向缓冲区的首地址
  205. TCHAR* pSymbolStart = NULL;//定义指针
  206. SymbolColor ic;//颜色结构变量
  207. while (*pPtr != 0)//从pBuffer的开始一直到尾
  208. {
  209. TCHAR ch = *pPtr;//因为pPtr开始是指向首地址的
  210. //所以ch第一次等于第一个字符
  211.             
  212. if (ch == m_chComment && (m_chComment2 == 0 || pPtr[1] == m_chComment2))
  213.             //如果ch='/'或者第二个字符='/'-------表示这一行是注释
  214. {
  215. pSymbolStart = pPtr;//保存开始地址
  216. do
  217. {
  218. ch = *(++pPtr);//赋值没有什么意义,主要是把指针移到最后(得到尾地址)
  219. }
  220. while (ch != 0 && ch != 'r');
  221. ic = m_icComment;
  222. else if (IsStringQuote(ch))
  223. { // Process strings
  224. pSymbolStart = pPtr;
  225. TCHAR ch1 = ch;
  226. do
  227. {
  228. ch = *(++pPtr);
  229. }
  230. while (ch != 0 && ch != ch1 && ch != 'r');
  231. if (ch == ch1) pPtr++;
  232. ic = m_icString;
  233. else if (_istdigit(ch))//_istdigit返回一个十进制的阿拉伯数字
  234. { // Process numbers
  235. pSymbolStart = pPtr;
  236. _tcstod(pSymbolStart, &pPtr);//_tcstod()把字符串转变为double型
  237. //这一句使pPtr增加了1,因为转换完成后,函数使pPtr自动指向下一位置
  238. //所以要明白_tcstod()函数
  239. ic = m_icNumber;
  240. }
  241. else if (_istalpha(ch) || ch == '_')//_istalpha()把文字字符转变为int型数字
  242. { // Process keywords
  243. pSymbolStart = pPtr;
  244. do
  245. {
  246. ch = *(++pPtr);
  247. while (_istalnum(ch) || ch == '_');//_istalnum()把文字数字转变为数字
  248. *pPtr = 0;
  249. int cccj=IsKeyword("sum");
  250. int nPos = IsKeyword(pSymbolStart);
  251. if (nPos >= 0) 
  252. {
  253. ChangeCase(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, 
  254. m_strKeywords.Mid(nPos+1, pPtr - pSymbolStart));
  255. if (_tcsicmp(m_strComment, pSymbolStart) == 0)//_tcsicmp()完成小写字母的比较
  256. {
  257. *pPtr = ch;
  258. *pSymbolStart = m_chComment;
  259. if (pSymbolStart[1] != 0 && m_chComment2 != 0)
  260. pSymbolStart[1] = m_chComment2;
  261. pPtr = pSymbolStart;
  262. pSymbolStart = NULL;
  263. continue;
  264. }
  265. ic = m_icKeyword;
  266. }
  267. else 
  268. {
  269. nPos = IsConstant(pSymbolStart);
  270. if (nPos >= 0) 
  271. {
  272. ChangeCase(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, 
  273. m_strConstants.Mid(nPos+1, pPtr - pSymbolStart));
  274. ic = m_icConstant;
  275. }
  276. else 
  277. {
  278. pSymbolStart = NULL;
  279. }
  280. }
  281. *pPtr = ch;
  282. }
  283. else 
  284. {
  285. pPtr++;
  286. }
  287. if (pSymbolStart != NULL)
  288. {
  289. ASSERT(pSymbolStart < pPtr);
  290. //SetFormatRange(nStart + pStart - pBuffer, nStart + pSymbolStart - pBuffer, FALSE, RGB(0,0,0));
  291. SetFormatRange(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, ic.bBold, ic.clrColor);
  292. //SetFormatRange(nStart,nEnd, ic.bBold, ic.clrColor);
  293. pStart = pPtr;
  294. pSymbolStart = 0;
  295. }
  296. else if (*pPtr == 0)
  297. SetFormatRange(nStart + pStart - pBuffer, nStart + pPtr - pBuffer, FALSE, RGB(0,0,0));
  298. }//while完
  299. }//try完
  300. catch(...){}//例外处理
  301. delete [] pBuffer;
  302. m_RichEdit.SetSel(crOldSel);
  303. m_RichEdit.HideSelection(FALSE, FALSE);
  304. m_RichEdit.UnlockWindowUpdate();//开锁窗口
  305. m_bInForcedChange = FALSE;
  306. }
  307. int CGShiEdit::IsKeyword(LPCTSTR lpszSymbol)
  308. {
  309. CString strSymbol;
  310.     strSymbol.Format(" %s ", lpszSymbol);
  311. //if (!m_bCaseSensitive) //如果不是光标位置
  312. strSymbol.MakeLower();//转换为小写
  313.    return m_strKeywordsLower.Find(strSymbol,0);//如果返回-1表示没找到
  314. //   return 0;
  315. }
  316. BOOL CGShiEdit::IsStringQuote(TCHAR ch)
  317. {
  318. //如果是字符引用
  319. return (m_strStringQuotes.Find(ch) >= 0);
  320. }
  321. void CGShiEdit::ChangeCase(int nStart, int nEnd, LPCTSTR lpsz)
  322. {
  323. ASSERT((nEnd - nStart) == (int)_tcslen(lpsz));
  324. if (!m_bCaseSensitive && m_bChangeCase)
  325. {
  326. m_RichEdit.SetSel(nStart, nEnd);//获得选择内容nStart是开始位置,nEnd是结束位置
  327. m_RichEdit.ReplaceSel(lpsz);//用lpsz替换获得的选择内容
  328. }
  329. }
  330. int CGShiEdit::IsConstant(LPCTSTR lpszSymbol)
  331. {
  332. CString strSymbol;
  333. strSymbol.Format(" %s ", lpszSymbol);
  334. if (!m_bCaseSensitive) 
  335. strSymbol.MakeLower();
  336. return m_strConstantsLower.Find(strSymbol);
  337. }
  338. void CGShiEdit::SetFormatRange(int nStart, int nEnd, BOOL bBold, COLORREF clr)
  339. {
  340. //格式化一个区域,nStart--开始位置,nEnd--结尾位置,
  341. //bBoid--
  342. if (nStart >= nEnd)
  343. return;
  344. m_RichEdit.SetSel(nStart, nEnd);
  345. DWORD dwEffects =(bBold?CFE_BOLD:0);//三目运算,CFE_BOLD是粗体
  346.     //这一句表示bBold是真,括号内得值就是CFF_BOLD,否则是0
  347. //也就是bBold是真,dwEffects就是粗体,否则不是粗体
  348. CHARFORMAT cfm;//字符格式的结构
  349. cfm.cbSize = sizeof(cfm);
  350.     m_RichEdit.GetSelectionCharFormat(cfm);
  351. if ((cfm.dwMask & CFM_COLOR)  && cfm.crTextColor == clr && 
  352. (cfm.dwMask & CFM_BOLD) && (cfm.dwEffects & CFE_BOLD) == dwEffects)
  353. return;
  354. cfm.dwEffects = dwEffects;//字体风格 如:粗体、斜体、下画线等
  355. cfm.crTextColor = clr;//设置字符颜色
  356. cfm.dwMask = CFM_BOLD | CFM_COLOR;//粗体、颜色属性有效
  357. m_RichEdit.SetSelectionCharFormat(cfm);//把字符属性给选择的字符
  358. }
  359. void CGShiEdit::OnButton7() 
  360. {
  361. CHARRANGE cr;
  362. m_RichEdit.GetSel(cr);
  363. int kk=cr.cpMax;
  364. CString stra,str1,str2;
  365. m_RichEdit.GetWindowText(stra);
  366. int tol=strlen(stra);
  367. str1=stra.Left(kk);
  368. str2=stra.Right(tol-kk);
  369. CInstFunDlg dlg;
  370. if(dlg.DoModal()==IDOK)
  371. {
  372. CString str=dlg.str;//然后可以插入str
  373. str1=str1+str;
  374. int len=strlen(str1);
  375. cr.cpMax=len;
  376. cr.cpMin=len;
  377. str1=str1+str2;
  378. int msg=AfxMessageBox(str,/*MB_OKCANCEL*/MB_YESNO|MB_ICONINFORMATION);
  379. if(msg==IDYES) m_RichEdit.SetWindowText(str1);
  380. m_RichEdit.SetSel(cr);
  381. m_RichEdit.SetFocus();
  382. }
  383. }
  384. void CGShiEdit::OnCheck1() 
  385. {
  386. m_passw=!m_passw;
  387. if(m_passw)
  388. {
  389. m_edit2.SetReadOnly();
  390. }
  391. else
  392. {
  393. m_edit2.SetReadOnly(FALSE);
  394. }
  395. }