⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 VC++设计语法编辑器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "icrEdit.h"

#include "MainFrm.h"
#include "IcrEditView.h"
#include "resource.h"
#include "DateTime.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

DWORD CALLBACK EditStreamCallbackWriteToFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);
DWORD CALLBACK EditStreamCallbackOut(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_CBN_SELCHANGE(IDC_COMBOX, OnSelchangeCombo)
	ON_CBN_SELCHANGE(IDC_COMBOX, OnSelchangeComboFind)
	ON_COMMAND(ID_EDITPASTE, OnEditPaste)
	ON_COMMAND(ID_EDITCUT, OnEditcut)
	ON_UPDATE_COMMAND_UI(ID_EDITCUT, OnUpdateEditcut)
	ON_COMMAND(ID_EDITCOPY, OnEditcopy)
	ON_UPDATE_COMMAND_UI(ID_EDITCOPY, OnUpdateEditcopy)
	ON_UPDATE_COMMAND_UI(ID_EDITPASTE, OnUpdateEditpaste)
	ON_COMMAND(ID_EDITUNDO, OnEditundo)
	ON_UPDATE_COMMAND_UI(ID_EDITUNDO, OnUpdateEditundo)
	ON_COMMAND(ID_EDITREDO, OnEditredo)
	ON_UPDATE_COMMAND_UI(ID_EDITREDO, OnUpdateEditredo)
	ON_COMMAND(ID_EDITSELECTALL, OnEditselectall)
	ON_COMMAND(ID_EDITFIND, OnEditfind)
	ON_COMMAND(ID_EDITREPEAT, OnEditrepeat)
	ON_COMMAND(ID_EDITREPEATNEXT, OnEditrepeatnext)
	ON_UPDATE_COMMAND_UI(ID_EDITREPEAT, OnUpdateEditrepeat)
	ON_UPDATE_COMMAND_UI(ID_EDITREPEATNEXT, OnUpdateEditrepeatnext)
	ON_COMMAND(ID_EDITREPLACE, OnEditreplace)
	ON_COMMAND(ID_VIEW_FONT, OnViewFont)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_EDIT_TRIMTRAILLINGSPACE, OnEditTrimtraillingspace)
	ON_COMMAND(ID_EDIT_TRIMTRAILLINGTAB, OnEditTrimtraillingtab)
	ON_COMMAND(ID_EDIT_TABTOSPACE, OnEditTabtospace)
	ON_COMMAND(ID_EDIT_SPACETOTAB, OnEditSpacetotab)
	ON_COMMAND(ID_EDIT_LEADINGSPACETOTAB, OnEditLeadingspacetotab)
	ON_COMMAND(ID_EDIT_MOVERIGHT, OnEditMoveright)
	ON_COMMAND(ID_EDIT_UNCOMMENT, OnEditUncomment)
	ON_COMMAND(ID_EDIT_MOVELEFT, OnEditMoveleft)
	ON_COMMAND(ID_EDIT_COMMENT, OnEditComment)
	ON_COMMAND(ID_EDIT_LCASE, OnEditLcase)
	ON_COMMAND(ID_EDIT_UCASE, OnEditUcase)
	ON_COMMAND(ID_EDIT_INVERT, OnEditInvert)
	ON_COMMAND(ID_EDIT_CAPITALIZE, OnEditCapitalize)
	ON_COMMAND(ID_EDIT_SENTANCECASE, OnEditSentancecase)
	ON_COMMAND(ID_EDIT_INSERTDATETIME, OnEditInsertdatetime)
	ON_COMMAND(ID_EDIT_INSERTFILE, OnEditInsertfile)
	ON_UPDATE_COMMAND_UI(ID_EDIT_LCASE, OnUpdateEditLcase)
	ON_UPDATE_COMMAND_UI(ID_EDIT_INVERT, OnUpdateEditInvert)
	ON_UPDATE_COMMAND_UI(ID_EDIT_SENTANCECASE, OnUpdateEditSentancecase)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UCASE, OnUpdateEditUcase)
	ON_COMMAND(ID_FILE_NEW, OnFileNew)
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
	ON_COMMAND(ID_FILESAVE, OnFilesave)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CAPITALIZE, OnUpdateEditCapitalize)
	ON_COMMAND(ID_FILE_SAVE_AS_, OnFileSaveAs)
	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()
{
	m_pFindDialog = NULL;
	m_pReplaceDialog = NULL;

	m_strFileName = "";
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::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
	}

  // 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);

	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
	}

	m_bAutoMenuEnable = FALSE;

	if(-1 == LoadToolbarCombo())
		return FALSE;

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::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
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


int CMainFrame::LoadToolbarCombo()
{
    CRect rect;

	m_wndToolBar.SetButtonInfo(17, IDC_COMBOXFIND, TBBS_SEPARATOR, 140 );
    m_wndToolBar.GetItemRect(17, &rect);
    rect.bottom += 200;
	if(!m_wndToolBar.m_comboboxFind.Create(CBS_DROPDOWN|WS_VISIBLE|WS_TABSTOP|CBS_AUTOHSCROLL|WS_VSCROLL,rect, &m_wndToolBar, IDC_COMBOXFIND))
        return -1;

    CFont *f = m_wndToolBar.GetFont();
	m_wndToolBar.m_comboboxFind.ShowAutoWidth(TRUE);
    m_wndToolBar.m_comboboxFind.SetFont(f);

	m_wndToolBar.m_comboboxFind.SetMRURegKey ( _T("cmbFind MRU") );
	m_wndToolBar.m_comboboxFind.SetMRUValueFormat ( _T("File #%d") );
    m_wndToolBar.m_comboboxFind.SetAutoRefreshAfterAdd ( TRUE );
    m_wndToolBar.m_comboboxFind.SetAutoSaveAfterAdd ( TRUE );
    m_wndToolBar.m_comboboxFind.LoadMRU();
    m_wndToolBar.m_comboboxFind.RefreshCtrl();
	////////////////////////////////////////

    m_wndToolBar.SetButtonInfo(21, IDC_COMBOX, TBBS_SEPARATOR, 110 );
    m_wndToolBar.GetItemRect(21, &rect);
    rect.bottom += 350;
	if(!m_wndToolBar.m_combobox.Create(CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL, rect, &m_wndToolBar, IDC_COMBOX))
        return -1;
	
    m_wndToolBar.m_combobox.SetFont(f);
	m_wndToolBar.m_combobox.ShowAutoWidth(TRUE);

	m_wndToolBar.m_combobox.AddString(_T("Ada"));
	m_wndToolBar.m_combobox.AddString(_T("AML"));
	m_wndToolBar.m_combobox.AddString(_T("ASM"));
	m_wndToolBar.m_combobox.AddString(_T("Basic"));
	m_wndToolBar.m_combobox.AddString(_T("BAT"));
	m_wndToolBar.m_combobox.AddString(_T("Blue"));
	m_wndToolBar.m_combobox.AddString(_T("Clipper"));
	m_wndToolBar.m_combobox.AddString(_T("COBOL"));
	m_wndToolBar.m_combobox.AddString(_T("C++"));
	m_wndToolBar.m_combobox.AddString(_T("C#"));
	m_wndToolBar.m_combobox.AddString(_T("Dataflex"));
	m_wndToolBar.m_combobox.AddString(_T("Eiffel"));
	m_wndToolBar.m_combobox.AddString(_T("FORTRAN"));
	m_wndToolBar.m_combobox.AddString(_T("HLBL"));
	m_wndToolBar.m_combobox.AddString(_T("HTML"));
	m_wndToolBar.m_combobox.AddString(_T("INI"));
	m_wndToolBar.m_combobox.AddString(_T("Java"));
	m_wndToolBar.m_combobox.AddString(_T("JSP"));
	m_wndToolBar.m_combobox.AddString(_T("LIMBO"));
	m_wndToolBar.m_combobox.AddString(_T("LISP"));
	m_wndToolBar.m_combobox.AddString(_T("Modula2"));
	m_wndToolBar.m_combobox.AddString(_T("Object Pascal"));
	m_wndToolBar.m_combobox.AddString(_T("Paradox"));
	m_wndToolBar.m_combobox.AddString(_T("Perl"));
	m_wndToolBar.m_combobox.AddString(_T("PHP"));
	m_wndToolBar.m_combobox.AddString(_T("PL1"));
	m_wndToolBar.m_combobox.AddString(_T("Progress"));
	m_wndToolBar.m_combobox.AddString(_T("Python"));
	m_wndToolBar.m_combobox.AddString(_T("REBOL"));
	m_wndToolBar.m_combobox.AddString(_T("REXX"));
	m_wndToolBar.m_combobox.AddString(_T("RUBY"));
	m_wndToolBar.m_combobox.AddString(_T("Smalltalk"));
	m_wndToolBar.m_combobox.AddString(_T("SQL"));
	m_wndToolBar.m_combobox.AddString(_T("VHDL"));
	m_wndToolBar.m_combobox.AddString(_T("XML"));
	m_wndToolBar.m_combobox.AddString(_T("Plain text"));

	return 0;
}


void CMainFrame::OnSelchangeCombo() 
{
	CString strlanguage;
    m_wndToolBar.m_combobox.GetLBText(
        m_wndToolBar.m_combobox.GetCurSel(), strlanguage);
	int nlanguage = GetLanguageByStringShow(strlanguage);
	CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
	icrEditView->SelectLanguage(nlanguage); 
}

void CMainFrame::OnEditPaste() 
{	
	char * buffer;
	if(!OpenClipboard())
		return;	

	buffer = (char*)::GetClipboardData(CF_TEXT);
	CloseClipboard(); 
	CString str = buffer;

	CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
	CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();

	CWnd *pWnd = GetFocus();
	if(pWnd->m_hWnd!=edit.m_hWnd)
	{
		pWnd->SendMessage(WM_PASTE, 0, 0);
		return;
	}
	
	CHARRANGE cr;
	edit.GetSel(cr); 	
	icrEditView->SetParseCookieZeroFromGivenLine(edit.LineFromChar(cr.cpMin)); //粘贴时需重置解析缓冲区
	edit.ReplaceSel(str, TRUE); 

	if(cr.cpMax != cr.cpMin)
	{
		icrEditView->ReCalcCursorPostion();
	}
}

void CMainFrame::OnEditcut() 
{
	CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
	CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();

	CWnd *pWnd = GetFocus();
	if(pWnd->m_hWnd != SynCtrl.m_hWnd)
	{
		pWnd->SendMessage(WM_CUT, 0, 0);
		return;
	}
	
	CHARRANGE cr;
	SynCtrl.GetSel( cr ); 

	icrEditView->GetRichEditCtrl().Cut();  

	if(cr.cpMax != cr.cpMin)
	{
		icrEditView->ReCalcCursorPostion();
	}
	else
	{
		SCROLLINFO si;
		si.cbSize = sizeof(si);
		icrEditView->GetScrollInfo(SB_HORZ, &si);
		icrEditView->m_nHorzMaxOld = si.nMax;
	}
}

void CMainFrame::OnUpdateEditcut(CCmdUI* pCmdUI) 
{
	CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
	CRichEditCtrl& editctrl = icrEditView->GetRichEditCtrl(); 
	CHARRANGE cr;
	editctrl.GetSel(cr);
	pCmdUI->Enable(cr.cpMin!=cr.cpMax); 	
}

void CMainFrame::OnEditcopy()
{
	CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
	CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();

	CWnd *pWnd = GetFocus();
	if(pWnd->m_hWnd != edit.m_hWnd)
	{
		pWnd->SendMessage(WM_COPY, 0, 0);
	}
	else
	{
		edit.Copy();
	}
}

void CMainFrame::OnUpdateEditcopy(CCmdUI* pCmdUI) 
{
	CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
	CRichEditCtrl& editctrl = icrEditView->GetRichEditCtrl(); 
	CHARRANGE cr;
	editctrl.GetSel(cr);
	pCmdUI->Enable(cr.cpMin!=cr.cpMax); 
}

void CMainFrame::OnUpdateEditpaste(CCmdUI* pCmdUI) 
{
	OpenClipboard();
	if(::GetClipboardData(CF_TEXT)==FALSE)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE); 
	CloseClipboard();		
}

void CMainFrame::OnEditundo() 
{
	GetFocus()->SendMessage(EM_UNDO, 0, 0);
}

void CMainFrame::OnUpdateEditundo(CCmdUI* pCmdUI) 
{
	CWnd *pWnd = GetFocus();
	if(!pWnd)
		return;

	BOOL bCanUndo = pWnd->SendMessage(EM_CANUNDO, 0, 0);
	pCmdUI->Enable(bCanUndo); 
}

void CMainFrame::OnEditredo() 
{
	GetFocus()->SendMessage(EM_REDO, 0, 0);
}

void CMainFrame::OnUpdateEditredo(CCmdUI* pCmdUI) 
{
	CWnd *pWnd = GetFocus();
	if(!pWnd)
		return;

	BOOL bCanRedo = pWnd->SendMessage(EM_CANREDO, 0, 0);
	pCmdUI->Enable(bCanRedo); 
}

void CMainFrame::OnEditselectall() 
{
	CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
	CRichEditCtrl &editctrl=icrEditView->GetRichEditCtrl(); 

	CWnd *pWnd = GetFocus();
	if(pWnd->m_hWnd != editctrl.m_hWnd)
	{
		CString str;
		pWnd->GetWindowText(str);
		CHARRANGE ichCharRange;
		ichCharRange.cpMax = str.GetLength();
		ichCharRange.cpMin = 0;
		pWnd->SendMessage(EM_EXSETSEL, 0, (LPARAM)&ichCharRange);
		return;
	}

	editctrl.SetSel(0, -1);
	editctrl.SetFocus();  
	editctrl.PostMessage( WM_PAINT, 0, 0 ); 
}

void CMainFrame::OnEditfind() 
{
	if(!m_pFindDialog)
		m_pFindDialog = new CFind(this);
	else
	{
		m_pFindDialog->ShowWindow(SW_SHOW);
		m_pFindDialog->SetFocus();
		return;
	}
	m_pFindDialog->Create(IDD_FIND, this);
	m_pFindDialog->ShowWindow(SW_SHOW);
	return;	
}

void CMainFrame::OnEditrepeat() 
{
	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;

	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 end?"), strEdit);
		if(MessageBox(strShow,_T("Find"), MB_ICONINFORMATION|MB_YESNO)==IDYES)
		{
			icrEditView->ShowWindow(SW_HIDE); 
			edit.SetSel(0, -1); 
			icrEditView->ShowWindow(SW_SHOW);
			CHARRANGE cr;
			edit.GetSel(cr); 
			edit.SetSel(cr.cpMax, cr.cpMax); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -