gusucode.com > 基于VC编程界面编程高级应用技术源码程序 > VC界面编程高级应用技术/code/2/TaxExpert/Top1.cpp
// Top.cpp : implementation file // #include "stdafx.h" #include "resource.h" #include "Top1.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTop #include "ProgressBar.h" IMPLEMENT_DYNCREATE(CTop, CListView) CTop::CTop() { Detail_old=""; IsFuzzyFind=0; TCHAR s[MAX_PATH]; GetModuleFileName(NULL,s,MAX_PATH); TCHAR szDir[MAX_PATH]; TCHAR szDrv[MAX_PATH]; _splitpath(s,szDrv,szDir,NULL,NULL); htmlpath=(CString)szDrv+(CString)szDir; htmlpath+="kingdom\\"; //建立临时目录 if(!CreateDirectory((LPSTR)(LPCSTR)htmlpath,0)) MessageBox("上次未正常关闭此程序!","提示",MB_ICONEXCLAMATION|MB_OK); } CTop::~CTop() { //退出程序时清空临时目录下的所有文件 DeleteTree(htmlpath); } BEGIN_MESSAGE_MAP(CTop, CListView) //{{AFX_MSG_MAP(CTop) ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged) ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP ON_MESSAGE(WM_RECONSTRUCT,ReconstructListView) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTop drawing void CTop::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); } ///////////////////////////////////////////////////////////////////////////// // CTop diagnostics #ifdef _DEBUG void CTop::AssertValid() const { CListView::AssertValid(); } void CTop::Dump(CDumpContext& dc) const { CListView::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CTop message handlers #include "TaxExpertDoc.h" void CTop::OnInitialUpdate() { //在列表视图中添加字段(列表项标题) CListView::OnInitialUpdate(); CListCtrl& ListCtrl = GetListCtrl(); ListCtrl.InsertColumn(0, _T(" 文号"), LVCFMT_LEFT); ListCtrl.InsertColumn(1, _T(" 文件名称"), LVCFMT_LEFT); ListCtrl.InsertColumn(2, _T(" 文件种类"), LVCFMT_LEFT); ListCtrl.InsertColumn(3, _T(" 发布时间"), LVCFMT_LEFT); ListCtrl.InsertColumn(4, _T(" 索引值"), LVCFMT_LEFT); int i=0; CTaxExpertDoc * pDOC=(CTaxExpertDoc *)GetDocument(); //在加入记录时,不进行重绘 ListCtrl.SetRedraw(0); pDOC->m_pSet->MoveFirst(); for( i=0;i<50;i++) { //添加50条空记录 ListCtrl.InsertItem(i,"NULL"); } CString filter="[content] like'*税*'"; //数据集是保存在CTaxExpertDoc中的 pDOC->m_pSet->m_strFilter=filter; //使用pub_time字段进行降序排序 pDOC->m_pSet->m_strSort="pub_time DESC"; pDOC->m_pSet->Requery(); pDOC->m_pSet->MoveFirst(); CString num; int k; for( i=0;i<50;i++) { ListCtrl.SetItemText(i,0,pDOC->m_pSet->m_file_num); ListCtrl.SetItemText(i,1,pDOC->m_pSet->m_fileName); ListCtrl.SetItemText(i,2,pDOC->m_pSet->m_cata); ListCtrl.SetItemText(i,3,pDOC->m_pSet->m_pub_time); //将顺序号转换成字符串 k=pDOC->m_pSet->m_num; num.Format("%d",k); ListCtrl.SetItemText(i,4,num); pDOC->m_pSet->MoveNext(); } for( i=0;i<4;i++) { //分别设置列表宽度 ListCtrl.SetColumnWidth(i, 200); } //设置第一列宽度 ListCtrl.SetColumnWidth(1, 400); //进行重绘 ListCtrl.SetRedraw(1); } BOOL CTop::PreCreateWindow(CREATESTRUCT& cs) { //设定LISTVIEW的风格--LVS_SINGLESEL单选 cs.style|=WS_HSCROLL|WS_VSCROLL|LVS_SINGLESEL|LVS_REPORT; return CListView::PreCreateWindow(cs); } void CTop::OnLButtonDown(UINT nFlags, CPoint point) { //启用整行全选功能 SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0,LVS_EX_FULLROWSELECT ) ; CListView::OnLButtonDown(nFlags, point); } /*WM_RECONSTRUCT消息的响应函数 功能:更新文件列表的内容,然后按Query_Mode(查询方式) LPARAM detail(税种)来重新定制列表框的内容 */ void CTop::ReconstructListView(WPARAM Query_Mode,LPARAM detail) { IsFuzzyFind=0; //将关键词数据清空 for(int kk=0;kk<100;kk++) KeyWord[kk].Empty(); CString detail_dsc((LPCSTR)detail); //所进行的查询并未有变化,不用再查 if((detail_dsc==Detail_old)) return; //Detail_old记录每次查询的内容 Detail_old=detail_dsc; //得到视图的列表框控件 CListCtrl& ListCtrl = GetListCtrl(); BeginWaitCursor(); //清空列表框的列表项 if(!(ListCtrl.DeleteAllItems())) return; //根据detail_dsc内容在数据库中进行模糊查询 CTaxExpertDoc * pDOC=(CTaxExpertDoc *)GetDocument(); //设置过滤条件 CString filter="[cata] like "; detail_dsc="'*"+detail_dsc+"*'"; filter+=detail_dsc; //如果进行的是模糊查询,清空临时目录下的所有文件 if(Query_Mode==ID_FUZZY_FIND) { DeleteTree(htmlpath+"*.*"); IsFuzzyFind=1; filter=(LPCSTR)detail; CString sk=filter; //将关键词存入数组,在便在显示时设置关键词格式 sk.Replace("AND content like'*",""); sk.Replace("content like'*",""); int find=0; int pos=0; int pos2=0; for(int i=0;i<100;i++) { pos=sk.Find("*'"); if(pos==-1) i=100; else { KeyWord[i]=sk.Mid(0,pos); sk=sk.Mid(pos+2); find+=1; } } } else IsFuzzyFind=0; pDOC->m_pSet->m_strFilter=filter; //按发文时间排序 pDOC->m_pSet->m_strSort="pub_time DESC"; //进行数据查询 pDOC->m_pSet->Requery(); long int iFound=pDOC->m_pSet->GetRecordCount(); if(iFound==0) { MessageBox("请确认你下以下几方面是否正确\r\n\r\n \ 1.输入的内容是否正确? 请缩小查询范围!\r\n\r\n \ 2.多级查询中的加号是不是半角字符?", "查询提示:未找到查询结果",MB_ICONQUESTION|MB_OK ); pDOC->m_pSet->m_strFilter=""; pDOC->m_pSet->Requery(); return ; } //状态栏上显示查询进度条 CProgressBar ProgressBar(_T("正在准备数据"), 30, 10000,1); ProgressBar.SetRange(0,iFound); pDOC->m_pSet->MoveLast(); iFound=pDOC->m_pSet->GetRecordCount(); pDOC->m_pSet->MoveFirst(); CString item[5]; CString num; int k; CDaoSF * Set=pDOC->m_pSet; pDOC->m_pSet->MoveFirst(); //根据检索结果在列表框中新增记录 ListCtrl.SetRedraw(0); for(int i=0;i<iFound;i++) { item[0]=Set->m_file_num; item[1]=Set->m_fileName; item[2]=Set->m_cata; item[3]=Set->m_pub_time; k=Set->m_num; num.Format("%d",k); item[4]=num; ListCtrl.InsertItem(i,item[0]); for( int j=1;j<5;j++) { //设置各列表项的内容 ListCtrl.SetItemText(i,j,item[j]); } //设置状态栏上的进度条的进度 ProgressBar.SetPos(i*2); pDOC->m_pSet->MoveNext(); } EndWaitCursor(); //重绘列表框的列表项 ListCtrl.SetRedraw(1); } /*DynaCrateHtml:在临时目录中创建一HTML文件 fileindex:文件索引号 content:文件内容 title:文件标题 返回值:创建完成的HTML文件名(索引号.DAT) */ #include "resource.h" CString CTop::DynaCrateHtml(CString fileindex,CString content,CString title) { CString Header,tail,body,aftertile; //格式化的HTTML文件头及文件尾 //IDS_BANNER:预定义的HTML文件头格式 Header.LoadString(IDS_BANNER); //文件结束时的红线 tail="<hr color=\"#FF0000\">"; tail+="<p align=\"center\"><span \ style=\"font-size: 9pt\">税务师欢迎你</span></p>"; Header+=title; //标题后的红线条 aftertile.LoadString(IDS_BANNERAFTERTILE); Header+=aftertile; CFile tempFile; CString filename=htmlpath+fileindex+".dat"; //如果文件已经存在,不用创建 if(IsFileExist(filename)) { return filename; } else { tempFile.Open(filename,CFile::modeCreate|CFile::modeReadWrite); content.TrimLeft(); content.TrimRight(); if(content.IsEmpty()) content="空记录,无内容"; //将字符串转换中的回转换行转换成HTML中的“回车” content.Replace("\r\n","<br>" ); //如果进行的是全文模糊查询,将所有关键词用红色标记出来 if(IsFuzzyFind) { CString newformat; for(int i=0;i<100;i++) { KeyWord[i].TrimLeft(); KeyWord[i].TrimRight(); if(KeyWord[i].IsEmpty()) i=100; else { newformat="<font color=\"#FF0000\">"; newformat+=KeyWord[i]; newformat+="</font>"; content.Replace(KeyWord[i],newformat); } } } body=Header+content+tail; tempFile.Write(body,body.GetLength()); tempFile.Close(); return filename; } } /* 列表框选择的内容变化时的响应函数,当选择发生变动时 1、根据当前列表项所记录的文件索引值在数据库中定位数据 2、根据当前m_content字段的内容在临时目录下生成 一个HTML文件,以文号作为文件标题 3、通过父窗口通知CContainerView进行HTML文件的显示 */ #include "MainFrm.h" #include "TaxExpertView.h" void CTop::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult) { HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; *pResult = 0; CTaxExpertDoc * pDOC=(CTaxExpertDoc *)GetDocument(); int num=pDOC->m_pSet->m_num; CString tempname; int i=GetListCtrl().GetNextItem(-1,LVNI_SELECTED); //得到当前选项 if(i>-1) { //得到所选文件的文号 tempname=GetListCtrl().GetItemText(i,4); CFile tempFile; CString filename=htmlpath+"/"+tempname+".html"; CString url=filename; //如果临时目录下没有该文件,新建一个 if(!IsFileExist(filename)) { CString filter="[num]="+tempname; pDOC->m_pSet->m_strFilter=filter; //重新检索 pDOC->m_pSet->Requery(); //构造红头文件:标题+换行+文号 CString Title=pDOC->m_pSet->m_fileName; Title+="<br>"; Title+=pDOC->m_pSet->m_file_num; //创建HTML文件 url=DynaCrateHtml(tempname,pDOC->m_pSet->m_content,Title); } //通知父窗口,让CContainerView显示url文件 ::SendMessage(AfxGetMainWnd()->m_hWnd, WM_INTERACTIVE_WITH_FRAME,ID_FROM_LIST,(WPARAM)(LPCSTR)url); } } //删除指定位置的文件或目录 void CTop::DeleteTree(CString szBeDeletePath) { SHFILEOPSTRUCT sf = {0}; sf.wFunc = FO_DELETE; if(szBeDeletePath.Find("*")==-1)//删目录 szBeDeletePath.SetAt(szBeDeletePath.GetLength()-1,0); else//删文件 szBeDeletePath.SetAt(szBeDeletePath.GetLength()+1,0); sf.pFrom = szBeDeletePath; sf.fFlags = FOF_NOERRORUI |FOF_SILENT|FOF_NOCONFIRMATION ; SHFileOperation(&sf); } //判断strFileName文件是否存在 BOOL CTop::IsFileExist(CString strFileName) { CFileStatus sta; CFile tempFile; BOOL IsExist=tempFile.GetStatus(strFileName,sta); return IsExist; }