📄 findpage.cpp
字号:
// FindPage.cpp : implementation file
//
#include "stdafx.h"
#include "Made.h"
#include "FindPage.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFindPage property page
UINT FindPro(LPVOID lpParam)
{
CFindPage * p=(CFindPage *)lpParam;
p->Find();
p->GetDlgItem(IDC_FIND_STOP)->EnableWindow(0);
p->GetDlgItem(IDC_FIND_PAUSE)->EnableWindow(0);
p->GetDlgItem(IDC_FIND)->EnableWindow();
p->GetDlgItem(IDC_FIND_STR)->EnableWindow();
p->GetDlgItem(IDC_FIND_WORD)->EnableWindow();
p->GetDlgItem(IDC_FIND_ASC)->EnableWindow();
p->GetDlgItem(IDC_FIND_SIT)->EnableWindow();
return 0;
}
IMPLEMENT_DYNCREATE(CFindPage, CPropertyPage)
CFindPage::CFindPage() : CPropertyPage(CFindPage::IDD)
{
//{{AFX_DATA_INIT(CFindPage)
m_Findflag = 0;
m_AscStr = _T("");
m_FindStr = _T("");
m_Sit = _T("");
//}}AFX_DATA_INIT
pfile=0;
}
CFindPage::~CFindPage()
{
}
void CFindPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFindPage)
DDX_Control(pDX, IDC_FIND_PROGRESS, m_Progress);
DDX_Control(pDX, IDC_FIND_PAUSE, m_Pause);
DDX_Control(pDX, IDC_FIND_FILE, m_File);
DDX_Radio(pDX, IDC_FIND_WORD, m_Findflag);
DDX_Text(pDX, IDC_FIND_ASCII, m_AscStr);
DDX_Text(pDX, IDC_FIND_STR, m_FindStr);
DDX_Text(pDX, IDC_FIND_SIT, m_Sit);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFindPage, CPropertyPage)
//{{AFX_MSG_MAP(CFindPage)
ON_BN_CLICKED(IDC_FIND_WORD, OnFineWord)
ON_BN_CLICKED(IDC_FIND_ASC, OnFindRascii)
ON_EN_CHANGE(IDC_FIND_STR, OnChangeFindStr)
ON_BN_CLICKED(IDC_FIND, OnFind)
ON_EN_CHANGE(IDC_FIND_ASCII, OnChangeFindEascii)
ON_BN_CLICKED(IDC_FIND_LOOK, OnFindLook)
ON_BN_CLICKED(IDC_FIND_PAUSE, OnFindPause)
ON_BN_CLICKED(IDC_FIND_STOP, OnFindStop)
ON_EN_KILLFOCUS(IDC_FIND_ASCII, OnKillfocusFindEascii)
ON_EN_CHANGE(IDC_FIND_SIT, OnChangeFindSit)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFindPage message handlers
void CFindPage::OnFineWord()
{
UpdateData();
GetDlgItem(IDC_FIND_ASCII)->EnableWindow(0);
GetDlgItem(IDC_FIND_STR)->EnableWindow();
}
void CFindPage::OnFindRascii()
{
UpdateData();
GetDlgItem(IDC_FIND_ASCII)->EnableWindow();
GetDlgItem(IDC_FIND_STR)->EnableWindow(0);
}
void CFindPage::OnChangeFindStr()
{
UpdateData();
CString str;
m_AscStr.Empty();
for(int i=m_FindStr.GetLength()-1;i>=0;i--)
{
str.Format("%d\n",m_FindStr.GetAt(i));
m_AscStr=str+m_AscStr;
}
UpdateData(0);
}
void CFindPage::OnFind()
{
m_Progress.SetRange(0,1000);
m_BreakFlag=0;
GetDlgItem(IDC_FIND_STOP)->EnableWindow();
GetDlgItem(IDC_FIND_PAUSE)->EnableWindow(0);
GetDlgItem(IDC_FIND)->EnableWindow(0);
GetDlgItem(IDC_FIND_STR)->EnableWindow(0);
GetDlgItem(IDC_FIND_ASCII)->EnableWindow(0);
GetDlgItem(IDC_FIND_WORD)->EnableWindow(0);
GetDlgItem(IDC_FIND_ASC)->EnableWindow(0);
GetDlgItem(IDC_FIND_SIT)->EnableWindow(0);
AfxBeginThread(FindPro,this);
}
void CFindPage::OnChangeFindEascii()
{
UpdateData();
m_FindStr.Empty();
if(!m_AscStr.Right(4).CompareNoCase("\r\n\r\n"))
m_AscStr.Delete(m_AscStr.GetLength()-2,2);
CString str=m_AscStr;
if(str.Right(2).CompareNoCase("\r\n"))
str+="\r\n";
CString temps;
int sit=0;long time=0;
while(str.Right(1)==10)
{
if(time++>50){MessageBox("over 50");break;}
sit=str.Find(13);
temps.Format("%c",atoi(str.Left(sit)));
m_FindStr+=temps;
str.Delete(0,sit+2);
}
UpdateData(0);
}
void CFindPage::OnFindLook()
{
CFileDialog file(TRUE);
if(file.DoModal()==IDOK)
m_File.SetWindowText(file.GetPathName());
}
void CFindPage::OnFindPause()
{
CString bname;
m_Pause.GetWindowText(bname);
if(bname.Left(4).CompareNoCase("继续"))
{
pThread->SuspendThread();
// DWORD flag=pThread->ResumeThread();
// CString st;st.Format("%d",flag);MessageBox(st);
m_Pause.SetWindowText("继续");
}
else
{
pThread->ResumeThread();
m_Pause.SetWindowText("暂停");
}
// CWinThread * thread=(CWinThread *)pThread;
// CString str;
// m_Pause.GetWindowText(str);
// if(str.Left(4).CompareNoCase("继续"))
// {
// thread->SuspendThread();
// m_Pause.SetWindowText("继续");
// }
// else
// {
// thread->ResumeThread();
// m_Pause.SetWindowText("暂停");
// }
}
void CFindPage::OnFindStop()
{
pThread->ResumeThread();
m_Pause.SetWindowText("暂停");
m_BreakFlag=1;
}
void CFindPage::OnKillfocusFindEascii()
{
UpdateData(0);
}
void CFindPage::Find()
{
CString filename;
m_File.GetWindowText(filename);
if(filename.IsEmpty()||(pfile=fopen(filename,"rb"))==NULL)
{
MessageBox(filename+"\n文件打不开","打开文件失败",MB_ICONERROR);
return;
}
char buf[32];
int ret=0;
CString str=m_AscStr;
if(str.GetAt(str.GetLength()-1)!=10)
str+='\n';
CString s;
for(int i=0;i<32;i++)
{
if(str.GetLength()<1)break;
ret=str.Find(10);
s=str.Left(ret);
buf[i]=atoi(s);
str.Delete(0,ret+1);
}
/////////
// while(!FindWindow(NULL,"文件比较"));
// return;
///////////
SetTimer(1,1000,NULL);
rewind(pfile);
fseek(pfile,atol(m_Sit),0);
DWORD fl=filelength(pfile->_file)/1000;
CString sh;sh.Format("%d",i);MessageBox(sh);
while(DoFind(buf,i,pfile)==0)
{
if(feof(pfile))
{
KillTimer(1);
fclose(pfile);
MessageBox("该段未发现待搜字符串","未发现",MB_ICONEXCLAMATION);
return;
}
if(m_BreakFlag)
{
KillTimer(1);
fclose(pfile);
return;
}
}
m_Sit.Format("%ld",ftell(pfile));
rewind(pfile);
fclose(pfile);
KillTimer(1);
UpdateData(0);
}
BOOL CFindPage::DoFind(char *pstr, int count, _iobuf *pfile)
{
if(count==0)
return TRUE;
char c;
fread(&c,1,1,pfile);
if(c!=*pstr)
{
return FALSE;
}
else
{
if(DoFind(pstr+1,count-1,pfile))
return TRUE;
else
{
fseek(pfile,-1,1);
return FALSE;
}
}
}
void CFindPage::OnChangeFindSit()
{
UpdateData();
CString str;
m_File.GetWindowText(str);
if((pfile=fopen(str,"rb"))==NULL)return;
else
{
int sit=filelength(pfile->_file);
if(sit>1000)
m_Progress.SetPos(atol(m_Sit)/(sit/1000));
else
m_Progress.SetPos(atol(m_Sit)*1000/sit);
fclose(pfile);
}
}
BOOL CFindPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
m_Progress.SetRange(0,1000);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CFindPage::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int sit=filelength(pfile->_file);
if(sit>1000)
m_Progress.SetPos(ftell(pfile)/(sit/1000));
else
m_Progress.SetPos(ftell(pfile)*1000/sit);
CPropertyPage::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -