FileWatcherDlg.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572
  1. // FileWatcherDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "FileWatcher.h"
  5. #include "FileWatcherDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CFileWatcherDlg dialog
  50. CFileWatcherDlg::CFileWatcherDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CFileWatcherDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CFileWatcherDlg)
  54. m_csStrPath = _T("");
  55. //}}AFX_DATA_INIT
  56. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  57. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  58. }
  59. void CFileWatcherDlg::DoDataExchange(CDataExchange* pDX)
  60. {
  61. CDialog::DoDataExchange(pDX);
  62. //{{AFX_DATA_MAP(CFileWatcherDlg)
  63. DDX_Control(pDX, IDC_LIST_DATA, m_csListData);
  64. DDX_Control(pDX, IDC_EDIT_PATH, m_csEdtPath);
  65. DDX_Control(pDX, IDC_BTN_CTRL, m_csBtnCtrl);
  66. DDX_Text(pDX, IDC_EDIT_PATH, m_csStrPath);
  67. //}}AFX_DATA_MAP
  68. }
  69. BEGIN_MESSAGE_MAP(CFileWatcherDlg, CDialog)
  70. //{{AFX_MSG_MAP(CFileWatcherDlg)
  71. ON_WM_SYSCOMMAND()
  72. ON_WM_PAINT()
  73. ON_WM_QUERYDRAGICON()
  74. ON_NOTIFY(NM_RCLICK, IDC_LIST_DATA, OnRclickListData)
  75. ON_COMMAND(IDR_MNU_OPEN, OnMnuOpen)
  76. ON_COMMAND(IDR_MNU_DELSEL, OnMnuDelsel)
  77. ON_COMMAND(IDR_MNU_DELALL, OnMnuDelall)
  78. ON_BN_CLICKED(IDC_BTN_CTRL, OnBtnCtrl)
  79. ON_WM_SIZE()
  80. //}}AFX_MSG_MAP
  81. END_MESSAGE_MAP()
  82. /////////////////////////////////////////////////////////////////////////////
  83. // CFileWatcherDlg message handlers
  84. BOOL CFileWatcherDlg::OnInitDialog()
  85. {
  86. CDialog::OnInitDialog();
  87. // Add "About..." menu item to system menu.
  88. // IDM_ABOUTBOX must be in the system command range.
  89. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  90. ASSERT(IDM_ABOUTBOX < 0xF000);
  91. CMenu* pSysMenu = GetSystemMenu(FALSE);
  92. if (pSysMenu != NULL)
  93. {
  94. CString strAboutMenu;
  95. strAboutMenu.LoadString(IDS_ABOUTBOX);
  96. if (!strAboutMenu.IsEmpty())
  97. {
  98. pSysMenu->AppendMenu(MF_SEPARATOR);
  99. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  100. }
  101. }
  102. // Set the icon for this dialog. The framework does this automatically
  103. // when the application's main window is not a dialog
  104. SetIcon(m_hIcon, TRUE); // Set big icon
  105. SetIcon(m_hIcon, FALSE); // Set small icon
  106. //=======> 初始化标识符
  107. this->m_bStart = FALSE;
  108. //======> 初始化视图控件
  109. this->InitializeListCtrl();
  110. //======> 创建托盘图标
  111. this->NotifyTray(TRUE);
  112. //=====> 窗口置顶
  113. this->SetWindowPos(&this->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
  114. return TRUE; // return TRUE unless you set the focus to a control
  115. }
  116. void CFileWatcherDlg::OnSysCommand(UINT nID, LPARAM lParam)
  117. {
  118. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  119. {
  120. CAboutDlg dlgAbout;
  121. dlgAbout.DoModal();
  122. }
  123. else
  124. {
  125. CDialog::OnSysCommand(nID, lParam);
  126. }
  127. }
  128. // If you add a minimize button to your dialog, you will need the code below
  129. // to draw the icon. For MFC applications using the document/view model,
  130. // this is automatically done for you by the framework.
  131. void CFileWatcherDlg::OnPaint()
  132. {
  133. if (IsIconic())
  134. {
  135. CPaintDC dc(this); // device context for painting
  136. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  137. // Center icon in client rectangle
  138. int cxIcon = GetSystemMetrics(SM_CXICON);
  139. int cyIcon = GetSystemMetrics(SM_CYICON);
  140. CRect rect;
  141. GetClientRect(&rect);
  142. int x = (rect.Width() - cxIcon + 1) / 2;
  143. int y = (rect.Height() - cyIcon + 1) / 2;
  144. // Draw the icon
  145. dc.DrawIcon(x, y, m_hIcon);
  146. }
  147. else
  148. {
  149. CDialog::OnPaint();
  150. }
  151. }
  152. // The system calls this to obtain the cursor to display while the user drags
  153. // the minimized window.
  154. HCURSOR CFileWatcherDlg::OnQueryDragIcon()
  155. {
  156. return (HCURSOR) m_hIcon;
  157. }
  158. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  159. //【名称】初始化视图列表控件
  160. //【参数】无
  161. //【描述】创建栏目,设置扩展样式
  162. void CFileWatcherDlg::InitializeListCtrl()
  163. {
  164. this->m_csListData.InsertColumn(0, "时间", LVCFMT_LEFT, 75);
  165. this->m_csListData.InsertColumn(1, "动作", LVCFMT_LEFT, 50);
  166. this->m_csListData.InsertColumn(2, "类型", LVCFMT_LEFT, 75);
  167. this->m_csListData.InsertColumn(3, "信息", LVCFMT_LEFT, 500);
  168. //========> 设置扩展样式
  169. this->m_csListData.SetExtendedStyle(
  170. LVS_EX_GRIDLINES |
  171. LVS_EX_FULLROWSELECT |
  172. LVS_EX_FLATSB
  173. );
  174. }
  175. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  176. //【名称】选择目录路径
  177. //【参数】无
  178. //【描述】调用SH函数,弹出目录选择对话框,选择目录
  179. CString CFileWatcherDlg::SelectPath()
  180. {
  181. BROWSEINFO stBrowseInfo;
  182. ITEMIDLIST *lpstIDLst = NULL;
  183. char szPath[MAX_PATH] = {0};
  184. //===========> 初始化结构
  185. stBrowseInfo.hwndOwner = this->m_hWnd;
  186. stBrowseInfo.pidlRoot = NULL;
  187. stBrowseInfo.pszDisplayName = NULL;
  188. stBrowseInfo.lpszTitle = "请选择目录";
  189. stBrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS;
  190. stBrowseInfo.lpfn = NULL;
  191. stBrowseInfo.lParam = 0;
  192. stBrowseInfo.iImage = 0;
  193. //=======> 弹出目录选择对话框
  194. if ((lpstIDLst = ::SHBrowseForFolder(&stBrowseInfo)) == FALSE)
  195. {
  196. return "";
  197. }
  198. //========> 取得目录路径
  199. if (::SHGetPathFromIDList(lpstIDLst, szPath) == FALSE)
  200. {
  201. return "";
  202. }
  203. return szPath;
  204. }
  205. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  206. //【名称】创建程序托盘
  207. //【参数】bCreate 如果TRUE,创建托盘,反之销毁托盘
  208. //【描述】为程序创建托盘,显示在任务栏下方
  209. BOOL CFileWatcherDlg::NotifyTray(BOOL bCreate)
  210. {
  211. NOTIFYICONDATA stNotify = {0};
  212. stNotify.cbSize = sizeof(NOTIFYICONDATA);
  213. stNotify.hIcon = this->m_hIcon;
  214. stNotify.hWnd = this->GetSafeHwnd();
  215. strcpy(stNotify.szTip, "目录监控程序(双击显示窗口)");
  216. stNotify.uCallbackMessage = WM_MY_NOTIFY;
  217. stNotify.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  218. stNotify.uID = IDR_MAINFRAME;
  219. if (bCreate == TRUE)
  220. {
  221. return ::Shell_NotifyIcon(NIM_ADD, &stNotify);
  222. }
  223. return ::Shell_NotifyIcon(NIM_DELETE, &stNotify);
  224. }
  225. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  226. //【名称】视图控件右击过程
  227. //【参数】略
  228. //【描述】右击的是否显示弹出菜单
  229. void CFileWatcherDlg::OnRclickListData(NMHDR* pNMHDR, LRESULT* pResult)
  230. {
  231. *pResult = 0;
  232. CMenu csMenu;
  233. POINT stPos = {0};
  234. //======> 取得当前鼠标位置
  235. ::GetCursorPos(&stPos);
  236. //====> 加载资源菜单
  237. csMenu.LoadMenu(IDR_MNU_POP);
  238. //===========> 判断是否选中有项目
  239. if (this->m_csListData.GetSelectionMark() == -1)
  240. {
  241. csMenu.EnableMenuItem(IDR_MNU_OPEN, MF_GRAYED);
  242. csMenu.EnableMenuItem(IDR_MNU_DELSEL, MF_GRAYED);
  243. }
  244. //==========> 判断是否存在项目
  245. if (this->m_csListData.GetItemCount() == 0)
  246. {
  247. csMenu.EnableMenuItem(IDR_MNU_DELALL, MF_GRAYED);
  248. }
  249. //======> 弹出菜单
  250. csMenu.GetSubMenu(0)->TrackPopupMenu(
  251. TPM_LEFTALIGN,
  252. stPos.x,
  253. stPos.y,
  254. this);
  255. }
  256. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  257. //【名称】菜单“打开”过程
  258. //【参数】略
  259. //【描述】打开视图控件缓冲区中的路径
  260. void CFileWatcherDlg::OnMnuOpen()
  261. {
  262. int nItem = 0;
  263. DWORD dwAct = 0;
  264. CString csStrShell, csStrInfo;
  265. HINSTANCE hInst = NULL;
  266. this->UpdateData();
  267. nItem = this->m_csListData.GetSelectionMark();
  268. dwAct = this->m_csListData.GetItemData(nItem);
  269. switch (dwAct)
  270. {
  271. case CWatcher::actRenameNew:
  272. {
  273. //=======> 取得内容
  274. csStrInfo = this->m_csListData.GetItemText(nItem, 3);
  275. //======== 计算路径
  276. csStrShell =
  277. this->m_csStrPath +
  278. "\\" +
  279. csStrInfo.Mid(csStrInfo.Find(" -> ", 0), csStrInfo.GetLength());
  280. }
  281. break;
  282. case CWatcher::actRemote:
  283. {
  284. MessageBox("你会数据恢复吗?");
  285. // 返回
  286. return;
  287. }
  288. break;
  289. case CWatcher::actCreate:
  290. case CWatcher::actChange:
  291. {
  292. //======> 计算路径
  293. csStrShell =
  294. this->m_csStrPath +
  295. "\\" +
  296. this->m_csListData.GetItemText(nItem, 3);
  297. }
  298. break;
  299. }
  300. //======> 打开
  301. hInst = ::ShellExecute(NULL,
  302. "open",
  303. csStrShell,
  304. NULL,
  305. NULL,
  306. SW_SHOWNORMAL);
  307. if (hInst == NULL)
  308. {
  309. MessageBox("你当我是生产队?");
  310. }
  311. }
  312. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  313. //【名称】菜单“删除选择”过程
  314. //【参数】略
  315. //【描述】删除视图控件当前选中的项目
  316. void CFileWatcherDlg::OnMnuDelsel()
  317. {
  318. this->m_csListData.DeleteItem(
  319. this->m_csListData.GetSelectionMark()
  320. );
  321. }
  322. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  323. //【名称】菜单“删除所有”过程
  324. //【参数】略
  325. //【描述】删除视图控件所有项目
  326. void CFileWatcherDlg::OnMnuDelall()
  327. {
  328. this->m_csListData.DeleteAllItems();
  329. }
  330. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  331. //【名称】开始\结束目录监视
  332. //【参数】略
  333. //【描述】调用CWatcher::Create开始创建目录监视
  334. void CFileWatcherDlg::OnBtnCtrl()
  335. {
  336. this->UpdateData();
  337. if (this->m_bStart == FALSE)
  338. {
  339. if (this->m_csWatcher.Create(this->m_csStrPath) == FALSE)
  340. {
  341. this->MessageBox("监视目录失败");
  342. }
  343. else
  344. {
  345. this->m_bStart = TRUE;
  346. this->m_csEdtPath.EnableWindow(FALSE);
  347. this->m_csBtnCtrl.SetWindowText("停止");
  348. }
  349. }
  350. else
  351. {
  352. this->m_csWatcher.Destroy();
  353. this->m_bStart = FALSE;
  354. this->m_csEdtPath.EnableWindow(TRUE);
  355. this->m_csBtnCtrl.SetWindowText("开始");
  356. }
  357. }
  358. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  359. //【名称】未转换的消息处理过程
  360. //【参数】略
  361. //【描述】继承此虚拟函数来处理,在Edit里面的双击事件
  362. BOOL CFileWatcherDlg::PreTranslateMessage(MSG* pMsg)
  363. {
  364. if (pMsg->message == WM_LBUTTONDBLCLK)
  365. {
  366. if (pMsg->hwnd == this->m_csEdtPath.m_hWnd)
  367. {
  368. //=========> 判断是否已经开始
  369. if (this->m_bStart == FALSE)
  370. {
  371. //======> 取得选中目录纪路径
  372. this->m_csEdtPath.SetWindowText(this->SelectPath());
  373. }
  374. }
  375. }
  376. return CDialog::PreTranslateMessage(pMsg);
  377. }
  378. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  379. //【名称】消息处理过程
  380. //【参数】略
  381. //【描述】继承此虚拟函数来处理,在托盘里面的双击事件
  382. LRESULT CFileWatcherDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  383. {
  384. if (message == WM_MY_NOTIFY)
  385. {
  386. if (lParam == WM_LBUTTONDBLCLK)
  387. {
  388. //=====> 显示窗口
  389. ShowWindow(SW_RESTORE);
  390. //=====> 激活窗口
  391. SetForegroundWindow();
  392. }
  393. }
  394. return CDialog::WindowProc(message, wParam, lParam);
  395. }
  396. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  397. //【名称】程序退出过程
  398. //【参数】略
  399. //【描述】删除了调用基类的OnOK事件,以免按回车退出程序
  400. void CFileWatcherDlg::OnOK()
  401. {
  402. // CDialog::OnOK() 取消了此事件
  403. }
  404. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  405. //【名称】程序退出过程
  406. //【参数】略
  407. //【描述】退出时候,弹出消息框,提示用户时候退出。销毁监视,删除托盘图标
  408. void CFileWatcherDlg::OnCancel()
  409. {
  410. if (::AfxMessageBox("你是否要退出程序?", MB_YESNO | MB_ICONSTOP) == IDYES)
  411. {
  412. this->NotifyTray(FALSE);
  413. this->m_csWatcher.Destroy();
  414. CDialog::OnCancel();
  415. }
  416. }
  417. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  418. //【名称】窗口尺寸改变过程
  419. //【参数】略
  420. //【描述】主要利用此过程完成程序最小化的时候隐藏
  421. void CFileWatcherDlg::OnSize(UINT nType, int cx, int cy)
  422. {
  423. CDialog::OnSize(nType, cx, cy);
  424. if (nType == SIZE_MINIMIZED)
  425. {
  426. this->ShowWindow(SW_HIDE);
  427. }
  428. }
  429. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  430. //【名称】判断是否是一个文件夹
  431. //【参数】lpszPath 判断路径
  432. //【描述】取得文件夹属性,然后,与 比较,返回
  433. BOOL CFileWatcherDlg::IsFolder(LPCTSTR lpszPath)
  434. {
  435. DWORD dwAttrib = 0;
  436. dwAttrib = GetFileAttributes(lpszPath);
  437. return (dwAttrib != -1) &&
  438. ((dwAttrib & FILE_ATTRIBUTE_DIRECTORY)?TRUE:FALSE);
  439. }
  440. //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  441. //【名称】监控过程
  442. //【参数】dwAction 动作类型。csStrName1, csStrName2 相关名称
  443. //【描述】处理动作,不要调用Destroy。来自CWatcher转发
  444. void CFileWatcherDlg::OnWatch(DWORD dwAct, CString csStrName1, CString csStrName2)
  445. {
  446. CString csStrTime, csStrAct, csStrType,
  447. csStrPath , csStrInfo;
  448. int nItem = 0;
  449. //=======> 取得时间
  450. csStrTime = ::CTime::GetCurrentTime().Format("%H:%M:%S");
  451. //=========> 取得全路径
  452. csStrPath = m_csStrPath + "\\" + csStrName1; // Only 1
  453. //========> 判断类型,生成字符串
  454. if (this->IsFolder(csStrPath) == TRUE)
  455. {
  456. csStrType = "文件夹";
  457. }
  458. else
  459. {
  460. csStrType = "文件";
  461. }
  462. //==========> 判断类型
  463. switch (dwAct)
  464. {
  465. case CWatcher::actCreate:
  466. {
  467. csStrAct = "创建";
  468. csStrInfo = csStrName1;
  469. }
  470. break;
  471. case CWatcher::actRemote:
  472. {
  473. csStrAct = "删除";
  474. csStrInfo = csStrName1;
  475. }
  476. break;
  477. case CWatcher::actRenameNew:
  478. {
  479. csStrAct = "重命";
  480. csStrInfo = csStrName1 + " -> " + csStrName2;
  481. }
  482. break;
  483. case CWatcher::actChange:
  484. {
  485. csStrAct = "更改";
  486. csStrInfo = csStrName1;
  487. }
  488. break;
  489. }
  490. //============> 添加信息到视图控件
  491. nItem = this->m_csListData.InsertItem(0, csStrTime);
  492. this->m_csListData.SetItemText(nItem, 1, csStrAct);
  493. this->m_csListData.SetItemText(nItem, 2, csStrType);
  494. this->m_csListData.SetItemText(nItem, 3, csStrInfo);
  495. //=========> 保存动作到控件内部
  496. this->m_csListData.SetItemData(nItem, dwAct);
  497. }