MainDlg.cpp
Upload User: binky88
Upload Date: 2015-05-28
Package Size: 199k
Code Size: 61k
Category:

Windows Develop

Development Platform:

Visual C++

  1. // MainDlg.cpp : implementation of the CMainDlg class
  2. //
  3. /////////////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "resource.h"
  6. #include "MainDlg.h"
  7. #include "static_function.h"
  8. #include "wizard.h"
  9. #define   DRAG_DELAY   60
  10. LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  11. {
  12. // center the dialog on the screen
  13. CenterWindow();
  14. // set icons
  15. HICON hIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
  16. IMAGE_ICON, ::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON), LR_DEFAULTCOLOR);
  17. SetIcon(hIcon, TRUE);
  18. HICON hIconSmall = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME), 
  19. IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
  20. SetIcon(hIconSmall, FALSE);
  21. //  TCHAR szWindowName[255] = {0};
  22. //  LoadString(NULL, GetLangString(LS_WINDOWTITLE), szWindowName, 255);
  23. //  SetWindowText(szWindowName);
  24. m_bDragging = false;
  25. m_wndTree.SubclassWindow(GetDlgItem(IDC_RAWCODE_TREE));
  26. m_wndBlogLink.SubclassWindow(GetDlgItem(IDC_BLOG));
  27. m_wndBlogLink.SetHyperLink (_T("http://mask911.net/"));
  28. m_wndPCLink.SubclassWindow(GetDlgItem(IDC_PSPCHINA));
  29. m_wndPCLink.SetHyperLink (_T("http://bbs.pspchina.net/"));
  30. m_treeRawCode = CTreeViewCtrlEx(GetDlgItem(IDC_RAWCODE_TREE));
  31. m_image.Create(IDB_TREEIMAGE, 16, 1, RGB(255,255,255));
  32. m_treeRawCode.SetImageList(m_image.m_hImageList, TVSIL_NORMAL);
  33. m_hRoot = NULL;
  34. m_TimerTicks = 0;
  35. m_nOldY = -1;
  36. m_nClassCount = 0;
  37. m_nCodeCount = 0;
  38. m_bShouldTrigger = TRUE;
  39. SetDlgItemText(IDC_CLASS_COUNT, _T("Class Number: 0/50"));
  40. SetDlgItemText(IDC_CODE_COUNT, _T("Code Number: 0/500"));
  41. RegisterHotKey(m_treeRawCode.m_hWnd, ID_ACCELERATOR_MOVEDOWN, MOD_CONTROL, VK_DOWN);
  42. RegisterHotKey(m_treeRawCode.m_hWnd, ID_ACCELERATOR_MOVEUP, MOD_CONTROL, VK_UP);
  43. //  m_tooltip.Create(m_treeRawCode.m_hWnd);
  44. // // m_tooltip.Activate(TRUE);
  45. // // m_tooltip.AddTool(GetDlgItem(IDC_RAWCODE_TREE), _T("Tree Tool Tip"));
  46. //  m_tooltip.SetMaxTipWidth(0);
  47. // 
  48. //  m_ti.cbSize = sizeof(m_ti);
  49. //  m_ti.uFlags = TTF_IDISHWND|TTF_TRACK|TTF_ABSOLUTE|TTF_TRANSPARENT;
  50. //  m_ti.hwnd = m_treeRawCode.m_hWnd;
  51. //  m_ti.hinst = NULL;
  52. //  m_ti.uId = (UINT)m_treeRawCode.m_hWnd;
  53. //  m_ti.lpszText = LPSTR_TEXTCALLBACK;
  54. //  m_ti.rect.left = 0; 
  55. //  m_ti.rect.top = 0;
  56. //  m_ti.rect.right = 0;
  57. //  m_ti.rect.bottom = 0;
  58. // 
  59. //  m_tooltip.AddTool(&m_ti);
  60. // // m_tooltip.SendMessage(TTM_ADDTOOL, 0, (LPARAM)&m_ti);
  61. return TRUE;
  62. }
  63. LRESULT CMainDlg::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
  64. {
  65. // TODO: Add validation code 
  66. HWND hFocus = GetFocus();
  67. if(wNotifyCode == 0)
  68.   {
  69. if(GetDlgItem(IDC_FILENAME) == hFocus)
  70. {
  71. TCHAR szFileName[MAX_PATH] = {0};
  72. GetDlgItemText(IDC_FILENAME, szFileName, MAX_PATH);
  73. m_strSCMFile = SCM_String(szFileName);
  74. if(m_strSCMFile.length() > 0 && (GetFileAttributes(m_strSCMFile.c_str()) != INVALID_FILE_ATTRIBUTES))
  75. {
  76. ClearData();
  77. LoadFile(m_strSCMFile.c_str());
  78. ::SetFocus(m_treeRawCode.m_hWnd);
  79. m_treeRawCode.SelectItem(m_hRoot);
  80. }
  81. }
  82. else if((m_treeRawCode.GetEditControl()).m_hWnd == hFocus)
  83. {
  84. m_treeRawCode.EndEditLabelNow(FALSE);
  85. }
  86. else if(m_treeRawCode.m_hWnd == hFocus)
  87. {
  88. m_treeRawCode.EditLabel(m_treeRawCode.GetSelectedItem());
  89. }
  90.   }
  91. return 0;
  92. }
  93. LRESULT CMainDlg::OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/)
  94. {
  95. HWND hFocus = GetFocus();
  96. if((m_treeRawCode.GetEditControl()).m_hWnd == hFocus)
  97. {
  98. m_treeRawCode.EndEditLabelNow(TRUE);
  99. }
  100. else if(m_treeRawCode.m_hWnd == hFocus)
  101. {
  102. if(m_bDragging)
  103. {
  104. m_bDragging = FALSE;
  105. CImageList::DragLeave(m_treeRawCode.m_hWnd);
  106. CImageList::EndDrag();
  107. m_treeRawCode.SelectDropTarget(NULL);
  108. KillTimer(m_nScrollTimerID);
  109. RECT rect;
  110. m_treeRawCode.GetClientRect(&rect);
  111. m_treeRawCode.InvalidateRect(&rect, TRUE);
  112. m_treeRawCode.UpdateWindow();
  113. INPUT input;
  114. input.type = INPUT_MOUSE;
  115. input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
  116. input.mi.time = 0;
  117. SendInput(1, &input, sizeof(input));
  118. }
  119. }
  120. return 0;
  121. }
  122. LRESULT CMainDlg::OnClose(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  123. {
  124. // TODO: Add your message handler code here and/or call default
  125. EndDialog(wParam);
  126. return 0;
  127. }
  128. LRESULT CMainDlg::OnSelectfile(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  129. {
  130. // TODO: Add your control notification handler code here
  131. OPENFILENAME ofn;
  132. TCHAR szFile[MAX_PATH] = {0};
  133. TCHAR szInitalDir[MAX_PATH] = {0};
  134. GetDlgItemText(IDC_FILENAME, szInitalDir, MAX_PATH);
  135. ZeroMemory(&ofn, sizeof(OPENFILENAME));
  136. ofn.lStructSize = sizeof(ofn);
  137. ofn.hwndOwner = m_hWnd;
  138. ofn.lpstrFile = szFile;
  139. ofn.lpstrFile[0] = _T('');
  140. ofn.nMaxFile = sizeof(szFile);
  141. ofn.lpstrFilter = _T("SCEP CheatMaster 0.7 Raw Code File*.scm");
  142. ofn.nFilterIndex = 1;
  143. ofn.lpstrTitle = _T("Please Open a SCEP CheatMaster 0.7 Raw Code File");
  144. ofn.lpstrInitialDir = szInitalDir;
  145. ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  146. if(TRUE == GetOpenFileName(&ofn))
  147. {
  148. m_strSCMFile = SCM_String(ofn.lpstrFile);
  149. SetDlgItemText(IDC_FILENAME, ofn.lpstrFile);
  150. ClearData();
  151. LoadFile(m_strSCMFile.c_str());
  152. ::SetFocus(m_treeRawCode.m_hWnd);
  153. m_treeRawCode.SelectItem(m_hRoot);
  154. }
  155. return 0;
  156. }
  157. LRESULT CMainDlg::OnOpenfile(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  158. {
  159. // TODO: Add your control notification handler code here
  160. ClearData();
  161. LoadFile(m_strSCMFile.c_str());
  162. ::SetFocus(m_treeRawCode.m_hWnd);
  163. m_treeRawCode.SelectItem(m_hRoot);
  164. return 0;
  165. }
  166. bool CMainDlg::LoadFile(LPCTSTR lpszFileName)
  167. {
  168. if(GetFileAttributes(lpszFileName) == INVALID_FILE_ATTRIBUTES)
  169. {
  170. MessageBox(_T("Please Select an exist SCEP CheatMaster 0.7 Raw Code File!"), _T("Error"), MB_OK|MB_TOPMOST);
  171. ClearData();
  172. return false;
  173. }
  174. HANDLE hRawCodeFile = CreateFile(lpszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, NULL);
  175. if(hRawCodeFile == INVALID_HANDLE_VALUE)
  176. {
  177. MessageBox(_T("Please Select an exist SCEP CheatMaster 0.7 Raw Code File!"), _T("Error"), MB_OK|MB_TOPMOST);
  178. ClearData();
  179. return false;
  180. }
  181. // FileName
  182. HTREEITEM hTreeItem;
  183. if(m_hRoot == NULL)
  184. m_hRoot = InsertTreeItem(lpszFileName, TVI_ROOT, TVI_ROOT);
  185. else
  186. m_treeRawCode.SetItemText(m_hRoot, lpszFileName);
  187. AddTreeNode(m_hRoot, MAX_PATH, _T(""), _T(""), _T(""), (LPTSTR)lpszFileName, NODE_TYPE_FILENAME);
  188. char szReadData[50] = {0};
  189. TCHAR szDisplayData[100] = {0};
  190. // ID
  191. readString(hRawCodeFile, szReadData, 50, NULL, 0x0A);
  192. ZeroMemory(szDisplayData, sizeof(szDisplayData));
  193. _tcscpy(szDisplayData, (s2ws(szReadData)).c_str());
  194. hTreeItem = InsertTreeItem(szDisplayData, m_hRoot, m_hRoot);
  195. AddTreeNode(hTreeItem, 12, _T(""), _T(""), _T("ID: "), szDisplayData, NODE_TYPE_GAMEINFO);
  196. // Name
  197. readString(hRawCodeFile, szReadData, 50, NULL, 0x0A);
  198. ZeroMemory(szDisplayData, sizeof(szDisplayData));
  199. _tcscpy(szDisplayData, (s2ws(szReadData)).c_str());
  200. hTreeItem = InsertTreeItem(szDisplayData, m_hRoot, hTreeItem);
  201. AddTreeNode(hTreeItem, 30, _T(""), _T(""), _T("NAME: "), szDisplayData, NODE_TYPE_GAMEINFO);
  202. // START
  203. readString(hRawCodeFile, szReadData, 50, "$", 0x0A);
  204. if(stricmp(szReadData, "START"))
  205. {
  206. MessageBox(_T("This is not a valid SCEP CheatMaster 0.7 Raw Code File!"), _T("Error"), MB_OK|MB_TOPMOST);
  207. ClearData();
  208. return false;
  209. }
  210. HTREEITEM hClassItem;
  211. HTREEITEM hCodeItem;
  212. HTREEITEM hMemoryItem;
  213. int nCodeNumber = 1;
  214. TCHAR szCodeNumber[5] = {0};
  215. DWORD dwReaded;
  216. do 
  217. {
  218. // ClassName
  219. if(!readString(hRawCodeFile, szReadData, 50, "$", '{'))
  220. break;
  221. hClassItem = InsertTreeItem((SCM_String(_T("Class Name: ")) + s2ws(szReadData)).c_str(), m_hRoot, hTreeItem);
  222. AddTreeNode(hClassItem, 19, _T(""), _T(""), _T("Class Name: "), (LPTSTR)s2ws(szReadData).c_str(), NODE_TYPE_CLASSNAME);
  223. hCodeItem = hClassItem;
  224. nCodeNumber = 1;
  225. do 
  226. {
  227. // CodeItem
  228. _itot(nCodeNumber++, szCodeNumber, 10);
  229. ZeroMemory(szDisplayData, sizeof(szDisplayData));
  230. _tcscpy(szDisplayData, (SCM_String(_T("Code ")) + SCM_String(szCodeNumber)).c_str());
  231. hCodeItem = InsertTreeItem(szDisplayData, hClassItem, hCodeItem);
  232. AddTreeNode(hCodeItem, MAX_PATH, _T(""), _T(""), _T("Code "), szCodeNumber, NODE_TYPE_RAWCODENUMBER);
  233. // CodeName
  234. readString(hRawCodeFile, szReadData, 50, "$", ' ');
  235. if (!strcmp(szReadData, " "))
  236. strcpy(szReadData, RAWCODENAMEEMPTY);
  237. hTreeItem = InsertTreeItem((SCM_String(_T("Code Name: ")) + s2ws(szReadData)).c_str(), hCodeItem, hCodeItem);
  238. AddTreeNode(hTreeItem, 9, _T(""), _T(" "), _T("Code Name: "), (LPTSTR)s2ws(szReadData).c_str(), NODE_TYPE_RAWCODENAME);
  239. // ItemStat
  240. readString(hRawCodeFile, szReadData, 50, "$", ' ');
  241. ZeroMemory(szDisplayData, sizeof(szDisplayData));
  242. switch(atoi(szReadData))
  243. {
  244. case 0:
  245. _tcscpy(szDisplayData, _T("Code Stat: Disable"));
  246. break;
  247. case 1:
  248. _tcscpy(szDisplayData, _T("Code Stat: Enable"));
  249. break;
  250. case 2:
  251. _tcscpy(szDisplayData, _T("Code Stat: Lock"));
  252.     break;
  253. default:
  254. _tcscpy(szDisplayData, _T("Code Stat: Unknown"));
  255.     break;
  256. }
  257. hTreeItem = InsertTreeItem(szDisplayData, hCodeItem, hTreeItem);
  258. AddTreeNode(hTreeItem, 1, _T("012"), _T(""), _T("Code Stat: "), (LPTSTR)s2ws(szReadData).c_str(), NODE_TYPE_RAWCODESTAT);
  259. // MemTitle
  260. ZeroMemory(szDisplayData, sizeof(szDisplayData));
  261. _tcscpy(szDisplayData, _T("Memory"));
  262. hMemoryItem = InsertTreeItem(szDisplayData, hCodeItem, hTreeItem);
  263. AddTreeNode(hMemoryItem, MAX_PATH, _T(""), _T(""), _T(""), szDisplayData, NODE_TYPE_RAWCODEMEMORY);
  264. // Mem1
  265. readString(hRawCodeFile, szReadData, 50, "$(", ' ');
  266. hTreeItem = InsertTreeItem((SCM_String(_T("Memory1: 0x")) + s2ws(szReadData)).c_str(), hMemoryItem, hMemoryItem);
  267. AddTreeNode(hTreeItem, 8, _T("0123456789ABCDEFabcdef"), _T(""), _T("Memory1: 0x"), (LPTSTR)s2ws(szReadData).c_str(), NODE_TYPE_RAWCODEMEMORYN);
  268. // Mem2
  269. readString(hRawCodeFile, szReadData, 50, NULL, ' ');
  270. hTreeItem = InsertTreeItem((SCM_String(_T("Memory2: 0x")) + s2ws(szReadData)).c_str(), hMemoryItem, hTreeItem);
  271. AddTreeNode(hTreeItem, 8, _T("0123456789ABCDEFabcdef"), _T(""), _T("Memory2: 0x"), (LPTSTR)s2ws(szReadData).c_str(), NODE_TYPE_RAWCODEMEMORYN);
  272. // Mem3
  273. readString(hRawCodeFile, szReadData, 50, NULL, ' ');
  274. hTreeItem = InsertTreeItem((SCM_String(_T("Memory3: 0x")) + s2ws(szReadData)).c_str(), hMemoryItem, hTreeItem);
  275. AddTreeNode(hTreeItem, 8, _T("0123456789ABCDEFabcdef"), _T(""), _T("Memory3: 0x"), (LPTSTR)s2ws(szReadData).c_str(), NODE_TYPE_RAWCODEMEMORYN);
  276. // Mem4
  277. readString(hRawCodeFile, szReadData, 50, NULL, ')');
  278. hTreeItem = InsertTreeItem((SCM_String(_T("Memory4: 0x")) + s2ws(szReadData)).c_str(), hMemoryItem, hTreeItem);
  279. AddTreeNode(hTreeItem, 8, _T("0123456789ABCDEFabcdef"), _T(""), _T("Memory4: 0x"), (LPTSTR)s2ws(szReadData).c_str(), NODE_TYPE_RAWCODEMEMORYN);
  280. ReadFile(hRawCodeFile, szReadData, 1, &dwReaded, NULL);
  281. if(szReadData[0] == '}')
  282. break;
  283. } while(1);
  284. } while(1);
  285. m_treeRawCode.Expand(m_hRoot, TVE_EXPAND);
  286. CloseHandle(hRawCodeFile);
  287. UpdateClassCodeCount();
  288. return true;
  289. }
  290. void CMainDlg::ClearData()
  291. {
  292. if(m_hRoot != NULL && m_treeRawCode.ItemHasChildren(m_hRoot))
  293. {
  294. HTREEITEM hNextItem;
  295. HTREEITEM hChildItem = m_treeRawCode.GetChildItem(m_hRoot);
  296. while (hChildItem != NULL)
  297. {
  298. hNextItem = m_treeRawCode.GetNextItem(hChildItem, TVGN_NEXT);
  299. m_treeRawCode.DeleteItem(hChildItem);
  300. hChildItem = hNextItem;
  301. }
  302. }
  303. if(m_vTreeNode.size() > 0)
  304. {
  305. m_vTreeNode.clear();
  306. }
  307. m_nClassCount = 0;
  308. m_nCodeCount = 0;
  309. UpdateClassCodeCount();
  310. }
  311. LRESULT CMainDlg::OnKillfocusFilename(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  312. {
  313. // TODO: Add your control notification handler code here
  314. TCHAR szFileName[MAX_PATH] = {0};
  315. GetDlgItemText(IDC_FILENAME, szFileName, MAX_PATH);
  316. m_strSCMFile = SCM_String(szFileName);
  317. return 0;
  318. }
  319. HTREEITEM CMainDlg::InsertTreeItem(LPCTSTR lpszText, HTREEITEM hParent, HTREEITEM hAfter)
  320. {
  321. TVITEM tvi = { 0 };             // TreeView Item
  322. TVINSERTSTRUCT tvins = { 0 };   // TreeView Insert Struct
  323. tvi.mask = TVIF_TEXT;
  324. tvi.pszText = (LPTSTR)lpszText;
  325. tvi.cchTextMax = _tcslen(lpszText);
  326. tvins.item = tvi;
  327. tvins.hParent = hParent;
  328. tvins.hInsertAfter = hAfter;
  329. return TreeView_InsertItem(m_treeRawCode.m_hWnd, &tvins);
  330. }
  331. void CMainDlg::AddTreeNode(HTREEITEM hTreeItem, int nLimitLength, LPTSTR lpszValidChars, LPTSTR lpszInvalidChars, LPTSTR lpszFront,LPTSTR lpszValue, int nType, int nPos)
  332. {
  333. TreeNode treeNode;
  334. ZeroMemory(&treeNode, sizeof(TreeNode));
  335. treeNode.hItem = hTreeItem;
  336. treeNode.nLimitLength = nLimitLength;
  337. _tcsncpy(treeNode.szValidChars, lpszValidChars, 100);
  338. _tcsncpy(treeNode.szInvalidChars, lpszInvalidChars, 100);
  339. _tcsncpy(treeNode.szFront, lpszFront, 50);
  340. _tcsncpy(treeNode.szValue, lpszValue, 50);
  341. treeNode.nType = nType;
  342. if(nType == NODE_TYPE_CLASSNAME)
  343. m_nClassCount ++;
  344. else if(nType == NODE_TYPE_RAWCODENUMBER)
  345. m_nCodeCount ++;
  346. if(nPos == -1)
  347. m_vTreeNode.push_back(treeNode);
  348. else
  349. m_vTreeNode.insert(m_vTreeNode.begin()+nPos, treeNode);
  350. }
  351. LRESULT CMainDlg::OnBeginLabelEdit(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/)
  352. {
  353. LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
  354. // TODO: Add your control notification handler code here
  355. m_nTreeNodeIndex = GetTreeNodeIndex(pTVDispInfo->item.hItem);
  356. if(m_nTreeNodeIndex != -1)
  357. {
  358. if( (m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_FILENAME) || 
  359. (m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODENUMBER) ||
  360. (m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODEMEMORY))
  361. {
  362. m_treeRawCode.EndEditLabelNow(TRUE);
  363. return 0;
  364. }
  365. if(NULL != m_vTreeNode[m_nTreeNodeIndex].szFront && 0 < _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront))
  366. {
  367. TCHAR *pDest;
  368. pDest = _tcsstr(pTVDispInfo->item.pszText, m_vTreeNode[m_nTreeNodeIndex].szFront);
  369. if (NULL != pDest && _tcslen(pDest) == _tcslen(pTVDispInfo->item.pszText))
  370. {
  371. if (m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODENAME)
  372. {
  373. if (!_tcscmp((pDest + _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront)), _T(RAWCODENAMEEMPTY)))
  374. {
  375. m_treeRawCode.GetEditControl().SetWindowText(_T(""));
  376. m_strEditControlText = SCM_String(pDest + _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront));
  377. }
  378. else
  379. {
  380. m_treeRawCode.GetEditControl().SetWindowText(pDest + _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront));
  381. m_strEditControlText = SCM_String(pDest + _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront));
  382. }
  383. }
  384. else if (m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODESTAT)
  385. {
  386.   TCHAR szStat[10] = {0};
  387.   _tcscpy(szStat, pDest + _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront));
  388.   if(!_tcscmp(szStat, _T("Disable")))
  389.   _tcscpy(szStat, _T("0"));
  390.   else if(!_tcscmp(szStat, _T("Enable")))
  391.   _tcscpy(szStat, _T("1"));
  392.   else if(!_tcscmp(szStat, _T("Lock")))
  393.   _tcscpy(szStat, _T("2"));
  394.   else if(_tcslen(szStat) == 0)
  395. _tcscpy(szStat, _T(""));
  396. else
  397.   _tcscpy(szStat, _T("3"));
  398.  
  399.   m_treeRawCode.GetEditControl().SetWindowText(szStat);
  400.   m_strEditControlText = SCM_String(szStat);
  401. //  RECT rect;
  402. //  m_treeRawCode.GetItemRect(pTVDispInfo->item.hItem, &rect, TRUE);
  403. //  hComboBox = comboBox.Create(m_treeRawCode.m_hWnd, rect, NULL, WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL);
  404. //  comboBox.AddString(_T("Disable"));
  405. //  comboBox.AddString(_T("Enable"));
  406. //  comboBox.AddString(_T("Lock"));
  407. //  comboBox.ShowDropDown();
  408. //  comboBox.SetFocus();
  409. //  ::SetWindowLong(hComboBox, GWL_WNDPROC, (LONG)ComboBoxProc);
  410. }
  411. else
  412. {
  413. m_treeRawCode.GetEditControl().SetWindowText(pDest + _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront));
  414. m_strEditControlText = SCM_String(pDest + _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront));
  415. }
  416. }
  417. else
  418. {
  419. m_strEditControlText = SCM_String(pTVDispInfo->item.pszText);
  420. }
  421. }
  422. if(m_vTreeNode[m_nTreeNodeIndex].nLimitLength != -1)
  423. m_treeRawCode.GetEditControl().LimitText(m_vTreeNode[m_nTreeNodeIndex].nLimitLength);
  424. }
  425. return 0;
  426. }
  427. LRESULT CMainDlg::OnEndLabelEdit(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/)
  428. {
  429. LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
  430. // TODO: Add your control notification handler code here
  431. if ((pTVDispInfo->item.mask | TVIF_TEXT) != pTVDispInfo->item.mask)
  432. return 0;
  433. if(m_nTreeNodeIndex != -1)
  434. {
  435. if( (m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_FILENAME) || 
  436. (m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODENUMBER) ||
  437. (m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODEMEMORY))
  438. return 0;
  439. if (NULL != m_vTreeNode[m_nTreeNodeIndex].szValidChars && 0 < _tcslen(m_vTreeNode[m_nTreeNodeIndex].szValidChars))
  440. {
  441. int nTextLen = _tcslen(pTVDispInfo->item.pszText);
  442. for (int i = 0; i < nTextLen; i++)
  443. {
  444. if(NULL == _tcschr(m_vTreeNode[m_nTreeNodeIndex].szValidChars, pTVDispInfo->item.pszText[i]))
  445. {
  446. m_treeRawCode.EditLabel(pTVDispInfo->item.hItem);
  447. if(m_vTreeNode[m_nTreeNodeIndex].nLimitLength != -1)
  448. m_treeRawCode.GetEditControl().LimitText(m_vTreeNode[m_nTreeNodeIndex].nLimitLength);
  449. m_treeRawCode.GetEditControl().SetWindowText(m_strEditControlText.c_str());
  450.   EDITBALLOONTIP ebt;
  451. ZeroMemory(&ebt, sizeof(EDITBALLOONTIP));
  452. ebt.cbStruct = sizeof(ebt);
  453. TCHAR szText[300] = _T("Your input have some invalid words, please retry!nThe valid words:"");
  454. _tcscat(szText, m_vTreeNode[m_nTreeNodeIndex].szValidChars);
  455. _tcscat(szText, _T("""));
  456. ebt.pszText = szText;
  457. m_treeRawCode.GetEditControl().ShowBalloonTip(&ebt);
  458. return 0;
  459. }
  460. }
  461. }
  462. if (NULL != m_vTreeNode[m_nTreeNodeIndex].szInvalidChars && 0 < _tcslen(m_vTreeNode[m_nTreeNodeIndex].szInvalidChars))
  463. {
  464. int nTextLen = _tcslen(m_vTreeNode[m_nTreeNodeIndex].szInvalidChars);
  465. for (int i = 0; i < nTextLen; i++)
  466. {
  467. if(NULL != _tcschr(pTVDispInfo->item.pszText, m_vTreeNode[m_nTreeNodeIndex].szInvalidChars[i]))
  468. {
  469. m_treeRawCode.EditLabel(pTVDispInfo->item.hItem);
  470. if(m_vTreeNode[m_nTreeNodeIndex].nLimitLength != -1)
  471. m_treeRawCode.GetEditControl().LimitText(m_vTreeNode[m_nTreeNodeIndex].nLimitLength);
  472. m_treeRawCode.GetEditControl().SetWindowText(m_strEditControlText.c_str());
  473. EDITBALLOONTIP ebt;
  474. ZeroMemory(&ebt, sizeof(EDITBALLOONTIP));
  475. ebt.cbStruct = sizeof(ebt);
  476. TCHAR szText[300] = _T("Your input have some invalid words, please retry!nThe invalid words:"");
  477. _tcscat(szText, m_vTreeNode[m_nTreeNodeIndex].szInvalidChars);
  478. _tcscat(szText, _T("""));
  479. ebt.pszText = szText;
  480. m_treeRawCode.GetEditControl().ShowBalloonTip(&ebt);
  481. return 0;
  482. }
  483. }
  484. }
  485. if(NULL != m_vTreeNode[m_nTreeNodeIndex].szFront && 0 < _tcslen(m_vTreeNode[m_nTreeNodeIndex].szFront))
  486. {
  487. TCHAR szText[30] = {0};
  488. if(m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODESTAT)
  489. {
  490. if(_tcslen(pTVDispInfo->item.pszText) == 0)
  491. {
  492. _tcscpy(szText, _T("Disable"));
  493. _tcscpy(pTVDispInfo->item.pszText, _T("0"));
  494. }
  495. else
  496. {
  497. switch(_ttoi(pTVDispInfo->item.pszText))
  498. {
  499. case 0:
  500. _tcscpy(szText, _T("Disable"));
  501. break;
  502. case 1:
  503. _tcscpy(szText, _T("Enable"));
  504. break;
  505. case 2:
  506. _tcscpy(szText, _T("Lock"));
  507. break;
  508. default:
  509. _tcscpy(szText, _T("Unknown"));
  510. break;
  511. }
  512. }
  513. }
  514. else if(m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODENAME)
  515. {
  516. if(_tcslen(pTVDispInfo->item.pszText) == 0)
  517. _tcscpy(szText, _T(RAWCODENAMEEMPTY));
  518. else
  519. _tcscpy(szText, pTVDispInfo->item.pszText);
  520. }
  521. else if(m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_RAWCODEMEMORYN)
  522. {
  523. int nLength = _tcslen(pTVDispInfo->item.pszText);
  524. if(nLength < 8)
  525. {
  526. ZeroMemory(szText, sizeof(szText));
  527. _tcsncpy(szText, _T("00000000"), 8-nLength);
  528. _tcscat(szText, pTVDispInfo->item.pszText);
  529. }
  530. else
  531. _tcscpy(szText, pTVDispInfo->item.pszText);
  532. }
  533. else
  534. _tcscpy(szText, pTVDispInfo->item.pszText);
  535. SCM_String strText = SCM_String(m_vTreeNode[m_nTreeNodeIndex].szFront);
  536. strText += SCM_String(szText);
  537. m_treeRawCode.SetItemText(pTVDispInfo->item.hItem, strText.c_str());
  538. }
  539. if(m_vTreeNode[m_nTreeNodeIndex].nType == NODE_TYPE_GAMEINFO)
  540. {
  541. SCM_String strText = SCM_String(m_vTreeNode[m_nTreeNodeIndex].szFront);
  542. strText += SCM_String(pTVDispInfo->item.pszText);
  543. _tcscpy(m_vTreeNode[m_nTreeNodeIndex].szValue, strText.c_str());
  544. }
  545. else
  546. {
  547. _tcscpy(m_vTreeNode[m_nTreeNodeIndex].szValue, pTVDispInfo->item.pszText);
  548. }
  549. }
  550. else
  551. m_treeRawCode.SetItemText(pTVDispInfo->item.hItem, pTVDispInfo->item.pszText);
  552. m_nTreeNodeIndex = -2;
  553. return 0;
  554. }
  555. int CMainDlg::GetTreeNodeIndex(HTREEITEM hTreeItem)
  556. {
  557. for(int i = 0; i < m_vTreeNode.size(); i++)
  558. {
  559. if(hTreeItem == m_vTreeNode[i].hItem)
  560. return i;
  561. }
  562. return -1;
  563. }
  564. //LRESULT CMainDlg::OnNMDblclkRawcodeTree(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& bHandled)
  565. void CMainDlg::OnLButtonDoubleClick_Tree(UINT nFlags, CPoint point)
  566. {
  567. // TODO: Add your control notification handler code here
  568. m_bShouldTrigger = FALSE;
  569. int n = GetTreeNodeIndex(m_treeRawCode.GetSelectedItem());
  570. if(m_vTreeNode[n].nType == NODE_TYPE_RAWCODEMEMORY)
  571. {
  572. GetMemoryInfo(n);
  573. if(m_treeRawCode.GetItemState(m_treeRawCode.GetSelectedItem(), TVIS_EXPANDED) != TVIS_EXPANDED)
  574. m_treeRawCode.Expand(m_treeRawCode.GetSelectedItem(), TVE_EXPAND);
  575. return;
  576. }
  577. SetMsgHandled(FALSE);
  578. }
  579. int CMainDlg::GetMemoryInfo(int nTreeNodeIndex)
  580. {
  581. CWizardDlg dlgWizard;
  582. int nMemoryType;
  583. switch(m_vTreeNode[nTreeNodeIndex+1].szValue[0])
  584. {
  585. case '0':
  586. case '1':
  587. case '2':
  588. nMemoryType = MEMORY_DIRECT;
  589. break;
  590. case '3':
  591. nMemoryType = MEMORY_VARIABLE;
  592. break;
  593. case '4':
  594. case '8':
  595. nMemoryType = MEMORY_COMPRESS;
  596.     break;
  597. case 'D':
  598. case 'd':
  599. case 'E':
  600. case 'e':
  601. nMemoryType = MEMORY_CONDITION;
  602.     break;
  603. case '7':
  604. nMemoryType = MEMORY_CALC;
  605. break;
  606. case '5':
  607. nMemoryType = MEMORY_COPY;
  608. break;
  609. case '6':
  610. nMemoryType = MEMORY_POINTER;
  611.     break;
  612. case 'B':
  613. case 'b':
  614. case 'C':
  615. case 'c':
  616. nMemoryType = MEMORY_STOP;
  617.     break;
  618. default:
  619. nMemoryType = MEMORY_UNKNOWN;
  620.     break;
  621. }
  622. if( nMemoryType == MEMORY_DIRECT &&
  623. !_tcsicmp(m_vTreeNode[nTreeNodeIndex+1].szValue, _T("00000000")) &&
  624. !_tcsicmp(m_vTreeNode[nTreeNodeIndex+2].szValue, _T("00000000")) &&
  625. !_tcsicmp(m_vTreeNode[nTreeNodeIndex+3].szValue, _T("00000000")) &&
  626. !_tcsicmp(m_vTreeNode[nTreeNodeIndex+4].szValue, _T("00000000")))
  627. nMemoryType = MEMORY_UNKNOWN;
  628. ParseMemoryInfo(m_vTreeNode[nTreeNodeIndex+1].szValue, m_vTreeNode[nTreeNodeIndex+2].szValue, m_vTreeNode[nTreeNodeIndex+3].szValue, 
  629. m_vTreeNode[nTreeNodeIndex+4].szValue, dlgWizard.m_pType.m_memInfo);
  630. if(IDOK == dlgWizard.DoModal())
  631. MessageBox(_T("Wizard Ok"));
  632. return 0;
  633. }
  634. LRESULT CMainDlg::OnTvnKeydownRawcodeTree(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/)
  635. {
  636. LPNMTVKEYDOWN pTVKeyDown = reinterpret_cast<LPNMTVKEYDOWN>(pNMHDR);
  637. // TODO: Add your control notification handler code here
  638. if(!m_treeRawCode.GetSelectedItem())
  639. return 0;
  640. if(pTVKeyDown->wVKey == VK_DELETE)
  641. {
  642. int nType = m_vTreeNode[GetTreeNodeIndex(m_treeRawCode.GetSelectedItem())].nType;
  643. if(nType == NODE_TYPE_FILENAME || nType == NODE_TYPE_GAMEINFO)
  644. {
  645. HTREEITEM hChildItem = m_treeRawCode.GetChildItem(m_hRoot);
  646. HTREEITEM hNextItem;
  647. while(hChildItem != NULL)
  648. {
  649. if(m_vTreeNode[GetTreeNodeIndex(hChildItem)].nType != NODE_TYPE_GAMEINFO)
  650. {
  651. hNextItem = m_treeRawCode.GetNextSiblingItem(hChildItem);
  652. DeleteItemAndChild(hChildItem);
  653. hChildItem = hNextItem;
  654. }
  655. else
  656. hChildItem = m_treeRawCode.GetNextSiblingItem(hChildItem);
  657. }
  658. }
  659. else if(nType == NODE_TYPE_CLASSNAME || nType == NODE_TYPE_RAWCODENUMBER)
  660. {
  661. DeleteItemAndChild(m_treeRawCode.GetSelectedItem());
  662. }
  663. }
  664. else if(pTVKeyDown->wVKey == VK_INSERT)
  665. {
  666. if(m_treeRawCode.GetCount() > 0)
  667. {
  668. if((m_nCodeCount >= 500) || (m_nClassCount >= 50))
  669. MessageBox(_T("One file only can contain 50 Classes and 500 Raw Codes!"));
  670. int nType = m_vTreeNode[GetTreeNodeIndex(m_treeRawCode.GetSelectedItem())].nType;
  671. if(nType == NODE_TYPE_FILENAME || nType == NODE_TYPE_GAMEINFO || nType == NODE_TYPE_CLASSNAME)
  672. {
  673. AddItem(m_treeRawCode.GetSelectedItem());
  674. }
  675. }
  676. }
  677. else if(pTVKeyDown->wVKey == VK_F2)
  678. {
  679. m_treeRawCode.EditLabel(m_treeRawCode.GetSelectedItem());
  680. }
  681. else if(pTVKeyDown->wVKey == VK_APPS)
  682. {
  683. POINT point;
  684. RECT rect;
  685. if(!m_treeRawCode.GetItemRect(m_treeRawCode.GetSelectedItem(), &rect, TRUE))
  686. return 0;
  687. point.x = rect.left + (rect.bottom - rect.top)/2;
  688. point.y = rect.top + (rect.bottom - rect.top)/2;
  689. ::ClientToScreen(m_treeRawCode.m_hWnd, &point);
  690. ShowContextMenu(point);
  691. }
  692. #if defined(_DEBUG)
  693. else if(pTVKeyDown->wVKey == VK_F5)
  694. {
  695. TCHAR szType[50] = {0};
  696. FILE *fp = _tfopen(_T("c:\tree1.txt"), _T("w"));
  697. for(int i = 0; i < m_vTreeNode.size(); i++)
  698. {
  699. switch(m_vTreeNode[i].nType)
  700. {
  701. case NODE_TYPE_FILENAME:
  702. _tcscpy(szType, _T("NODE_TYPE_FILENAMEt"));
  703. break;
  704. case NODE_TYPE_GAMEINFO:
  705. _tcscpy(szType, _T("NODE_TYPE_GAMEINFOt"));
  706. break;
  707. case NODE_TYPE_CLASSNAME:
  708. _tcscpy(szType, _T("NODE_TYPE_CLASSNAMEt"));
  709.     break;
  710. case NODE_TYPE_RAWCODENUMBER:
  711. _tcscpy(szType, _T("NODE_TYPE_RAWCODENUMBERt"));
  712.     break;
  713. case NODE_TYPE_RAWCODENAME:
  714. _tcscpy(szType, _T("NODE_TYPE_RAWCODENAMEt"));
  715. break;
  716. case NODE_TYPE_RAWCODESTAT:
  717. _tcscpy(szType, _T("NODE_TYPE_RAWCODESTATt"));
  718. break;
  719. case NODE_TYPE_RAWCODEMEMORY:
  720. _tcscpy(szType, _T("NODE_TYPE_RAWCODEMEMORYt"));
  721. break;
  722. case NODE_TYPE_RAWCODEMEMORYN:
  723. _tcscpy(szType, _T("NODE_TYPE_RAWCODEMEMORYN"));
  724. break;
  725. default:
  726.     break;
  727. }
  728. _ftprintf(fp, _T("%dt%st0x%0.8xt%s%sn"), i, szType, m_vTreeNode[i].hItem, m_vTreeNode[i].szFront, m_vTreeNode[i].szValue);
  729. }
  730. fclose(fp);
  731. }
  732. #endif
  733. return 0;
  734. }
  735. void CMainDlg::DeleteItemAndChild(HTREEITEM hItem, BOOL bMoveItem)
  736. {
  737. HTREEITEM hLastItem;
  738. if(hItem != NULL && m_treeRawCode.ItemHasChildren(hItem))
  739. {
  740. HTREEITEM hNextItem;
  741. HTREEITEM hChildItem = m_treeRawCode.GetChildItem(hItem);
  742. while (hChildItem != NULL && hChildItem != hItem)
  743. {
  744. hLastItem = hChildItem;
  745. int n = GetTreeNodeIndex(hLastItem);
  746. if(!bMoveItem)
  747. if(m_vTreeNode[n].nType == NODE_TYPE_CLASSNAME)
  748. m_nClassCount --;
  749. else if(m_vTreeNode[n].nType == NODE_TYPE_RAWCODENUMBER)
  750. m_nCodeCount --;
  751. if(n != -1)
  752. m_vTreeNode.erase(m_vTreeNode.begin() + n);
  753. hNextItem = m_treeRawCode.GetChildItem(hChildItem);
  754. if(NULL != hNextItem)
  755. {
  756. hChildItem = hNextItem;
  757. }
  758. else
  759. {
  760. hNextItem = m_treeRawCode.GetNextSiblingItem(hChildItem);
  761. if(NULL == hNextItem)
  762. hNextItem = m_treeRawCode.GetParentItem(hChildItem);
  763. m_treeRawCode.DeleteItem(hChildItem);
  764. hChildItem = hNextItem;
  765. }
  766. }
  767. }
  768. if(hItem != m_hRoot)
  769. {
  770. int n = GetTreeNodeIndex(hItem);
  771. if(!bMoveItem)
  772. if(m_vTreeNode[n].nType == NODE_TYPE_CLASSNAME)
  773. m_nClassCount --;
  774. else if(m_vTreeNode[n].nType == NODE_TYPE_RAWCODENUMBER)
  775. m_nCodeCount --;
  776. if(n != -1)
  777. m_vTreeNode.erase(m_vTreeNode.begin() + n);
  778. m_treeRawCode.DeleteItem(hItem);
  779. }
  780. if(!bMoveItem)
  781. UpdateClassCodeCount();
  782. }
  783. void CMainDlg::AddItem(HTREEITEM hTreeItem)
  784. {
  785. if(hTreeItem == NULL)
  786. {
  787. HTREEITEM hTreeItem;
  788. if(m_hRoot == NULL)
  789. m_hRoot = InsertTreeItem(_T("FileName"), TVI_ROOT, TVI_ROOT);
  790. else
  791. m_treeRawCode.SetItemText(m_hRoot, _T("FileName"));
  792. AddTreeNode(m_hRoot, MAX_PATH, _T(""), _T(""), _T(""), _T("FileName"), NODE_TYPE_FILENAME);
  793. // ID
  794. hTreeItem = InsertTreeItem(_T("ID: GameID"), m_hRoot, m_hRoot);
  795. AddTreeNode(hTreeItem, 12, _T(""), _T(""), _T("ID: "), _T("ID: GameID"), NODE_TYPE_GAMEINFO);
  796. // Name
  797. hTreeItem = InsertTreeItem(_T("NAME: Game Name"), m_hRoot, hTreeItem);
  798. AddTreeNode(hTreeItem, 30, _T(""), _T(""), _T("NAME: "), _T("NAME: Game Name"), NODE_TYPE_GAMEINFO);
  799. GetDlgItem(IDC_SAVE).EnableWindow(0);
  800. m_treeRawCode.EditLabel(m_treeRawCode.GetPrevSiblingItem(hTreeItem));
  801. return;
  802. }
  803. HTREEITEM hLastItem;
  804. int nType = m_vTreeNode[GetTreeNodeIndex(m_treeRawCode.GetSelectedItem())].nType;
  805. if(nType == NODE_TYPE_FILENAME || nType == NODE_TYPE_GAMEINFO)
  806. {
  807. hLastItem = m_hRoot;
  808. if(m_hRoot != NULL && m_treeRawCode.ItemHasChildren(m_hRoot))
  809. {
  810. HTREEITEM hChildItem = m_treeRawCode.GetChildItem(m_hRoot);
  811. while (NULL != hChildItem)
  812. {
  813. hLastItem = hChildItem;
  814. hChildItem = m_treeRawCode.GetNextSiblingItem(hChildItem);
  815. }
  816. }
  817. hTreeItem = InsertTreeItem(_T("Class Name: "), m_hRoot, hLastItem);
  818. AddTreeNode(hTreeItem, 19, _T(""), _T(""), _T("Class Name: "), _T(""), NODE_TYPE_CLASSNAME, m_vTreeNode.size());
  819. m_treeRawCode.EditLabel(hTreeItem);
  820. }
  821. else if(nType == NODE_TYPE_CLASSNAME)
  822. {
  823. hLastItem = hTreeItem;
  824. int nCodeNumber = 1;
  825. TCHAR szCodeNumber[5] = {0};
  826. TCHAR szDisplayData[100] = {0};
  827. int nPos;
  828. if(hTreeItem != NULL && m_treeRawCode.ItemHasChildren(hTreeItem))
  829. {
  830. HTREEITEM hChildItem = m_treeRawCode.GetChildItem(hTreeItem);
  831. while (NULL != hChildItem)
  832. {
  833. hLastItem = hChildItem;
  834. hChildItem = m_treeRawCode.GetNextSiblingItem(hChildItem);
  835. nCodeNumber ++;
  836. }
  837. }
  838. HTREEITEM hItem = m_treeRawCode.GetNextSiblingItem(m_treeRawCode.GetParentItem(hLastItem));
  839. if(hItem == NULL)
  840. nPos = m_vTreeNode.size();
  841. else
  842. nPos = GetTreeNodeIndex(hItem);
  843. // CodeItem
  844. _itot(nCodeNumber++, szCodeNumber, 10);
  845. _tcscpy(szDisplayData, _T("Code "));
  846. _tcscat(szDisplayData, szCodeNumber);
  847. hTreeItem = InsertTreeItem(szDisplayData, hTreeItem, hLastItem);
  848. AddTreeNode(hTreeItem, MAX_PATH, _T(""), _T(""), _T("Code "), szCodeNumber, NODE_TYPE_RAWCODENUMBER, nPos++);
  849. // CodeName
  850. hLastItem = InsertTreeItem(_T("Code Name: !NoName"), hTreeItem, hLastItem);
  851. AddTreeNode(hLastItem, 9, _T(""), _T(" "), _T("Code Name: "), _T(RAWCODENAMEEMPTY), NODE_TYPE_RAWCODENAME, nPos++);
  852. // ItemStat
  853. hLastItem = InsertTreeItem(_T("Code Stat: Disable"), hTreeItem, hLastItem);
  854. AddTreeNode(hLastItem, 1, _T("012"), _T(""), _T("Code Stat: "), _T("0"), NODE_TYPE_RAWCODESTAT, nPos++);
  855. // MemTitle
  856. HTREEITEM hMemoryItem = InsertTreeItem(_T("Memory"), hTreeItem, hLastItem);
  857. AddTreeNode(hMemoryItem, MAX_PATH, _T(""), _T(""), _T(""), _T("Memory"), NODE_TYPE_RAWCODEMEMORY, nPos++);
  858. // Mem1
  859. hLastItem = InsertTreeItem(_T("Memory1: 0x00000000"), hMemoryItem, hMemoryItem);
  860. AddTreeNode(hLastItem, 8, _T("0123456789ABCDEFabcdef"), _T(""), _T("Memory1: 0x"), _T("00000000"), NODE_TYPE_RAWCODEMEMORYN, nPos++);
  861. // Mem2
  862. hLastItem = InsertTreeItem(_T("Memory2: 0x00000000"), hMemoryItem, hLastItem);
  863. AddTreeNode(hLastItem, 8, _T("0123456789ABCDEFabcdef"), _T(""), _T("Memory2: 0x"), _T("00000000"), NODE_TYPE_RAWCODEMEMORYN, nPos++);
  864. // Mem3
  865. hLastItem = InsertTreeItem(_T("Memory3: 0x00000000"), hMemoryItem, hLastItem);
  866. AddTreeNode(hLastItem, 8, _T("0123456789ABCDEFabcdef"), _T(""), _T("Memory3: 0x"), _T("00000000"), NODE_TYPE_RAWCODEMEMORYN, nPos++);
  867. // Mem4
  868. hLastItem = InsertTreeItem(_T("Memory4: 0x00000000"), hMemoryItem, hLastItem);
  869. AddTreeNode(hLastItem, 8, _T("0123456789ABCDEFabcdef"), _T(""), _T("Memory4: 0x"), _T("00000000"), NODE_TYPE_RAWCODEMEMORYN, nPos++);
  870. // m_treeRawCode.Expand(hTreeItem, TVE_EXPAND);
  871. hTreeItem = m_treeRawCode.GetChildItem(hTreeItem);
  872. m_treeRawCode.EnsureVisible(hTreeItem);
  873. m_treeRawCode.EditLabel(hTreeItem);
  874. }
  875. UpdateClassCodeCount();
  876. }
  877. void CMainDlg::ShowContextMenu(POINT& point)
  878. {
  879. CMenuHandle menu;
  880. menu.LoadMenu(IDR_CONTEXTMENU);
  881. menu = menu.GetSubMenu(0);
  882. if(m_treeRawCode.GetCount() <= 0)
  883. {
  884. MENUITEMINFO mii;
  885. SCM_String strMenuItem;
  886. ZeroMemory(&mii, sizeof(MENUITEMINFO));
  887. mii.cbSize = sizeof(MENUITEMINFO);
  888. mii.fMask |= MIIM_STRING;
  889. mii.dwTypeData = _T("Create a New Raw Code File");
  890. mii.cch = _tcslen(mii.dwTypeData) + 1;
  891. menu.SetMenuItemInfo(ID_CONTEXT_INSERT, FALSE, &mii);
  892. menu.EnableMenuItem(ID_CONTEXT_INSERT, MF_ENABLED);
  893. menu.TrackPopupMenu(TPM_VERTICAL, point.x, point.y, m_hWnd);
  894. return;
  895. }
  896. int n = GetTreeNodeIndex(m_treeRawCode.GetSelectedItem());
  897. MENUITEMINFO mii;
  898. SCM_String strMenuItem;
  899. if(n != -1)
  900. {
  901. switch(m_vTreeNode[n].nType)
  902. {
  903. case NODE_TYPE_FILENAME:
  904. ZeroMemory(&mii, sizeof(MENUITEMINFO));
  905. mii.cbSize = sizeof(MENUITEMINFO);
  906. mii.fMask |= MIIM_STRING;
  907. mii.dwTypeData = _T("Insert New Raw Code Class");
  908. mii.cch = _tcslen(mii.dwTypeData) + 1;
  909. menu.SetMenuItemInfo(ID_CONTEXT_INSERT, FALSE, &mii);
  910. menu.EnableMenuItem(ID_CONTEXT_INSERT, MF_ENABLED);
  911. mii.fMask |= MIIM_STRING;
  912. strMenuItem = _T("Clean This Raw Code File?");
  913. mii.dwTypeData = (LPTSTR)(strMenuItem.c_str());
  914. mii.cch = _tcslen(mii.dwTypeData) + 1;
  915. menu.SetMenuItemInfo(ID_CONTEXT_DELETE, FALSE, &mii);
  916. menu.EnableMenuItem(ID_CONTEXT_DELETE, MF_ENABLED);
  917. break;
  918. case NODE_TYPE_GAMEINFO:
  919. ZeroMemory(&mii, sizeof(MENUITEMINFO));
  920. mii.cbSize = sizeof(MENUITEMINFO);
  921. mii.fMask |= MIIM_STRING;
  922. mii.dwTypeData = _T("Insert New Raw Code Class");
  923. mii.cch = _tcslen(mii.dwTypeData) + 1;
  924. menu.SetMenuItemInfo(ID_CONTEXT_INSERT, FALSE, &mii);
  925. menu.EnableMenuItem(ID_CONTEXT_INSERT, MF_ENABLED);
  926. mii.fMask |= MIIM_STRING;
  927. strMenuItem = _T("Clean This Raw Code File?");
  928. mii.dwTypeData = (LPTSTR)(strMenuItem.c_str());
  929. mii.cch = _tcslen(mii.dwTypeData) + 1;
  930. menu.SetMenuItemInfo(ID_CONTEXT_DELETE, FALSE, &mii);
  931. menu.EnableMenuItem(ID_CONTEXT_DELETE, MF_ENABLED);
  932. break;
  933. case NODE_TYPE_CLASSNAME:
  934. ZeroMemory(&mii, sizeof(MENUITEMINFO));
  935. mii.cbSize = sizeof(MENUITEMINFO);
  936. mii.fMask |= MIIM_STRING;
  937. strMenuItem = _T("Insert New Raw Code Under Class: "") + SCM_String(m_vTreeNode[n].szValue) + _T(""");
  938. mii.dwTypeData = (LPTSTR)(strMenuItem.c_str());
  939. mii.cch = _tcslen(mii.dwTypeData) + 1;
  940. menu.SetMenuItemInfo(ID_CONTEXT_INSERT, FALSE, &mii);
  941. menu.EnableMenuItem(ID_CONTEXT_INSERT, MF_ENABLED);
  942. mii.fMask |= MIIM_STRING;
  943. strMenuItem = _T("Delete Class: "") + SCM_String(m_vTreeNode[n].szValue) + _T(""?");
  944. mii.dwTypeData = (LPTSTR)(strMenuItem.c_str());
  945. mii.cch = _tcslen(mii.dwTypeData) + 1;
  946. menu.SetMenuItemInfo(ID_CONTEXT_DELETE, FALSE, &mii);
  947. menu.EnableMenuItem(ID_CONTEXT_DELETE, MF_ENABLED);
  948. //  if(m_treeRawCode.GetNextSiblingItem(m_treeRawCode.GetSelectedItem()) != NULL)
  949. //  menu.EnableMenuItem(ID_CONTEXT_MOVEDOWN, MF_ENABLED);
  950. //  if((m_treeRawCode.GetPrevSiblingItem(m_treeRawCode.GetSelectedItem()) != NULL) && 
  951. //  (m_treeRawCode.GetPrevSiblingItem(m_treeRawCode.GetSelectedItem())) != m_treeRawCode.GetNextSiblingItem(m_treeRawCode.GetChildItem(m_hRoot)))
  952. //  menu.EnableMenuItem(ID_CONTEXT_MOVEUP, MF_ENABLED);
  953. break;
  954. case NODE_TYPE_RAWCODENUMBER:
  955. ZeroMemory(&mii, sizeof(MENUITEMINFO));
  956. mii.cbSize = sizeof(MENUITEMINFO);
  957. mii.fMask |= MIIM_STRING;
  958. strMenuItem = _T("Delete Raw Code: "") + SCM_String(m_vTreeNode[n].szValue) + _T(""?");
  959. mii.dwTypeData = (LPTSTR)(strMenuItem.c_str());
  960. mii.cch = _tcslen(mii.dwTypeData) + 1;
  961. menu.SetMenuItemInfo(ID_CONTEXT_DELETE, FALSE, &mii);
  962. menu.EnableMenuItem(ID_CONTEXT_DELETE, MF_ENABLED);
  963. if(m_treeRawCode.GetNextSiblingItem(m_treeRawCode.GetSelectedItem()) != NULL)
  964. menu.EnableMenuItem(ID_CONTEXT_MOVEDOWN, MF_ENABLED);
  965. if(m_treeRawCode.GetPrevSiblingItem(m_treeRawCode.GetSelectedItem()) != NULL)
  966. menu.EnableMenuItem(ID_CONTEXT_MOVEUP, MF_ENABLED);
  967. break;
  968. }
  969. }
  970. menu.TrackPopupMenu(TPM_VERTICAL, point.x, point.y, m_hWnd);
  971. }
  972. LRESULT CMainDlg::OnNMRclickRawcodeTree(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/)
  973. {
  974. // TODO: Add your control notification handler code here
  975. POINT point;
  976. if(m_treeRawCode.GetSelectedItem())
  977. {
  978. GetCursorPos(&point);
  979. ScreenToClient(&point);
  980. RECT rect;
  981. ::GetWindowRect(m_treeRawCode.m_hWnd, &rect);
  982. RECT rect2;
  983. ::GetWindowRect(m_hWnd, &rect2);
  984. point.x = point.x - (rect.left - rect2.left);
  985. point.y = point.y - (rect.top - rect2.top) + GetSystemMetrics(SM_CYCAPTION) + 1;
  986. UINT uFlag;
  987. HTREEITEM h1 = m_treeRawCode.HitTest(point, &uFlag);
  988. if(h1 == NULL)
  989. return 0;
  990. if(!m_treeRawCode.SelectItem(h1))
  991. return 0;
  992. }
  993. GetCursorPos(&point);
  994. ShowContextMenu(point);
  995. return 0;
  996. }
  997. LRESULT CMainDlg::OnContextInsert(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  998. {
  999. // TODO: Add your command handler code here
  1000. if(m_treeRawCode.GetCount() <= 0)
  1001. {
  1002. AddItem(NULL);
  1003. m_treeRawCode.SetFocus();
  1004. m_treeRawCode.Expand(m_hRoot);
  1005. }
  1006. else
  1007. {
  1008. if((m_nCodeCount >= 500) || (m_nClassCount >= 50))
  1009. MessageBox(_T("One file only can contain 50 Classes and 500 Raw Codes!"));
  1010. int nType = m_vTreeNode[GetTreeNodeIndex(m_treeRawCode.GetSelectedItem())].nType;
  1011. if(nType == NODE_TYPE_FILENAME || nType == NODE_TYPE_GAMEINFO || nType == NODE_TYPE_CLASSNAME)
  1012. {
  1013. AddItem(m_treeRawCode.GetSelectedItem());
  1014. }
  1015. }
  1016. return 0;
  1017. }
  1018. LRESULT CMainDlg::OnContextDelete(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  1019. {
  1020. // TODO: Add your command handler code here
  1021.   int nType = m_vTreeNode[GetTreeNodeIndex(m_treeRawCode.GetSelectedItem())].nType;
  1022.   if(nType == NODE_TYPE_FILENAME || nType == NODE_TYPE_GAMEINFO)
  1023.   {
  1024. HTREEITEM hChildItem = m_treeRawCode.GetChildItem(m_hRoot);
  1025. HTREEITEM hNextItem;
  1026. while(hChildItem != NULL)
  1027. {
  1028. if(m_vTreeNode[GetTreeNodeIndex(hChildItem)].nType != NODE_TYPE_GAMEINFO)
  1029. {
  1030. hNextItem = m_treeRawCode.GetNextSiblingItem(hChildItem);
  1031. DeleteItemAndChild(hChildItem);
  1032. hChildItem = hNextItem;
  1033. }
  1034. else
  1035. hChildItem = m_treeRawCode.GetNextSiblingItem(hChildItem);
  1036. }
  1037.   }
  1038. else if(nType == NODE_TYPE_CLASSNAME || nType == NODE_TYPE_RAWCODENUMBER)
  1039. {
  1040. DeleteItemAndChild(m_treeRawCode.GetSelectedItem());
  1041. }
  1042. return 0;
  1043. }
  1044. LRESULT CMainDlg::OnContextMoveUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  1045. {
  1046. // TODO: Add your command handler code here
  1047. HTREEITEM hTreeItem = m_treeRawCode.GetSelectedItem();
  1048. HTREEITEM hParent = m_treeRawCode.GetParentItem(hTreeItem);
  1049. HTREEITEM hAfter = m_treeRawCode.GetPrevSiblingItem(m_treeRawCode.GetPrevSiblingItem(hTreeItem));
  1050. if(hAfter == NULL)
  1051. hAfter = TVI_FIRST;
  1052. BOOL bExpanded = FALSE;
  1053. if(m_treeRawCode.GetItemState(hTreeItem, TVIS_EXPANDED) == TVIS_EXPANDED)
  1054. bExpanded = TRUE;
  1055. hTreeItem = MoveNode(hTreeItem, hParent, hAfter);
  1056. m_treeRawCode.SelectItem(hTreeItem);
  1057. if(bExpanded)
  1058. m_treeRawCode.Expand(hTreeItem);
  1059. return 0;
  1060. }
  1061. LRESULT CMainDlg::OnContextMoveDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  1062. {
  1063. // TODO: Add your command handler code here
  1064. HTREEITEM hTreeItem = m_treeRawCode.GetSelectedItem();
  1065. HTREEITEM hParent = m_treeRawCode.GetParentItem(hTreeItem);
  1066. HTREEITEM hAfter = m_treeRawCode.GetNextSiblingItem(hTreeItem);
  1067. BOOL bExpanded = FALSE;
  1068. if(m_treeRawCode.GetItemState(hTreeItem, TVIS_EXPANDED) == TVIS_EXPANDED)
  1069. bExpanded = TRUE;
  1070. hTreeItem = MoveNode(hTreeItem, hParent, hAfter);
  1071. m_treeRawCode.SelectItem(hTreeItem);
  1072. if(bExpanded)
  1073. m_treeRawCode.Expand(hTreeItem);
  1074. return 0;
  1075. }
  1076. LRESULT CMainDlg::OnMoveUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  1077. {
  1078. HTREEITEM hTreeItem;
  1079. HTREEITEM hParent;
  1080. HTREEITEM hAfter;
  1081. BOOL bExpanded = FALSE;
  1082. hTreeItem = m_treeRawCode.GetSelectedItem();
  1083. if(hTreeItem == NULL)
  1084. return FALSE;
  1085. if(m_vTreeNode[GetTreeNodeIndex(hTreeItem)].nType != NODE_TYPE_RAWCODENUMBER)
  1086. return FALSE;
  1087. if(m_treeRawCode.GetPrevSiblingItem(hTreeItem) == NULL)
  1088. return FALSE;
  1089. hParent = m_treeRawCode.GetParentItem(hTreeItem);
  1090. hAfter = m_treeRawCode.GetPrevSiblingItem(m_treeRawCode.GetPrevSiblingItem(hTreeItem));
  1091. if(m_treeRawCode.GetItemState(hTreeItem, TVIS_EXPANDED) == TVIS_EXPANDED)
  1092. bExpanded = TRUE;
  1093. if(hAfter == NULL)
  1094. hAfter = TVI_FIRST;
  1095. hTreeItem = MoveNode(hTreeItem, hParent, hAfter);
  1096. m_treeRawCode.SelectItem(hTreeItem);
  1097. if(bExpanded)
  1098. m_treeRawCode.Expand(hTreeItem);
  1099. return TRUE;
  1100. }
  1101. LRESULT CMainDlg::OnMoveDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  1102. {
  1103. HTREEITEM hTreeItem;
  1104. HTREEITEM hParent;
  1105. HTREEITEM hAfter;
  1106. BOOL bExpanded = FALSE;
  1107. hTreeItem = m_treeRawCode.GetSelectedItem();
  1108. if(hTreeItem == NULL)
  1109. return FALSE;
  1110. if(m_vTreeNode[GetTreeNodeIndex(hTreeItem)].nType != NODE_TYPE_RAWCODENUMBER)
  1111. return FALSE;
  1112. if(m_treeRawCode.GetNextSiblingItem(hTreeItem) == NULL)
  1113. return FALSE;
  1114. hParent = m_treeRawCode.GetParentItem(hTreeItem);
  1115. hAfter = m_treeRawCode.GetNextSiblingItem(hTreeItem);
  1116. if(m_treeRawCode.GetItemState(hTreeItem, TVIS_EXPANDED) == TVIS_EXPANDED)
  1117. bExpanded = TRUE;
  1118. hTreeItem = MoveNode(hTreeItem, hParent, hAfter);
  1119. m_treeRawCode.SelectItem(hTreeItem);
  1120. if(bExpanded)
  1121. m_treeRawCode.Expand(hTreeItem);
  1122. return TRUE;
  1123. }
  1124. LRESULT CMainDlg::OnRebuildNumber(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  1125. {
  1126. RebuildCodeNumber();
  1127. return TRUE;
  1128. }
  1129. void CMainDlg::OnHotKey_Tree(int nHotKeyID, UINT uModifiers, UINT uVirtKey)
  1130. {
  1131. HTREEITEM hTreeItem;
  1132. HTREEITEM hParent;
  1133. HTREEITEM hAfter;
  1134. BOOL bExpanded = FALSE;
  1135. switch(nHotKeyID)
  1136. {
  1137. case ID_ACCELERATOR_MOVEUP:
  1138. hTreeItem = m_treeRawCode.GetSelectedItem();
  1139. if(m_vTreeNode[GetTreeNodeIndex(hTreeItem)].nType != NODE_TYPE_RAWCODENUMBER)
  1140. return;
  1141. if(m_treeRawCode.GetPrevSiblingItem(hTreeItem) == NULL)
  1142. return;
  1143. hParent = m_treeRawCode.GetParentItem(hTreeItem);
  1144. hAfter = m_treeRawCode.GetPrevSiblingItem(m_treeRawCode.GetPrevSiblingItem(hTreeItem));
  1145. if(m_treeRawCode.GetItemState(hTreeItem, TVIS_EXPANDED) == TVIS_EXPANDED)
  1146. bExpanded = TRUE;
  1147. if(hAfter == NULL)
  1148. hAfter = TVI_FIRST;
  1149. hTreeItem = MoveNode(hTreeItem, hParent, hAfter);
  1150. m_treeRawCode.SelectItem(hTreeItem);
  1151. if(bExpanded)
  1152. m_treeRawCode.Expand(hTreeItem);
  1153. break;
  1154. case ID_ACCELERATOR_MOVEDOWN:
  1155. hTreeItem = m_treeRawCode.GetSelectedItem();
  1156. if(m_vTreeNode[GetTreeNodeIndex(hTreeItem)].nType != NODE_TYPE_RAWCODENUMBER)
  1157. return;
  1158. if(m_treeRawCode.GetNextSiblingItem(hTreeItem) == NULL)
  1159. return;
  1160. hParent = m_treeRawCode.GetParentItem(hTreeItem);
  1161. hAfter = m_treeRawCode.GetNextSiblingItem(hTreeItem);
  1162. if(m_treeRawCode.GetItemState(hTreeItem, TVIS_EXPANDED) == TVIS_EXPANDED)
  1163. bExpanded = TRUE;
  1164. hTreeItem = MoveNode(hTreeItem, hParent, hAfter);
  1165. m_treeRawCode.SelectItem(hTreeItem);
  1166. if(bExpanded)
  1167. m_treeRawCode.Expand(hTreeItem);
  1168.     break;
  1169. default:
  1170.     break;
  1171. }
  1172. }
  1173. LRESULT CMainDlg::OnSave(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  1174. {
  1175. // TODO: Add your control notification handler code here
  1176. SaveFile(m_strSCMFile.c_str());
  1177. return 0;
  1178. }
  1179. LRESULT CMainDlg::OnSaveas(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  1180. {
  1181. // TODO: Add your control notification handler code here
  1182. OPENFILENAME ofn;
  1183. TCHAR szFile[MAX_PATH] = {0};
  1184. TCHAR szInitalDir[MAX_PATH] = {0};
  1185. GetDlgItemText(IDC_FILENAME, szInitalDir, MAX_PATH);
  1186. ZeroMemory(&ofn, sizeof(OPENFILENAME));
  1187. ofn.lStructSize = sizeof(ofn);
  1188. ofn.hwndOwner = m_hWnd;
  1189. ofn.lpstrFile = szFile;
  1190. ofn.lpstrFile[0] = _T('');
  1191. ofn.nMaxFile = sizeof(szFile);
  1192. ofn.lpstrFilter = _T("SCEP CheatMaster 0.7 Raw Code File*.scm");
  1193. ofn.nFilterIndex = 1;
  1194. ofn.lpstrTitle = _T("Please Open a SCEP CheatMaster 0.7 Raw Code File");
  1195. ofn.lpstrInitialDir = szInitalDir;
  1196. ofn.Flags = OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
  1197. if(TRUE == GetOpenFileName(&ofn))
  1198. {
  1199. m_strSCMFile = SCM_String(ofn.lpstrFile);
  1200. SetDlgItemText(IDC_FILENAME, m_strSCMFile.c_str());
  1201. m_treeRawCode.SetItemText(m_hRoot, m_strSCMFile.c_str());
  1202. _tcscpy(m_vTreeNode[GetTreeNodeIndex(m_hRoot)].szValue, m_strSCMFile.c_str());
  1203. SaveFile(SCM_String(ofn.lpstrFile).c_str());
  1204. GetDlgItem(IDC_SAVE).EnableWindow(1);
  1205. }
  1206. return 0;
  1207. }
  1208. void CMainDlg::SaveFile(LPCTSTR lpszFileName)
  1209. {
  1210. HANDLE hFile = CreateFile(lpszFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  1211. DWORD dwWrite;
  1212. char szLine[200] = {0};
  1213. char szTemp[50] = {0};
  1214. BOOL bWrite;
  1215. int nLength;
  1216. for(int i = 0; i < m_vTreeNode.size(); i++)
  1217. {
  1218. bWrite = FALSE;
  1219. switch(m_vTreeNode[i].nType)
  1220. {
  1221. //  case NODE_TYPE_FILENAME:
  1222. //  case NODE_TYPE_RAWCODENUMBER:
  1223. //  case NODE_TYPE_RAWCODEMEMORY:
  1224. //  bWrite = FALSE;
  1225. //  break;
  1226. case NODE_TYPE_GAMEINFO:
  1227. bWrite = TRUE;
  1228. ZeroMemory(szLine, sizeof(szLine));
  1229. strcpy(szLine, ws2s(m_vTreeNode[i++].szValue).c_str());
  1230. strcat(szLine, "n");
  1231. strcat(szLine, ws2s(m_vTreeNode[i].szValue).c_str());
  1232. strcat(szLine, "n$STARTn");
  1233. break;
  1234. case NODE_TYPE_CLASSNAME:
  1235. bWrite = TRUE;
  1236. ZeroMemory(szLine, sizeof(szLine));
  1237. strcpy(szLine, "$");
  1238. strncpy(szTemp, ws2s(m_vTreeNode[i].szValue).c_str(), 19);
  1239. strcat(szLine, szTemp);
  1240. nLength = strlen(szTemp);
  1241. if(nLength < 19)
  1242. strncat(szLine, "                   ", 19-nLength);
  1243. strcat(szLine, "{n");
  1244.     break;
  1245. case NODE_TYPE_RAWCODENAME:
  1246. ZeroMemory(szLine, sizeof(szLine));
  1247. strcpy(szLine, "$");
  1248. strncpy(szTemp, ws2s(m_vTreeNode[i].szValue).c_str(), 9);
  1249. strcat(szLine, szTemp);
  1250. nLength = strlen(szTemp);
  1251. if(nLength < 9)
  1252. strncat(szLine, "         ", 9-nLength);
  1253. strcat(szLine, " ");
  1254.     break;
  1255. case NODE_TYPE_RAWCODESTAT:
  1256. strcat(szLine, "$");
  1257. strcat(szLine, ws2s(m_vTreeNode[i].szValue).c_str());
  1258. nLength = strlen(szTemp);
  1259. if(nLength < 1)
  1260. strcat(szLine, "0");
  1261. strcat(szLine, " $(");
  1262. break;
  1263. case NODE_TYPE_RAWCODEMEMORYN:
  1264. strcat(szLine, ws2s(m_vTreeNode[i].szValue).c_str());
  1265. if(i != m_vTreeNode.size()-1)
  1266. {
  1267. if(m_vTreeNode[i+1].nType == NODE_TYPE_RAWCODEMEMORYN)
  1268. strcat(szLine, " ");
  1269. else if(m_vTreeNode[i+1].nType == NODE_TYPE_RAWCODENUMBER)
  1270. {
  1271. strcat(szLine, ")n");
  1272. bWrite = TRUE;
  1273. }
  1274. else
  1275. {
  1276. strcat(szLine, ")}nn");
  1277. bWrite = TRUE;
  1278. }
  1279. }
  1280. else
  1281. {
  1282. strcat(szLine, ")}nn");
  1283. bWrite = TRUE;
  1284. }
  1285. break;
  1286. default:
  1287.     break;
  1288. }
  1289. if(bWrite)
  1290. {
  1291. dwWrite = strlen(szLine);
  1292. WriteFile(hFile, szLine, dwWrite, &dwWrite, NULL);
  1293. }
  1294. }
  1295. CloseHandle(hFile);
  1296. }
  1297. LRESULT CMainDlg::OnBeginDrag(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& bHandled)
  1298. {
  1299. LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
  1300. // TODO: Add your control notification handler code here
  1301. bHandled = FALSE;
  1302. //如果是无意拖曳,则放弃操作
  1303. if((GetTickCount() - m_dwDragStart) < DRAG_DELAY)
  1304. return FALSE;
  1305. POINT point;
  1306. point.x = pNMTreeView->ptDrag.x;
  1307. point.y = pNMTreeView->ptDrag.y;
  1308. UINT uFlag;
  1309. HTREEITEM h1 = m_treeRawCode.HitTest(point, &uFlag);
  1310. if(h1 == NULL)
  1311. return FALSE;
  1312. if(!m_treeRawCode.SelectItem(h1))
  1313. return FALSE;
  1314. if(m_vTreeNode[GetTreeNodeIndex(h1)].nType != NODE_TYPE_RAWCODENUMBER)
  1315. return FALSE;
  1316. m_hItemDragS = pNMTreeView->itemNew.hItem;
  1317. m_hItemDragD = NULL;
  1318. //得到用于拖动时显示的图象列表
  1319. m_pDragImage = m_treeRawCode.CreateDragImage(m_hItemDragS);
  1320. if(!m_pDragImage)
  1321. return FALSE;
  1322. m_bDragging = true;
  1323. m_pDragImage.BeginDrag(0, CPoint(8,8));
  1324. CPoint pt = pNMTreeView->ptDrag;
  1325. ClientToScreen(&pt);
  1326. m_pDragImage.DragEnter(m_treeRawCode.m_hWnd, pt);  //"this"将拖曳动作限制在该窗口
  1327. // SetCapture();
  1328. m_nScrollTimerID = SetTimer(2, 40, NULL);
  1329. return TRUE;
  1330. }
  1331. void CMainDlg::OnMouseMove_Tree(UINT nFlags, CPoint point)
  1332. {
  1333. HTREEITEM  hItem;
  1334. UINT       flags;
  1335. //检测鼠标敏感定时器是否存在,如果存在则删除,删除后再定时
  1336. if(m_nHoverTimerID)
  1337. {
  1338. KillTimer(m_nHoverTimerID);
  1339. m_nHoverTimerID = 0;
  1340. }
  1341. m_nHoverTimerID = SetTimer(1, 800, NULL);  //定时为 0.8 秒则自动展开
  1342. m_HoverPoint = point;
  1343. if(m_bDragging)
  1344. {
  1345. CPoint  pt = point;
  1346. CImageList::DragMove(pt);
  1347. //鼠标经过时高亮显示
  1348. CImageList::DragShowNolock(false);  //避免鼠标经过时留下难看的痕迹
  1349. if((hItem = m_treeRawCode.HitTest(point, &flags)) != NULL)
  1350. {
  1351. //   m_treeRawCode.SelectDropTarget(hItem);
  1352. m_hItemDragD = hItem;
  1353. RECT rect;
  1354. switch(m_vTreeNode[GetTreeNodeIndex(hItem)].nType)
  1355. {
  1356. case NODE_TYPE_RAWCODENUMBER:
  1357. if(m_treeRawCode.GetItemRect(hItem, &rect, FALSE))
  1358. {
  1359. if(pt.y >= (rect.top + (rect.bottom - rect.top)/2))
  1360. {
  1361. pt.y = rect.bottom;
  1362. m_bInsertUp = FALSE;
  1363. }
  1364. else
  1365. {
  1366. m_bInsertUp = TRUE;
  1367. pt.y = rect.top;
  1368. }
  1369. if(m_nOldY != pt.y)
  1370. {
  1371. m_treeRawCode.GetClientRect(&rect);
  1372. m_treeRawCode.InvalidateRect(&rect, TRUE);
  1373. m_treeRawCode.UpdateWindow();
  1374. DrawSplitLine(rect.left, pt.y, rect.right, pt.y);
  1375. }
  1376. }
  1377. break;
  1378. case NODE_TYPE_CLASSNAME:
  1379. if(m_treeRawCode.GetItemRect(hItem, &rect, TRUE))
  1380. {
  1381. pt.x = rect.right;
  1382. pt.y = rect.top + (rect.bottom - rect.top)/2;
  1383. if(m_nOldY != pt.y)
  1384. {
  1385. m_treeRawCode.GetClientRect(&rect);
  1386. m_treeRawCode.InvalidateRect(&rect, TRUE);
  1387. m_treeRawCode.UpdateWindow();
  1388. DrawInsertPoint(pt.x, pt.y);
  1389. }
  1390. }
  1391.     break;
  1392. default:
  1393.     break;
  1394. }
  1395. }
  1396. CImageList::DragShowNolock(true);
  1397. //  //当条目被拖曳到左边缘时,将条目放在根下
  1398. //  CRect  rect;
  1399. //  GetClientRect(&rect);
  1400. //  if( point.x < rect.left + 20 )
  1401. //  m_hItemDragD = NULL;
  1402. }
  1403. //  else
  1404. //  {
  1405. //  if((hItem = m_treeRawCode.HitTest(point, &flags)) != NULL)
  1406. //  {
  1407. //  int n = GetTreeNodeIndex(hItem);
  1408. //  if(m_vTreeNode[n].nType == NODE_TYPE_RAWCODEMEMORY)
  1409. //  {
  1410. //  SCM_String strMemoryInfo = ParseMemoryInfo(m_vTreeNode[n+1].szValue, m_vTreeNode[n+2].szValue, m_vTreeNode[n+3].szValue, m_vTreeNode[n+4].szValue);
  1411. // 
  1412. //  RECT rect;
  1413. //  m_treeRawCode.GetItemRect(hItem, &rect, TRUE);
  1414. // 
  1415. //  POINT pt;
  1416. //  TRACKMOUSEEVENT tk;
  1417. //  tk.cbSize = sizeof(tk);
  1418. //  tk.dwFlags = TME_LEAVE;
  1419. //  tk.dwHoverTime = 0;
  1420. //  tk.hwndTrack = m_treeRawCode.m_hWnd;
  1421. //  _TrackMouseEvent(&tk);
  1422. //  pt.x = rect.left - 3;
  1423. //  pt.y = rect.top - 2;
  1424. //  ClientToScreen(&pt);
  1425. //  m_tooltip.TrackPosition(pt.x, pt.y);
  1426. //  m_tooltip.TrackActivate(&m_ti, TRUE);
  1427. // 
  1428. // // m_tooltip.Up
  1429. // // m_tooltip.UpdateTipText(strMemoryInfo.c_str(), m_treeRawCode.m_hWnd);
  1430. // // m_tooltip.RelayEvent(pMsg);
  1431. // //  m_tooltip = m_treeRawCode.GetToolTips();
  1432. // //   TOOLINFO toolInfo;
  1433. // //   toolInfo.cbSize = sizeof(TOOLINFO);
  1434. // //  RECT rect;
  1435. // //  rect.left = point.x;
  1436. // //  rect.top = point.y;
  1437. // //  rect.right = point.x + 100;
  1438. // //  rect.bottom = point.y + 50;
  1439. // //  toolInfo.rect = rect;
  1440. // //   toolInfo.hwnd = m_treeRawCode.m_hWnd;
  1441. // //   toolInfo.lpszText = (LPTSTR)strMemoryInfo.c_str();
  1442. // //   m_tooltip.SetToolInfo(&toolInfo);
  1443. // //   m_treeRawCode.SetToolTips(m_tooltip.m_hWnd);
  1444. //  }
  1445. //  }
  1446. //  }
  1447. SetMsgHandled(FALSE);
  1448. }
  1449. void CMainDlg::OnLButtonUp_Tree(UINT nFlags, CPoint point)
  1450. {
  1451. SetMsgHandled(FALSE);
  1452. if(m_bDragging)
  1453. {
  1454. m_bDragging = FALSE;
  1455. CImageList::DragLeave(m_treeRawCode.m_hWnd);
  1456. CImageList::EndDrag();
  1457. RECT rect;
  1458. m_treeRawCode.GetClientRect(&rect);
  1459. m_treeRawCode.InvalidateRect(&rect, TRUE);
  1460. m_treeRawCode.UpdateWindow();
  1461. m_treeRawCode.SelectDropTarget(NULL);
  1462. if(m_hItemDragS == m_hItemDragD)
  1463. {
  1464. KillTimer(m_nScrollTimerID);
  1465. return;
  1466. }
  1467. int nType = m_vTreeNode[GetTreeNodeIndex(m_hItemDragD)].nType;
  1468. if((nType != NODE_TYPE_RAWCODENUMBER) && (nType != NODE_TYPE_CLASSNAME))
  1469. {
  1470. KillTimer(m_nScrollTimerID);
  1471. return;
  1472. }
  1473. HTREEITEM hParent;
  1474. HTREEITEM hAfter;
  1475. if(nType == NODE_TYPE_CLASSNAME)
  1476. {
  1477. m_treeRawCode.Expand(m_hItemDragD, TVE_EXPAND);
  1478. hParent = m_hItemDragD;
  1479. hAfter = m_hItemDragD;
  1480. if(m_treeRawCode.ItemHasChildren(m_hItemDragD))
  1481. {
  1482. hAfter = TVI_LAST;
  1483. }
  1484. }
  1485. else
  1486. {
  1487. hParent = m_treeRawCode.GetParentItem(m_hItemDragD);
  1488. if(m_bInsertUp) //Up
  1489. {
  1490. if(m_hItemDragD == m_treeRawCode.GetChildItem(hParent)) // First Child
  1491. hAfter = TVI_FIRST;
  1492. else
  1493. hAfter = m_treeRawCode.GetPrevSiblingItem(m_hItemDragD);
  1494. }
  1495. else
  1496. hAfter = m_hItemDragD;
  1497. }
  1498. BOOL bExpanded = FALSE;
  1499. if(m_treeRawCode.GetItemState(m_hItemDragS, TVIS_EXPANDED) == TVIS_EXPANDED)
  1500. bExpanded = TRUE;
  1501. HTREEITEM hTreeItem = MoveNode(m_hItemDragS, hParent, hAfter);
  1502. m_treeRawCode.SelectItem(hTreeItem);
  1503. if(bExpanded)
  1504. m_treeRawCode.Expand(hTreeItem);
  1505.   KillTimer(m_nScrollTimerID);
  1506. }
  1507. }
  1508. void CMainDlg::OnLButtonDown_Tree(UINT nFlags, CPoint point)
  1509. {
  1510. if(nFlags & 0x8000)
  1511. m_dwDragStart = GetTickCount();
  1512. else
  1513. {
  1514. m_bShouldTrigger = TRUE;
  1515. SetTimer(MOUSE_DOUBLE_CLICK_TIMER, GetDoubleClickTime(), 0);
  1516. }
  1517. UINT flags;
  1518. HTREEITEM hItem = m_treeRawCode.HitTest(point, &flags);
  1519. if(hItem != NULL)
  1520. {
  1521. if((flags&TVHT_ONITEMBUTTON) == TVHT_ONITEMBUTTON)
  1522. {
  1523. if(m_treeRawCode.GetItemState(hItem, TVIS_EXPANDED) == TVIS_EXPANDED)
  1524. m_treeRawCode.Expand(hItem, TVE_EXPAND);
  1525. else
  1526. m_treeRawCode.Expand(hItem, TVE_COLLAPSE);
  1527. }
  1528. else
  1529. {
  1530. int n = GetTreeNodeIndex(hItem);
  1531. if(n != -1)
  1532. {
  1533. if( (m_vTreeNode[n].nType == NODE_TYPE_FILENAME) || 
  1534. (m_vTreeNode[n].nType == NODE_TYPE_RAWCODENUMBER) ||
  1535. (m_vTreeNode[n].nType == NODE_TYPE_RAWCODEMEMORY))
  1536. {
  1537. m_treeRawCode.SelectItem(hItem);
  1538. return;
  1539. }
  1540. }
  1541. }
  1542. }
  1543. SetMsgHandled(FALSE);
  1544. }
  1545. LRESULT CMainDlg::OnTimer_Tree(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  1546. {
  1547. //鼠标敏感节点
  1548. UINT nIDEvent = (UINT)wParam;
  1549. if(nIDEvent == MOUSE_DOUBLE_CLICK_TIMER)
  1550. {
  1551. KillTimer(MOUSE_DOUBLE_CLICK_TIMER);
  1552. if(m_bShouldTrigger)
  1553. PostMessage(WM_LBUTTONDOWN, MK_LBUTTON | 0x8000 , 0);
  1554. }
  1555. else if(nIDEvent == m_nHoverTimerID)
  1556. {
  1557. KillTimer(m_nHoverTimerID);
  1558. m_nHoverTimerID = 0;
  1559. HTREEITEM  trItem = 0;
  1560. UINT  uFlag = 0;
  1561. trItem = m_treeRawCode.HitTest(m_HoverPoint, &uFlag);
  1562. if(trItem && m_bDragging && (m_vTreeNode[GetTreeNodeIndex(trItem)].nType == NODE_TYPE_CLASSNAME))
  1563. {
  1564. // m_treeRawCode.SelectItem(trItem);
  1565. m_treeRawCode.Expand(trItem, TVE_EXPAND);
  1566. }
  1567. }
  1568. //处理拖曳过程中的滚动问题
  1569. else if(nIDEvent == m_nScrollTimerID)
  1570. {
  1571. m_TimerTicks++;
  1572. CPoint pt;
  1573. GetCursorPos(&pt);
  1574. CRect rect;
  1575. GetClientRect(&rect);
  1576. ClientToScreen(&rect);
  1577. HTREEITEM  hItem = m_treeRawCode.GetFirstVisibleItem();
  1578. if(pt.y < rect.top +10)
  1579. {
  1580. //向上滚动
  1581. int  slowscroll = 6 - (rect.top + 10 - pt.y)/20;
  1582. if( 0 == (m_TimerTicks % ((slowscroll > 0) ? slowscroll : 1)))
  1583. {
  1584. CImageList::DragShowNolock (false);
  1585. SendMessage(m_treeRawCode.m_hWnd, WM_VSCROLL, SB_LINEUP, NULL);
  1586. m_treeRawCode.SelectDropTarget(hItem);
  1587. m_hItemDragD = hItem;
  1588. CImageList::DragShowNolock (true);
  1589. }
  1590. }
  1591. else if(pt.y > rect.bottom - 10)
  1592. {
  1593. //向下滚动
  1594. int  slowscroll = 6 - (pt.y - rect.bottom + 10)/20;
  1595. if( 0 == (m_TimerTicks % ((slowscroll > 0) ? slowscroll : 1)))
  1596. {
  1597. CImageList::DragShowNolock (false);
  1598. SendMessage(m_treeRawCode.m_hWnd, WM_VSCROLL, SB_LINEDOWN, NULL);
  1599. int  nCount = m_treeRawCode.GetVisibleCount();
  1600. for(int i = 0; i < nCount - 1; i ++)
  1601. hItem = m_treeRawCode.GetNextVisibleItem(hItem);
  1602. if(hItem)
  1603. m_treeRawCode.SelectDropTarget(hItem);
  1604. m_hItemDragD = hItem;
  1605. CImageList::DragShowNolock (true);
  1606. }
  1607. }
  1608. }
  1609. else
  1610. SetMsgHandled(FALSE);
  1611. return TRUE;
  1612. }
  1613. void CMainDlg::DrawSplitLine(int nStart_x, int nStart_y, int nEnd_x, int nEnd_y)
  1614. {
  1615.    HDC hTreeDC = ::GetDC(m_treeRawCode.m_hWnd);
  1616.   Graphics g(hTreeDC);
  1617. SolidBrush BlackBrush(Color(255, 0, 0, 0));
  1618. Pen blackPen(&BlackBrush, 2);
  1619. nEnd_x -= 5;
  1620. nStart_x += 1;
  1621. Point LPoints[4] = {Point(nStart_x, nStart_y-5), Point(nStart_x+4, nStart_y), Point(nStart_x+4, nStart_y-1), Point(nStart_x, nStart_y+4)};
  1622. Point RPoints[4] = {Point(nEnd_x, nEnd_y-6), Point(nEnd_x-5, nEnd_y), Point(nEnd_x-5, nEnd_y-1), Point(nEnd_x, nEnd_y+5)};
  1623. g.FillPolygon(&BlackBrush, LPoints, 4);
  1624. g.FillPolygon(&BlackBrush, RPoints, 4);
  1625. g.DrawLine(&blackPen, Point(nStart_x+2, nStart_y), Point(nEnd_x-2, nEnd_y));
  1626. m_nOldY = nEnd_y;
  1627. }
  1628. void CMainDlg::DrawInsertPoint(int nPoint_x, int nPoint_y)
  1629. {
  1630. HDC hTreeDC = ::GetDC(m_treeRawCode.m_hWnd);
  1631. Graphics g(hTreeDC);
  1632. SolidBrush BlackBrush(Color(255, 0, 0, 0));
  1633. nPoint_x += 2;
  1634. Point Points[3] = {Point(nPoint_x, nPoint_y), Point(nPoint_x+5, nPoint_y+5), Point(nPoint_x+5, nPoint_y-5)};
  1635. g.FillPolygon(&BlackBrush, Points, 3);
  1636. m_nOldY = nPoint_y;
  1637. }
  1638. HTREEITEM CMainDlg::MoveNode(HTREEITEM hNodeS, HTREEITEM hNodeDParent, HTREEITEM hNodeDAfter)
  1639. {
  1640. int n = GetTreeNodeIndex(hNodeS);
  1641. std::vector <TreeNode> vTreeNode;
  1642. vTreeNode.assign(m_vTreeNode.begin() + n, m_vTreeNode.begin() + n + 8);
  1643. DeleteItemAndChild(hNodeS, TRUE);
  1644. HTREEITEM hMoveTo;
  1645. HTREEITEM hTreeItem;
  1646. if(hNodeDAfter == TVI_FIRST)
  1647. n = GetTreeNodeIndex(hNodeDParent) + 1;
  1648. else if(hNodeDAfter == TVI_LAST)
  1649. {
  1650. hTreeItem = m_treeRawCode.GetNextSiblingItem(hNodeDParent);
  1651. if(hTreeItem == NULL)
  1652. n = m_vTreeNode.size();
  1653. else
  1654. n = GetTreeNodeIndex(hTreeItem);
  1655. }
  1656. else
  1657. n = GetTreeNodeIndex(hNodeDAfter) + 8;
  1658. m_vTreeNode.insert(m_vTreeNode.begin() + n, vTreeNode.begin(), vTreeNode.end());
  1659. HTREEITEM hParent;
  1660. SCM_String string;
  1661. // CodeItem
  1662. string = SCM_String(vTreeNode[0].szFront) + SCM_String(vTreeNode[0].szValue);
  1663. hTreeItem = InsertTreeItem(string.c_str(), hNodeDParent, hNodeDAfter);
  1664. hParent = hTreeItem;
  1665. hMoveTo = hTreeItem;
  1666. m_vTreeNode[n++].hItem = hTreeItem;
  1667. // CodeName
  1668. string = SCM_String(vTreeNode[1].szFront) + SCM_String(vTreeNode[1].szValue);
  1669. hTreeItem = InsertTreeItem(string.c_str(), hParent, hTreeItem);
  1670. m_vTreeNode[n++].hItem = hTreeItem;
  1671. // ItemStat
  1672. string = SCM_String(vTreeNode[2].szFront);
  1673. switch(_ttoi(vTreeNode[2].szValue))
  1674. {
  1675. case 0:
  1676. string += SCM_String(_T("Disable"));
  1677. break;
  1678. case 1:
  1679. string += SCM_String(_T("Enable"));
  1680. break;
  1681. case 2:
  1682. string += SCM_String(_T("Lock"));
  1683. break;
  1684. default:
  1685. string += SCM_String(_T("Unknown"));
  1686. break;
  1687. }
  1688. hTreeItem = InsertTreeItem(string.c_str(), hParent, hTreeItem);
  1689. m_vTreeNode[n++].hItem = hTreeItem;
  1690. // MemTitle
  1691. string = SCM_String(vTreeNode[3].szValue);
  1692. hTreeItem = InsertTreeItem(string.c_str(), hParent, hTreeItem);
  1693. hParent = hTreeItem;
  1694. m_vTreeNode[n++].hItem = hTreeItem;
  1695. // Mem1
  1696. string = SCM_String(vTreeNode[4].szFront) + SCM_String(vTreeNode[4].szValue);
  1697. hTreeItem = InsertTreeItem(string.c_str(), hParent, hTreeItem);
  1698. m_vTreeNode[n++].hItem = hTreeItem;
  1699. // Mem2
  1700. string = SCM_String(vTreeNode[5].szFront) + SCM_String(vTreeNode[5].szValue);
  1701. hTreeItem = InsertTreeItem(string.c_str(), hParent, hTreeItem);
  1702. m_vTreeNode[n++].hItem = hTreeItem;
  1703. // Mem3
  1704. string = SCM_String(vTreeNode[6].szFront) + SCM_String(vTreeNode[6].szValue);
  1705. hTreeItem = InsertTreeItem(string.c_str(), hParent, hTreeItem);
  1706. m_vTreeNode[n++].hItem = hTreeItem;
  1707. // Mem4
  1708. string = SCM_String(vTreeNode[7].szFront) + SCM_String(vTreeNode[7].szValue);
  1709. hTreeItem = InsertTreeItem(string.c_str(), hParent, hTreeItem);
  1710. m_vTreeNode[n++].hItem = hTreeItem;
  1711. // RebuildCodeNumber();
  1712. return hMoveTo;
  1713. }
  1714. void CMainDlg::RebuildCodeNumber()
  1715. {
  1716. // Get First Class
  1717. HTREEITEM hClassName = m_treeRawCode.GetNextSiblingItem(m_treeRawCode.GetNextSiblingItem(m_treeRawCode.GetChildItem(m_hRoot)));
  1718. HTREEITEM hCodeNumber;
  1719. int i;
  1720. int n;
  1721. TCHAR szNumber[5] = {0};
  1722. TCHAR szString[50] = {0};
  1723. while(hClassName != NULL)
  1724. {
  1725. if(m_treeRawCode.ItemHasChildren(hClassName))
  1726. {
  1727. i = 1;
  1728. hCodeNumber = m_treeRawCode.GetChildItem(hClassName);
  1729. while (hCodeNumber != NULL)
  1730. {
  1731. _itot(i++, szNumber, 10);
  1732. n = GetTreeNodeIndex(hCodeNumber);
  1733. _tcscpy(m_vTreeNode[n].szValue, szNumber);
  1734. _tcscpy(szString, m_vTreeNode[n].szFront);
  1735. _tcscat(szString, szNumber);
  1736. m_treeRawCode.SetItemText(hCodeNumber, szString);
  1737. hCodeNumber = m_treeRawCode.GetNextSiblingItem(hCodeNumber);
  1738. }
  1739. }
  1740. hClassName = m_treeRawCode.GetNextSiblingItem(hClassName);
  1741. }
  1742. }
  1743. void CMainDlg::UpdateClassCodeCount()
  1744. {
  1745. TCHAR szTemp[100] = {0};
  1746. TCHAR szNumber[5] = {0};
  1747. _tcscpy(szTemp, _T("Class Number: "));
  1748. _itot(m_nClassCount, szNumber, 10);
  1749. _tcscat(szTemp, szNumber);
  1750. _tcscat(szTemp, _T("/50"));
  1751. SetDlgItemText(IDC_CLASS_COUNT, szTemp);
  1752. _tcscpy(szTemp, _T("Code Number: "));
  1753. _itot(m_nCodeCount, szNumber, 10);
  1754. _tcscat(szTemp, szNumber);
  1755. _tcscat(szTemp, _T("/500"));
  1756. SetDlgItemText(IDC_CODE_COUNT, szTemp);
  1757. }