用VC++MFC做文本編輯器(單文檔模式)


VC++MFC做文本編輯器(單文檔模式)

原來做過一個用對話框實現的文本編輯器,其實用MFC模板里面的單文檔模板也可以做,甚至更加方便,適合入門級的愛好者試試,現介紹方法如下:

< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> 

1,首先新建一個工程,選擇MFC AppWizardexe),定名字為:textview_1,程序類型選擇單個文檔,其他均默認完成。

 

2,在系統自動生成的CTextview_1Doc類里面增加一個控件,用於文本文檔的暫時存放:

class CTextview_1Doc : public CDocument

{

......

public:

 CStringArray m_strContent;

}

然后在CTextview_1Doc類的Serialize函數里面增加打開、保存文本文件的程序:

void CTextview_1Doc::Serialize(CArchive& ar)

{

 CString str;

 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

{

......

public:

 CEdit* m_ctrlEdit;

}

 

該指針成員在類建立時要設置初始化值為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

 CRect rcClient;

 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

 CRect rcClient;

 GetClientRect( rcClient );

 if ( m_ctrlEdit )

  m_ctrlEdit->MoveWindow( rcClient ); // 改變編輯控件窗口大小

}

 

6,再運行,一個象模象樣的編輯器生成了。

 

------解決方案--------------------
你要打開的中文txt文件是什么編碼?沒猜錯的話txt應該是ANSI碼,而你的工程是unicode編碼,所以才出現亂碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM