Top1.cpp
上传用户:szcysw
上传日期:2013-03-11
资源大小:6752k
文件大小:10k
源码类别:

界面编程

开发平台:

Visual C++

  1. // Top.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "resource.h"
  5. #include "Top1.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CTop
  13. #include "ProgressBar.h"
  14. IMPLEMENT_DYNCREATE(CTop, CListView)
  15. CTop::CTop()
  16. {
  17. Detail_old="";
  18. IsFuzzyFind=0;
  19. TCHAR s[MAX_PATH];
  20. GetModuleFileName(NULL,s,MAX_PATH);
  21. TCHAR szDir[MAX_PATH];
  22. TCHAR szDrv[MAX_PATH];
  23. _splitpath(s,szDrv,szDir,NULL,NULL);
  24. htmlpath=(CString)szDrv+(CString)szDir;
  25. htmlpath+="kingdom\";
  26. //建立临时目录
  27. if(!CreateDirectory((LPSTR)(LPCSTR)htmlpath,0))
  28. MessageBox("上次未正常关闭此程序!","提示",MB_ICONEXCLAMATION|MB_OK);
  29. }
  30. CTop::~CTop()
  31. {
  32. //退出程序时清空临时目录下的所有文件
  33. DeleteTree(htmlpath);
  34. }
  35. BEGIN_MESSAGE_MAP(CTop, CListView)
  36. //{{AFX_MSG_MAP(CTop)
  37. ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
  38. ON_WM_LBUTTONDOWN()
  39. //}}AFX_MSG_MAP
  40. ON_MESSAGE(WM_RECONSTRUCT,ReconstructListView)
  41. END_MESSAGE_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CTop drawing
  44. void CTop::OnDraw(CDC* pDC)
  45. {
  46. CDocument* pDoc = GetDocument();
  47. }
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CTop diagnostics
  50. #ifdef _DEBUG
  51. void CTop::AssertValid() const
  52. {
  53. CListView::AssertValid();
  54. }
  55. void CTop::Dump(CDumpContext& dc) const
  56. {
  57. CListView::Dump(dc);
  58. }
  59. #endif //_DEBUG
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CTop message handlers
  62. #include "TaxExpertDoc.h"
  63. void CTop::OnInitialUpdate() 
  64. {
  65. //在列表视图中添加字段(列表项标题)
  66. CListView::OnInitialUpdate();
  67. CListCtrl& ListCtrl = GetListCtrl();
  68. ListCtrl.InsertColumn(0, _T(" 文号"), LVCFMT_LEFT);
  69. ListCtrl.InsertColumn(1, _T(" 文件名称"), LVCFMT_LEFT);
  70. ListCtrl.InsertColumn(2, _T(" 文件种类"), LVCFMT_LEFT);
  71. ListCtrl.InsertColumn(3, _T(" 发布时间"), LVCFMT_LEFT);
  72. ListCtrl.InsertColumn(4, _T(" 索引值"), LVCFMT_LEFT);
  73. int i=0;
  74. CTaxExpertDoc * pDOC=(CTaxExpertDoc *)GetDocument();
  75. //在加入记录时,不进行重绘
  76. ListCtrl.SetRedraw(0);
  77. pDOC->m_pSet->MoveFirst();
  78. for( i=0;i<50;i++)
  79. {
  80. //添加50条空记录
  81. ListCtrl.InsertItem(i,"NULL");
  82. }
  83. CString filter="[content] like'*税*'"; 
  84. //数据集是保存在CTaxExpertDoc中的
  85. pDOC->m_pSet->m_strFilter=filter;
  86. //使用pub_time字段进行降序排序
  87. pDOC->m_pSet->m_strSort="pub_time DESC";
  88. pDOC->m_pSet->Requery();
  89. pDOC->m_pSet->MoveFirst();
  90. CString num;
  91. int k;
  92. for( i=0;i<50;i++)
  93. {
  94. ListCtrl.SetItemText(i,0,pDOC->m_pSet->m_file_num);
  95. ListCtrl.SetItemText(i,1,pDOC->m_pSet->m_fileName);
  96. ListCtrl.SetItemText(i,2,pDOC->m_pSet->m_cata);
  97. ListCtrl.SetItemText(i,3,pDOC->m_pSet->m_pub_time);
  98. //将顺序号转换成字符串
  99. k=pDOC->m_pSet->m_num;
  100. num.Format("%d",k);
  101. ListCtrl.SetItemText(i,4,num);
  102. pDOC->m_pSet->MoveNext();
  103. }
  104. for( i=0;i<4;i++)
  105. {
  106. //分别设置列表宽度
  107. ListCtrl.SetColumnWidth(i, 200);
  108. }
  109. //设置第一列宽度 
  110. ListCtrl.SetColumnWidth(1, 400);
  111. //进行重绘
  112. ListCtrl.SetRedraw(1);
  113. }
  114. BOOL CTop::PreCreateWindow(CREATESTRUCT& cs) 
  115. {
  116. //设定LISTVIEW的风格--LVS_SINGLESEL单选
  117. cs.style|=WS_HSCROLL|WS_VSCROLL|LVS_SINGLESEL|LVS_REPORT;
  118. return CListView::PreCreateWindow(cs);
  119. }
  120. void CTop::OnLButtonDown(UINT nFlags, CPoint point) 
  121. {
  122. //启用整行全选功能   
  123. SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,LVS_EX_FULLROWSELECT ) ;
  124. CListView::OnLButtonDown(nFlags, point);
  125. }
  126. /*WM_RECONSTRUCT消息的响应函数
  127. 功能:更新文件列表的内容,然后按Query_Mode(查询方式)
  128. LPARAM detail(税种)来重新定制列表框的内容
  129. */
  130. void CTop::ReconstructListView(WPARAM Query_Mode,LPARAM detail)
  131. {
  132. IsFuzzyFind=0;
  133. //将关键词数据清空
  134. for(int kk=0;kk<100;kk++)
  135. KeyWord[kk].Empty();
  136. CString detail_dsc((LPCSTR)detail);
  137. //所进行的查询并未有变化,不用再查
  138. if((detail_dsc==Detail_old))
  139. return;
  140. //Detail_old记录每次查询的内容
  141. Detail_old=detail_dsc;
  142. //得到视图的列表框控件
  143. CListCtrl& ListCtrl = GetListCtrl();
  144. BeginWaitCursor();
  145. //清空列表框的列表项
  146. if(!(ListCtrl.DeleteAllItems()))
  147. return;
  148. //根据detail_dsc内容在数据库中进行模糊查询
  149. CTaxExpertDoc * pDOC=(CTaxExpertDoc *)GetDocument();
  150. //设置过滤条件
  151. CString filter="[cata] like  ";
  152. detail_dsc="'*"+detail_dsc+"*'";
  153. filter+=detail_dsc;
  154. //如果进行的是模糊查询,清空临时目录下的所有文件
  155. if(Query_Mode==ID_FUZZY_FIND)
  156. {
  157. DeleteTree(htmlpath+"*.*");
  158. IsFuzzyFind=1;
  159. filter=(LPCSTR)detail;
  160. CString sk=filter;
  161. //将关键词存入数组,在便在显示时设置关键词格式
  162. sk.Replace("AND content like'*","");
  163. sk.Replace("content like'*","");
  164. int find=0;
  165. int pos=0;
  166. int pos2=0;
  167. for(int i=0;i<100;i++)
  168. {
  169. pos=sk.Find("*'");
  170. if(pos==-1)
  171. i=100;
  172. else
  173. {
  174. KeyWord[i]=sk.Mid(0,pos);
  175. sk=sk.Mid(pos+2);
  176. find+=1;
  177. }
  178. }
  179. }
  180. else
  181. IsFuzzyFind=0;
  182. pDOC->m_pSet->m_strFilter=filter;
  183. //按发文时间排序
  184. pDOC->m_pSet->m_strSort="pub_time DESC";
  185. //进行数据查询
  186. pDOC->m_pSet->Requery();
  187. long int iFound=pDOC->m_pSet->GetRecordCount();
  188. if(iFound==0)
  189. {
  190. MessageBox("请确认你下以下几方面是否正确rnrn 
  191. 1.输入的内容是否正确? 请缩小查询范围!rnrn 
  192. 2.多级查询中的加号是不是半角字符?",
  193. "查询提示:未找到查询结果",MB_ICONQUESTION|MB_OK );
  194. pDOC->m_pSet->m_strFilter="";
  195. pDOC->m_pSet->Requery();
  196. return ;
  197. }
  198. //状态栏上显示查询进度条
  199. CProgressBar ProgressBar(_T("正在准备数据"), 30, 10000,1);
  200. ProgressBar.SetRange(0,iFound);
  201. pDOC->m_pSet->MoveLast();
  202. iFound=pDOC->m_pSet->GetRecordCount();
  203. pDOC->m_pSet->MoveFirst();
  204. CString item[5];
  205. CString num;
  206. int k;
  207. CDaoSF * Set=pDOC->m_pSet;
  208. pDOC->m_pSet->MoveFirst();
  209. //根据检索结果在列表框中新增记录
  210. ListCtrl.SetRedraw(0);
  211. for(int i=0;i<iFound;i++)
  212. {
  213. item[0]=Set->m_file_num;
  214. item[1]=Set->m_fileName;
  215. item[2]=Set->m_cata;
  216. item[3]=Set->m_pub_time;
  217. k=Set->m_num;
  218. num.Format("%d",k);
  219. item[4]=num;
  220. ListCtrl.InsertItem(i,item[0]);
  221. for( int j=1;j<5;j++)
  222. { //设置各列表项的内容
  223. ListCtrl.SetItemText(i,j,item[j]);
  224. }
  225. //设置状态栏上的进度条的进度
  226. ProgressBar.SetPos(i*2);
  227. pDOC->m_pSet->MoveNext();
  228. }
  229. EndWaitCursor();
  230. //重绘列表框的列表项
  231. ListCtrl.SetRedraw(1);
  232. }
  233. /*DynaCrateHtml:在临时目录中创建一HTML文件
  234. fileindex:文件索引号
  235. content:文件内容
  236. title:文件标题
  237. 返回值:创建完成的HTML文件名(索引号.DAT)
  238. */
  239. #include "resource.h"
  240. CString CTop::DynaCrateHtml(CString fileindex,CString content,CString title) 
  241. {
  242. CString Header,tail,body,aftertile;
  243. //格式化的HTTML文件头及文件尾
  244. //IDS_BANNER:预定义的HTML文件头格式
  245. Header.LoadString(IDS_BANNER);
  246. //文件结束时的红线
  247. tail="<hr color="#FF0000">";
  248. tail+="<p align="center"><span 
  249. style="font-size: 9pt">税务师欢迎你</span></p>";
  250. Header+=title;
  251. //标题后的红线条
  252. aftertile.LoadString(IDS_BANNERAFTERTILE);
  253. Header+=aftertile;
  254. CFile tempFile;
  255. CString filename=htmlpath+fileindex+".dat";
  256. //如果文件已经存在,不用创建
  257. if(IsFileExist(filename))
  258. {
  259. return filename;
  260. }
  261. else
  262. {
  263. tempFile.Open(filename,CFile::modeCreate|CFile::modeReadWrite);
  264. content.TrimLeft();
  265. content.TrimRight();
  266. if(content.IsEmpty())
  267. content="空记录,无内容";
  268. //将字符串转换中的回转换行转换成HTML中的“回车”
  269. content.Replace("rn","<br>" );
  270. //如果进行的是全文模糊查询,将所有关键词用红色标记出来
  271. if(IsFuzzyFind)
  272. {
  273. CString newformat;
  274. for(int i=0;i<100;i++)
  275. {
  276. KeyWord[i].TrimLeft();
  277. KeyWord[i].TrimRight();
  278. if(KeyWord[i].IsEmpty())
  279. i=100;
  280. else
  281. {
  282. newformat="<font color="#FF0000">";
  283. newformat+=KeyWord[i];
  284. newformat+="</font>";
  285. content.Replace(KeyWord[i],newformat);
  286. }
  287. }
  288. }
  289. body=Header+content+tail;
  290. tempFile.Write(body,body.GetLength()); 
  291. tempFile.Close();
  292. return filename;
  293. }
  294. }
  295. /*
  296. 列表框选择的内容变化时的响应函数,当选择发生变动时
  297. 1、根据当前列表项所记录的文件索引值在数据库中定位数据
  298. 2、根据当前m_content字段的内容在临时目录下生成
  299. 一个HTML文件,以文号作为文件标题
  300. 3、通过父窗口通知CContainerView进行HTML文件的显示
  301. */
  302. #include "MainFrm.h"
  303. #include "TaxExpertView.h"
  304. void CTop::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  305. {
  306. HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
  307. *pResult = 0;
  308. CTaxExpertDoc * pDOC=(CTaxExpertDoc *)GetDocument();
  309. int num=pDOC->m_pSet->m_num;
  310. CString tempname;
  311. int i=GetListCtrl().GetNextItem(-1,LVNI_SELECTED);
  312. //得到当前选项
  313. if(i>-1)
  314. {
  315. //得到所选文件的文号
  316. tempname=GetListCtrl().GetItemText(i,4);
  317. CFile tempFile;
  318. CString filename=htmlpath+"/"+tempname+".html";
  319. CString url=filename;
  320. //如果临时目录下没有该文件,新建一个
  321. if(!IsFileExist(filename))
  322. {
  323. CString filter="[num]="+tempname;
  324. pDOC->m_pSet->m_strFilter=filter;
  325. //重新检索
  326. pDOC->m_pSet->Requery();
  327. //构造红头文件:标题+换行+文号
  328. CString Title=pDOC->m_pSet->m_fileName;
  329. Title+="<br>";
  330. Title+=pDOC->m_pSet->m_file_num;
  331. //创建HTML文件
  332. url=DynaCrateHtml(tempname,pDOC->m_pSet->m_content,Title);
  333. }
  334. //通知父窗口,让CContainerView显示url文件
  335. ::SendMessage(AfxGetMainWnd()->m_hWnd,
  336. WM_INTERACTIVE_WITH_FRAME,ID_FROM_LIST,(WPARAM)(LPCSTR)url);
  337. }
  338. //删除指定位置的文件或目录
  339. void CTop::DeleteTree(CString szBeDeletePath)
  340. {
  341. SHFILEOPSTRUCT sf = {0};
  342. sf.wFunc = FO_DELETE;
  343. if(szBeDeletePath.Find("*")==-1)//删目录
  344. szBeDeletePath.SetAt(szBeDeletePath.GetLength()-1,0);
  345. else//删文件
  346. szBeDeletePath.SetAt(szBeDeletePath.GetLength()+1,0);
  347. sf.pFrom = szBeDeletePath;
  348. sf.fFlags = FOF_NOERRORUI |FOF_SILENT|FOF_NOCONFIRMATION  ;
  349. SHFileOperation(&sf);
  350. }
  351. //判断strFileName文件是否存在
  352. BOOL CTop::IsFileExist(CString strFileName)
  353. {
  354. CFileStatus sta; 
  355. CFile tempFile;
  356. BOOL IsExist=tempFile.GetStatus(strFileName,sta);
  357. return IsExist;
  358. }