用VC++MFC做文本編輯器(單文檔模式)
原來做過一個用對話框實現的文本編輯器,其實用MFC模板里面的單文檔模板也可以做,甚至更加方便,適合入門級的愛好者試試,現介紹方法如下:
< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
1,首先新建一個工程,選擇MFC AppWizard(exe),定名字為:textview_1,程序類型選擇單個文檔,其他均默認完成。
2,在系統自動生成的CTextview_1Doc類里面增加一個控件,用於文本文檔的暫時存放:
class CTextview_1Doc : public CDocument
{
......
}
然后在CTextview_1Doc類的Serialize函數里面增加打開、保存文本文件的程序:
void CTextview_1Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
int nLines = (int)m_strContent.GetSize();
for ( int i=0; i<nLines; i++ )
{
str = m_strContent.GetAt( i );
ar.WriteString( str ); // 將字符串集合類對象中文本保存到硬盤
}
}
else
{
// TODO: add loading code here
while ( ar.ReadString( str ) )
{
m_strContent.Add( str ); // 將行文本添加到字符串集合類對象中
}
}
}
然后鼠標在CTextview_1Doc 上點擊右鍵,在彈出菜單里面選擇:Add Virtual Function,在彈出的窗口中選中DeleteContents,點擊“添加和編輯”按鈕。在生成的程序中添加以下代碼:
void CTextview_1Doc::DeleteContents()
{
// TODO: Add your specialized code here and/or call the base class
m_strContent.RemoveAll(); // 清除集合類對象中的內容
CDocument::DeleteContents();
}
3,在系統自動生成的CTextview_1View類里面增加一個編輯器的控件指針成員,用於在界面中生成文本編輯器:
class CTextview_1View : public CView
{
......
}
該指針成員在類建立時要設置初始化值為NULL,否則運行起來就會出錯,如下:
CTextview_1View::CTextview_1View()
: m_ctrlEdit(NULL) //添加這一行初始化代碼
{
// TODO: add construction code here
}
用第2點介紹的類似步驟,為CTextview_1View類重寫其OnInitialUpdate函數,添加內容如下:
void CTextview_1View::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
GetClientRect( rcClient ); // 獲取當前視圖的客戶區大小
// if ( m_ctrlEdit ) delete m_ctrlEdit;
m_ctrlEdit = new CEdit();
m_ctrlEdit->Create( ES_MULTILINE | WS_CHILD | WS_VISIBLE
| WS_HSCROLL | ES_AUTOHSCROLL // 自動水平滾動
| WS_VSCROLL | ES_AUTOVSCROLL , // 自動垂直滾動
rcClient, this, 201); // 創建多行編輯控件
CTextview_1Doc* pDoc = GetDocument(); // 獲取與視圖相關聯的文檔指針
// 以下是將文檔中的m_strContent內容全部賦給str
CString str;
int nLines = (int)pDoc->m_strContent.GetSize();
for ( int i=0; i<nLines; i++ )
{
str = str + pDoc->m_strContent.GetAt( i );
str = str + "\r\n"; // 換行
}
m_ctrlEdit->SetTabStops( 16 ); // 設置Tab符大小
m_ctrlEdit->SetWindowText( str ); // 將文檔內容傳給控件
}
4,現在運行一下,文本編輯器就做好了。
5,當然,現在的文本編輯器很不好用,因為不能滾動窗口。而且不會隨窗口的大小變化,因此需要增加一些代碼。鼠標停在CTextview_1View上點擊右鍵,在彈出菜單中選擇:Add Window Message Handle,在彈出的窗口中,選擇WM_SIZE消息,並點擊“Add & Edit”按鈕,在生成的函數中添加以下內容:
void CTextview_1View::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
GetClientRect( rcClient );
if ( m_ctrlEdit )
m_ctrlEdit->MoveWindow( rcClient ); // 改變編輯控件窗口大小
}
6,再運行,一個象模象樣的編輯器生成了。
------解決方案--------------------
你要打開的中文txt文件是什么編碼?沒猜錯的話txt應該是ANSI碼,而你的工程是unicode編碼,所以才出現亂碼。
