📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "TestCorpus.h"
#include "MainFrm.h"
#include "GetDataDlg.h"
#include "retrieval.h"
#include "TitlesDlg.h"
#include "HanziInfoDlg.h"
#include "SelectData.h"
#include "SaveCorpus.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
# define HZ_NUM 6768
# define HZ_ID(c1,c2) ((c1)-176) *94 +((c2)-161)
CString corpusName="";
CStringArray texts;
BOOL CorpusModified=FALSE;
CHzInfo hzInfo[6768];
CTitlesDlg BrowseCorpusDlg;
int HZFreq[HZ_NUM];
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
// void LoadHZFreq(), StoreHZFreq();
BOOL GetData(const char * Prompt, CString & Data); // 从对话框获取用户输入的数据
BOOL GetData(const char * Prompt, int & Data);
BOOL GetData(const char * Prompt, double & Data);
void AddAFile(CString FileName); // 向语料库中增加一个文件
int FindOneHZ(const char* str, const char *hz); // 全程函数,查找单个汉字
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_UPDATE_COMMAND_UI(ID_Add_Corpus, OnUpdateAddCorpus)
ON_UPDATE_COMMAND_UI(ID_Retrieval_HZstring, OnUpdateRetrievalHZstring)
ON_UPDATE_COMMAND_UI(ID_Browse_Corpus, OnUpdateBrowseCorpus)
ON_UPDATE_COMMAND_UI(ID_Browse_HzInfo, OnUpdateBrowseHzInfo)
ON_UPDATE_COMMAND_UI(ID_Close_Corpus, OnUpdateCloseCorpus)
ON_COMMAND(ID_Browse_Corpus, OnBrowseCorpus)
ON_COMMAND(ID_Browse_HzInfo, OnBrowseHzInfo)
ON_COMMAND(ID_Create_NewCorpus, OnCreateNewCorpus)
ON_COMMAND(ID_Close_Corpus, OnCloseCorpus)
ON_COMMAND(ID_Open_Corpus, OnOpenCorpus)
ON_COMMAND(ID_Add_Corpus, OnAddCorpus)
ON_COMMAND(ID_Retrieval_HZstring, OnRetrievalHZstring)
ON_COMMAND(ID_Find_Dup_Pattern, OnFindDupPattern)
ON_UPDATE_COMMAND_UI(ID_Find_Dup_Pattern, OnUpdateFindDupPattern)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMDIFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
int FindOneHZ(const char* str, const char *hz) // 全程函数:查找单个汉字
{
char *p = (char *)str;
while(*p!='\0') {
if(*p>0) // 如果当前字符是单字节字符,就将指针向前移动一个字符
p++;
else
if (*p==*hz && *(p+1) == *(hz+1))
return p-str;
else
p+=2; // 如果当前字符是双字节字符,并且没有找到匹配的结果,就将指针向前移动两个字符
}
return -1;
}
CString wordType(CString &w) // 判断一个输入词串是否重叠形式的函数
{
int n=w.GetLength();
CString wleft, wleft2, wright2, wright;
if (n==8) {
wleft=w.Left(2);
wright=w.Right(2);
wleft2=w.Mid(2,2);
wright2=w.Mid(4,2);
}
if (n==6) {
wleft=w.Left(2);
wright=w.Right(2);
wleft2=w.Mid(2,2);
}
if(n==4) {
wleft=w.Left(2);
wright=w.Right(2);
if (wleft==wright)
return "AA";
else
return "";
}
else {
if(n==6) {
if (wleft == wright) {
if(wleft2 == "一")
return "A一A";
else {
if(wleft2=="了")
return "A了A";
else {
if(wleft2== "不")
return "A不A";
else {
if (wleft2=="没")
return "A没A";
else
return ""; // unkown type
}
}
}
}
else {
if(wleft!=wleft2 && wleft2==wright)
return "ABB";
else {
if (wleft==wleft2 && wleft2!=wright)
return "AAB";
else
return "";
}
}
}
else {
if (n==8) {
if(wleft == wleft2 && wleft != wright2 && wright2==wright)
return "AABB";
else {
if(wleft!=wleft2 && wleft==wright2 && wleft2==wright)
return "ABAB";
else
if (wleft!=wleft2 && wleft==wright2 && wright2!=wright && wleft2=="里")
return "A里AB";
else
return ""; // unkown type
}
}
else
return "";
}
}
}
void CMainFrame::OnUpdateAddCorpus(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}
void CMainFrame::OnUpdateRetrievalHZstring(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}
void CMainFrame::OnUpdateBrowseCorpus(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}
void CMainFrame::OnUpdateBrowseHzInfo(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}
void CMainFrame::OnUpdateCloseCorpus(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}
void CMainFrame::OnUpdateFindDupPattern(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(corpusName.IsEmpty() ? FALSE:TRUE);
}
void CMainFrame::OnBrowseCorpus()
{// 浏览语料库函数
// TODO: Add your command handler code here
if(corpusName.IsEmpty())
return;
// dlg.DoModal(); // 有模式对话框
BrowseCorpusDlg.Create(IDD_Browse_Corpus_Files); // 无模式对话框
}
void CMainFrame::OnBrowseHzInfo()
{//浏览语料库中汉字频度信息的菜单项函数
// TODO: Add your command handler code here
if(corpusName.IsEmpty())
return;
HanziInfoDlg dlg;
dlg.DoModal();
}
void CMainFrame::OnCreateNewCorpus()
{//创建一个新语料库的菜单项函数
// TODO: Add your command handler code here
CFileDialog dlg(FALSE,"","*.ylk",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"语料库文件|*.ylk|所有文件||"); // 获取语料库存盘文件名
if(dlg.DoModal()!=IDOK)
return;
if(!corpusName.IsEmpty())
OnCloseCorpus(); // 关闭当前语料库
corpusName=dlg.GetPathName();
OnAddCorpus(); // 添加语料
OnCloseCorpus(); // 将添加的语料写入到磁盘文件中
}
void CMainFrame::OnCloseCorpus()
{//关闭语料库
// TODO: Add your command handler code here
if(corpusName.IsEmpty())
return;
else {
if(CorpusModified) {
CFile cf;
char buf[512];
if(cf.Open((const char *) corpusName,CFile::modeCreate|CFile::modeWrite)) {
CArchive ar(&cf,CArchive::store,512,buf);
texts.Serialize(ar);
}
else {
AfxMessageBox("语料库无法存盘!");
return;
}
CFile tf;
CString ylkName=ChangeExt(corpusName,"@@@");
if(tf.Open((const char *) ylkName,CFile::modeCreate|CFile::modeWrite)) {
CArchive ar(&tf,CArchive::store,512,buf);
for(int i=0;i<6768;i++)
hzInfo[i].Serialize(ar);
}
else {
AfxMessageBox("汉字信息无法存盘!");
return;
}
}
texts.RemoveAll(); // 清除所有语料文件名
for(int i=0;i<6768;i++) {
hzInfo[i].Count=0; // 清除汉字出现次数信息
hzInfo[i].TextID.RemoveAll(); // 清除地址串
}
}
corpusName="";
CorpusModified=FALSE;
}
void CMainFrame::OnOpenCorpus()
{ // 打开语料库菜单项函数
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,"","*.ylk",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"语料库文件|*.ylk|所有文件||");
if(dlg.DoModal()!=IDOK)
return;
if(!corpusName.IsEmpty())
OnCloseCorpus();
CFile cf;
char buf[512];
if(cf.Open((const char *)(dlg.GetPathName()),CFile::modeRead)) {
CArchive ar(&cf, CArchive::load,512,buf);
texts.Serialize(ar);
}
else {
AfxMessageBox("无法打开语料库!");
return;
}
CFile tf;
CString ylkName=ChangeExt(dlg.GetPathName(),"@@@");
if(tf.Open((const char *)ylkName, CFile::modeRead)) {
CArchive ar(&tf,CArchive::load,512,buf);
for(int i=0;i<6768;i++)
hzInfo[i].Serialize(ar);
}
else {
AfxMessageBox("无法读入汉字信息!");
return;
}
corpusName=dlg.GetPathName();
CorpusModified=FALSE;
CStatusBar * pStatus = & this->m_wndStatusBar;
pStatus->SetPaneText(0,"当前打开语料库"+corpusName); // 在状态栏显示有关信息
OnBrowseCorpus(); // 打开语料库后直接进入浏览语料文件对话框界面
}
void AddAFile(CString FileName)
{ // 增加单个文件到语料库中
int n=texts.GetSize();
if(n==65535)
return;
FileName.MakeLower();
for(int aa=0;aa<n;aa++) {
CString fname=texts[aa];
if(fname==FileName) {
AfxMessageBox("文件"+FileName+"已经在语料库中!");
return;
}
}
FILE * in;
in=fopen((const char *)FileName,"rb");
if(!in) {
AfxMessageBox("打不开文件"+FileName);
return;
}
while(!feof(in)) {
unsigned char c1,c2;
c1=(unsigned char)fgetc(in);
if(c1<128 || c1==255)
continue;
c2=(unsigned char)fgetc(in);
if(c1>=176) {
int id=HZ_ID(c1,c2);
if(id<0||id>=6768)
continue;
hzInfo[id].AddTextID(n);
}
}
fclose(in);
texts.Add(FileName); // 向字符数组中添加语料文件名
CorpusModified=TRUE; // 设置语料库修改标记为1
}
void CMainFrame::OnAddCorpus()
{// 增加文件到语料库中的菜单项函数
// TODO: Add your command handler code here
if(corpusName.IsEmpty()||texts.GetSize()==65535)
return;
ProcessFiles("txt","*.txt",AddAFile);
}
void CMainFrame::OnRetrievalHZstring()
{// 查找汉字菜单项函数
// TODO: Add your command handler code here
CString key;
if(!GetData("查找汉字串:",key))
return;
key.TrimLeft();
key.TrimRight();
int id,id2,n=key.GetLength();
if(!GoodHzStr(key)) {
AfxMessageBox("输入串中有非汉字字符!");
return;
}
CWordArray *txtID,*tmp;
id=HZ_ID((unsigned char)key[0],(unsigned char)key[1]);
if(n==2){
txtID=&(hzInfo[id].TextID);
if(txtID->GetSize()==0) {
AfxMessageBox("找不到这个汉字串!");
return;
}
Retrieve(txtID,key);
return;
}
id2=HZ_ID((unsigned char)key[2],(unsigned char)key[3]);
txtID=Intersection(hzInfo[id].TextID,hzInfo[id2].TextID);
int i=4;
while(txtID->GetSize()>0 && i<key.GetLength()-1) {
id2=HZ_ID((unsigned char)key[i],(unsigned char)key[i+1]);
tmp=Intersection(*txtID,hzInfo[id2].TextID);
delete txtID;
txtID=tmp;
i+=2;
}
if(txtID->GetSize()==0) {
AfxMessageBox("找不到这个汉字串!");
return;
}
Retrieve(txtID,key);
delete txtID;
return;
}
void CMainFrame::OnFindDupPattern()
{// 检索语料库中重叠形式用例
// TODO: Add your command handler code here
CString dup;
if(!SelectData(dup))
return;
RetrievalDupPattern(dup);
return;
}
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(CorpusModified) {
SaveCorpus dlg;
int ID = dlg.DoModal();
if(ID == IDCANCEL)
return; // if user select CANCEL
else if (ID == IDOK)
OnCloseCorpus();
}
CMDIFrameWnd::OnClose();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -