www.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;
}