mfc基于多文档实现文件复制、粘贴、全选、剪切、撤销、重做、删除功能的详细步骤和代码
时间: 2023-09-22 07:10:21 浏览: 48
以下是基于MFC多文档实现文件复制、粘贴、全选、剪切、撤销、重做、删除功能的详细步骤和代码示例:
1. 在MFC应用程序中创建一个多文档应用程序。
2. 在文档类中添加以下代码:
```
void CMyDoc::DeleteContents()
{
m_strText.Empty();
SetModifiedFlag(FALSE);
}
BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
CFile file;
if (!file.Open(lpszPathName, CFile::modeRead | CFile::typeBinary))
return FALSE;
ULONGLONG nLength = file.GetLength();
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, nLength + 1);
LPSTR lpText = (LPSTR)::GlobalLock(hGlobal);
file.Read(lpText, nLength);
lpText[nLength] = 0;
::GlobalUnlock(hGlobal);
CString strText(lpText);
::GlobalFree(hGlobal);
m_strText = strText;
SetModifiedFlag(FALSE);
return TRUE;
}
BOOL CMyDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
CFile file;
if (!file.Open(lpszPathName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
return FALSE;
CString strText = m_strText;
file.Write((LPCTSTR)strText, strText.GetLength());
SetModifiedFlag(FALSE);
return TRUE;
}
void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
ar << m_strText;
else
ar >> m_strText;
}
const CString& CMyDoc::GetText() const
{
return m_strText;
}
void CMyDoc::SetText(const CString& strText)
{
m_strText = strText;
SetModifiedFlag(TRUE);
}
```
3. 在视图类中添加以下代码:
```
void CMyView::OnEditCopy()
{
if (!OpenClipboard())
return;
EmptyClipboard();
CString strText = GetSelectedText();
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, strText.GetLength() + 1);
LPSTR lpText = (LPSTR)::GlobalLock(hGlobal);
strcpy_s(lpText, strText.GetLength() + 1, (LPCTSTR)strText);
::GlobalUnlock(hGlobal);
::SetClipboardData(CF_TEXT, hGlobal);
CloseClipboard();
}
void CMyView::OnEditCut()
{
OnEditCopy();
OnEditDelete();
}
void CMyView::OnEditPaste()
{
if (!OpenClipboard())
return;
HGLOBAL hGlobal = ::GetClipboardData(CF_TEXT);
LPSTR lpData = (LPSTR)::GlobalLock(hGlobal);
CString strText(lpData);
::GlobalUnlock(hGlobal);
CloseClipboard();
ReplaceSelectedText(strText);
}
void CMyView::OnEditDelete()
{
ReplaceSelectedText(_T(""));
}
void CMyView::OnEditSelectAll()
{
SetSelection(0, -1);
}
void CMyView::OnEditUndo()
{
GetDocument()->Undo();
Invalidate();
}
void CMyView::OnEditRedo()
{
GetDocument()->Redo();
Invalidate();
}
CString CMyView::GetSelectedText() const
{
int nStart, nEnd;
GetSelection(nStart, nEnd);
CString strText = GetWindowText();
return strText.Mid(nStart, nEnd - nStart);
}
void CMyView::ReplaceSelectedText(LPCTSTR lpszText)
{
int nStart, nEnd;
GetSelection(nStart, nEnd);
CString strText = GetWindowText();
strText.Replace(nStart, nEnd - nStart, lpszText);
SetWindowText(strText);
SetSelection(nStart, nStart + lstrlen(lpszText));
}
void CMyView::GetSelection(int& nStart, int& nEnd) const
{
SendMessage(EM_GETSEL, (WPARAM)&nStart, (LPARAM)&nEnd);
}
void CMyView::SetSelection(int nStart, int nEnd)
{
SendMessage(EM_SETSEL, nStart, nEnd);
}
```
4. 在主窗口类中添加以下代码:
```
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND(ID_EDIT_COPY, &CMainFrame::OnEditCopy)
ON_COMMAND(ID_EDIT_CUT, &CMainFrame::OnEditCut)
ON_COMMAND(ID_EDIT_DELETE, &CMainFrame::OnEditDelete)
ON_COMMAND(ID_EDIT_PASTE, &CMainFrame::OnEditPaste)
ON_COMMAND(ID_EDIT_SELECT_ALL, &CMainFrame::OnEditSelectAll)
ON_COMMAND(ID_EDIT_UNDO, &CMainFrame::OnEditUndo)
ON_COMMAND(ID_EDIT_REDO, &CMainFrame::OnEditRedo)
END_MESSAGE_MAP()
void CMainFrame::OnEditCopy()
{
CMyView* pView = (CMyView*)GetActiveView();
if (pView != NULL)
pView->OnEditCopy();
}
void CMainFrame::OnEditCut()
{
CMyView* pView = (CMyView*)GetActiveView();
if (pView != NULL)
pView->OnEditCut();
}
void CMainFrame::OnEditDelete()
{
CMyView* pView = (CMyView*)GetActiveView();
if (pView != NULL)
pView->OnEditDelete();
}
void CMainFrame::OnEditPaste()
{
CMyView* pView = (CMyView*)GetActiveView();
if (pView != NULL)
pView->OnEditPaste();
}
void CMainFrame::OnEditSelectAll()
{
CMyView* pView = (CMyView*)GetActiveView();
if (pView != NULL)
pView->OnEditSelectAll();
}
void CMainFrame::OnEditUndo()
{
CMyView* pView = (CMyView*)GetActiveView();
if (pView != NULL)
pView->OnEditUndo();
}
void CMainFrame::OnEditRedo()
{
CMyView* pView = (CMyView*)GetActiveView();
if (pView != NULL)
pView->OnEditRedo();
}
```
5. 在资源文件中添加菜单项和工具栏按钮。
6. 编译并运行应用程序,测试文件复制、粘贴、全选、剪切、撤销、重做、删除功能是否正常工作。
以上是基于MFC多文档实现文件复制、粘贴、全选、剪切、撤销、重做、删除功能的详细步骤和代码示例。