📄 mainfrm.cpp
字号:
OnEditrepeat();
if(t)
delete t;
if(ft)
delete ft;
return;
}
}
if(t)
delete t;
if(ft)
delete ft;
}
void CMainFrame::OnEditrepeatnext()
{
CWinApp *app = AfxGetApp();
CMainFrame *mainfrm = (CMainFrame *)AfxGetMainWnd();
CIcrEditView *icrEditView=(CIcrEditView *)GetActiveView();
CString strEdit;
mainfrm->m_wndToolBar.m_comboboxFind.GetWindowText(strEdit);
//CString strEdit = app->GetProfileString(_T("CFind"), _T("str"), _T(""));
BOOL bWholeWord = app->GetProfileInt(_T("CFind"), _T("WholeWord"), 0);
BOOL bCase = app->GetProfileInt(_T("CFind"), _T("Case"), 0);
if(strEdit.IsEmpty())
return;
int dwFlags = 0;
if(bCase)
dwFlags|=FR_MATCHCASE;
if(bWholeWord)
dwFlags|=FR_WHOLEWORD;
dwFlags|=FR_DOWN;;
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
CHARRANGE cr;
edit.GetSel(cr);
FINDTEXTEX *ft = new FINDTEXTEX[1];
ft->chrg.cpMin = cr.cpMin+1;
ft->chrg.cpMax = -1;// search through end of the text
TCHAR *t = new TCHAR[strEdit.GetLength()+1];
strcpy(t, strEdit);
ft->lpstrText = t;
mainfrm->m_wndToolBar.m_comboboxFind.AddToMRU(strEdit);
app->WriteProfileString(_T("CFind"), _T("str"), strEdit);
icrEditView->ShowWindow(SW_HIDE);
int nPos = edit.SendMessage(EM_FINDTEXTEX, dwFlags, (LPARAM)ft);
if(nPos!=-1) {
edit.SetSel(ft->chrgText.cpMin, ft->chrgText.cpMax);
icrEditView->SetFocus();
SetFocus();
icrEditView->ShowWindow(SW_SHOW);
}
else {
icrEditView->ShowWindow(SW_SHOW);
CString strShow;
strShow.Format(_T("Cannot find the string: \"%s\", search again from the beginning?"), strEdit);
if(MessageBox(strShow, _T("Find"), MB_ICONINFORMATION|MB_YESNO)==IDYES)
{
edit.SetSel(0, 0);
OnEditrepeatnext();
if(t)
delete t;
if(ft)
delete ft;
return;
}
}
if(t)
delete t;
if(ft)
delete ft;
}
void CMainFrame::OnUpdateEditrepeat(CCmdUI* pCmdUI)
{
CString strEdit;
m_wndToolBar.m_comboboxFind.GetWindowText(strEdit);
pCmdUI->Enable(!strEdit.IsEmpty());
}
void CMainFrame::OnUpdateEditrepeatnext(CCmdUI* pCmdUI)
{
CString strEdit;
m_wndToolBar.m_comboboxFind.GetWindowText(strEdit);
pCmdUI->Enable(!strEdit.IsEmpty());
}
void CMainFrame::OnEditreplace()
{
if(!m_pReplaceDialog)
m_pReplaceDialog = new CReplace(this);
else
{
m_pReplaceDialog->ShowWindow(SW_SHOW);
m_pReplaceDialog->SetFocus();
return;
}
m_pReplaceDialog->Create(IDD_REPLACE, this);
m_pReplaceDialog->ShowWindow(SW_SHOW);
return;
}
void CMainFrame::OnViewFont()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
BOOL bModify = edit.GetModify();
edit.ShowWindow(SW_HIDE);
CString strText;
EDITSTREAM stream;
stream.dwCookie = (DWORD)&strText;
stream.pfnCallback = EditStreamCallbackOut;
edit.StreamOut(SF_TEXT, stream);
CHARFORMAT cr;
if(strText.IsEmpty())
{
strText = _T(" ");
edit.SetSel(0, 1);
cr = icrEditView->GetCharFormatSelection();
edit.SetSel(0, 0);
}
else
{
CHARRANGE range;
edit.GetSel(range);
int ntemp;
if(range.cpMax < range.cpMin)
{
ntemp = range.cpMax;
range.cpMax = range.cpMin;
range.cpMin = ntemp;
}
if(range.cpMax == range.cpMin)
{
if(range.cpMin == 0)
{
edit.SetSel(0, 1);
}
else
{
edit.SetSel(range.cpMin-1, range.cpMin);
}
cr = icrEditView->GetCharFormatSelection();
edit.SetSel(range.cpMin, range.cpMin);
}
else
{
cr = icrEditView->GetCharFormatSelection();
}
}
edit.ShowWindow(SW_SHOW);
CFontDialog dlg(cr, CF_BOTH|CF_NOOEMFONTS);
if (dlg.DoModal() == IDOK)
{
CHARFORMAT cr;
dlg.GetCharFormat(cr);
LockWindowUpdate();
icrEditView->SetWindowText(_T(""));
icrEditView->SetSynEditViewFont(*dlg.m_cf.lpLogFont);
icrEditView->SetWindowText(strText);
edit.SetModify(bModify);
UnlockWindowUpdate();
}
}
void CMainFrame::SaveTheContext()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &richctrl=icrEditView->GetRichEditCtrl();
if(0 == m_strFileName.GetLength())
return;
CFile cFile(m_strFileName, CFile::modeCreate|CFile::modeWrite);
EDITSTREAM es;
es.dwCookie = (DWORD) &cFile;
es.pfnCallback = EditStreamCallbackWriteToFile;
richctrl.StreamOut(SF_TEXT, es);
richctrl.SetModify(FALSE);
}
void CMainFrame::OnFileOpen()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
if(edit.GetModify())
{
if(MessageBox("This file has been modified, do you want to save it?", "", MB_YESNO|MB_ICONQUESTION)==IDNO)
{
return;
}
}
CFileDialog fd (TRUE, _T(""), NULL, OFN_HIDEREADONLY|OFN_EXPLORER, "*.*|*.*||");
if(IDCANCEL == fd.DoModal())
{
return;
}
m_strFileName = fd.GetPathName();
icrEditView->LoadFile(m_strFileName);
}
void CMainFrame::OnEditTrimtraillingspace()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CWaitCursor wc;
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
int nfirstline = edit.GetFirstVisibleLine();
CHARRANGE cr;
edit.GetSel(cr);
int nline = edit.LineFromChar(cr.cpMin);
CString strtext;
EDITSTREAM stream;
stream.dwCookie = (DWORD)&strtext;
stream.pfnCallback = EditStreamCallbackOut;
edit.StreamOut(SF_TEXT, stream);
CString strnewtext = _T(""), strline;
int npos = strtext.Find('\n');
while(npos!=-1) {
strline = strtext.Left(npos-1);
strline.TrimRight(0x20);
strline += '\n';
strtext = strtext.Right(strtext.GetLength()-npos-1);
strnewtext += strline;
npos = strtext.Find('\n');
}
icrEditView->LoadText(strnewtext);
icrEditView->GotoLine(nfirstline+1);
int nlineindex = edit.LineIndex(nline);
edit.SetSel(nlineindex, nlineindex);
icrEditView->ShowCursorPosition();
icrEditView->SetFocus();
SaveTheContext();
}
void CMainFrame::OnEditTrimtraillingtab()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CWaitCursor wc;
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
int nfirstline = edit.GetFirstVisibleLine();
CHARRANGE cr;
edit.GetSel(cr);
int nline = edit.LineFromChar(cr.cpMin);
CString strtext;
EDITSTREAM stream;
stream.dwCookie = (DWORD)&strtext;
stream.pfnCallback = EditStreamCallbackOut;
edit.StreamOut(SF_TEXT, stream);
CString strnewtext = _T(""), strline;
int npos = strtext.Find('\n');
while(npos!=-1) {
strline = strtext.Left(npos-1);
strline.TrimRight(0x9);
strline += '\n';
strtext = strtext.Right(strtext.GetLength()-npos-1);
strnewtext += strline;
npos = strtext.Find('\n');
}
icrEditView->LoadText(strnewtext);
icrEditView->GotoLine(nfirstline+1);
int nlineindex = edit.LineIndex(nline);
edit.SetSel(nlineindex, nlineindex);
icrEditView->ShowCursorPosition();
icrEditView->SetFocus();
SaveTheContext();
}
void CMainFrame::OnEditTabtospace()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CWaitCursor wc;
TCHAR chr = 0x9;
CString strtab = chr;
int ntabsize = icrEditView->GetTabSize();
CString strspace(0x20, ntabsize);
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
int nfirstline = edit.GetFirstVisibleLine();
CHARRANGE cr;
edit.GetSel(cr);
int nline = edit.LineFromChar(cr.cpMin);
CString strtext;
EDITSTREAM stream;
stream.dwCookie = (DWORD)&strtext;
stream.pfnCallback = EditStreamCallbackOut;
edit.StreamOut(SF_TEXT, stream);
strtext.Replace(strtab, strspace);
icrEditView->LoadText(strtext);
icrEditView->GotoLine(nfirstline+1);
int nlineindex = edit.LineIndex(nline);
edit.SetSel(nlineindex, nlineindex);
icrEditView->ShowCursorPosition();
icrEditView->SetFocus();
SaveTheContext();
}
void CMainFrame::OnEditSpacetotab()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CWaitCursor wc;
TCHAR chr = 0x9;
CString strtab = chr;
int ntabsize = icrEditView->GetTabSize();
CString strspace(0x20, ntabsize);
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
int nfirstline = edit.GetFirstVisibleLine();
CHARRANGE cr;
edit.GetSel(cr);
int nline = edit.LineFromChar(cr.cpMin);
CString strtext;
EDITSTREAM stream;
stream.dwCookie = (DWORD)&strtext;
stream.pfnCallback = EditStreamCallbackOut;
edit.StreamOut(SF_TEXT, stream);
strtext.Replace(strspace, strtab);
icrEditView->LoadText(strtext);
icrEditView->GotoLine(nfirstline+1);
int nlineindex = edit.LineIndex(nline);
edit.SetSel(nlineindex, nlineindex);
icrEditView->ShowCursorPosition();
icrEditView->SetFocus();
SaveTheContext();
}
void CMainFrame::OnEditLeadingspacetotab()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CWaitCursor wc;
int ntabsize = icrEditView->GetTabSize();
CString strspace(0x20, ntabsize);
CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
int nfirstline = edit.GetFirstVisibleLine();
CHARRANGE cr;
edit.GetSel(cr);
int nline = edit.LineFromChar(cr.cpMin);
CString strtext;
EDITSTREAM stream;
stream.dwCookie = (DWORD)&strtext;
stream.pfnCallback = EditStreamCallbackOut;
edit.StreamOut(SF_TEXT, stream);
CString strnewtext = _T(""), strline;
int npos = strtext.Find('\n');
while(npos!=-1) {
int i=0;
strline = strtext.Left(npos);
while(strline[i]==0x20 || strline[i]==0x9)
i++;
CString strtmp = strline.Left(i);
strtmp.Replace( strspace, _T("\t"));
strline = strtmp + strline.Right(strline.GetLength()-i);
strline += '\n';
strtext = strtext.Right(strtext.GetLength()-npos-1);
strnewtext += strline;
npos = strtext.Find('\n');
}
icrEditView->LoadText(strnewtext);
icrEditView->GotoLine(nfirstline+1);
int nlineindex = edit.LineIndex(nline);
edit.SetSel(nlineindex, nlineindex);
icrEditView->ShowCursorPosition();
icrEditView->SetFocus();
SaveTheContext();
}
void CMainFrame::OnEditMoveright()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();
icrEditView->ShowWindow(SW_HIDE);
int nfirstline, nendline;
icrEditView->GetSelLine(nfirstline, nendline);
CString strtext=_T(""), strline;
BOOL bpriorlinerealreturn;
int linenumber = nendline - nfirstline + 1;
for(int i=0; i<linenumber; i++) {
if(nfirstline+i-1<0)//判断前一行行末是否是硬回车
bpriorlinerealreturn = TRUE;
else
bpriorlinerealreturn = icrEditView->GetLineString(nfirstline+i-1, strline);
icrEditView->GetLineString(nfirstline+i, strline);
if(bpriorlinerealreturn || nfirstline==nendline) { //如果上一行是真的换行
int nselstart = SynCtrl.LineIndex(nfirstline+i);
SynCtrl.SetSel(nselstart, nselstart);
int noldlinecount = SynCtrl.GetLineCount();
SynCtrl.ReplaceSel(_T("\t"), TRUE); //替换后可能引总行数增加
int nnewlinecount = SynCtrl.GetLineCount();
linenumber+=nnewlinecount-noldlinecount;
}
}
int nselstart = SynCtrl.LineIndex(nfirstline);
int nselend = SynCtrl.LineIndex(nfirstline+linenumber);
SynCtrl.SetSel(nselstart, nselend);
icrEditView->ShowWindow(SW_SHOW);
}
void CMainFrame::OnEditMoveleft()
{
CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();
icrEditView->ShowWindow(SW_HIDE);
int nfirstline, nendline;
icrEditView->GetSelLine(nfirstline, nendline);
CString strtext=_T(""), strline;
BOOL bpriorlinerealreturn;
int linenumber = nendline - nfirstline + 1;
for(int i=0; i<linenumber; i++) {
if(nfirstline+i-1<0)//判断前一行行末是否是硬回车
bpriorlinerealreturn = TRUE;
else
bpriorlinerealreturn = icrEditView->GetLineString(nfirstline+i-1, strline);
icrEditView->GetLineString(nfirstline+i, strline);
if(bpriorlinerealreturn || nfirstline==nendline) { //如果上一行是真的换行
int nselstart = SynCtrl.LineIndex(nfirstline+i);
SynCtrl.SetSel(nselstart, nselstart);
if(strline.Left(1)==_T("\t")) {
SynCtrl.SetSel(nselstart, nselstart+1);
SynCtrl.ReplaceSel(_T(""), TRUE); //替换后可能引总行数减少
}
else {
if(strline!=_T(" ")) { //之所以有此判断是因为如果是空行icrEditView->GetLineString会返回一个空格
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -