標籤:vc 超級記事本
這是學習VC時的一個大作業,超級記事本,突然發現了,傳上來供大家學習參考!
一. 功能需求:
1. 能在原有像記事本程式的基礎上添加更多功能:
1).能夠改變背景顏色。
2).能夠改變字型顏色。
3).能夠改變字型。
4). 能夠對段落進行對齊等。
二. 總體設計計:
首先要的申明的是:本程式繼承自CRichEditView。
1.添加“格式(O)”功能表項目:
(1) .添加“字型(F)”子功能表。
(2).添加“背景顏色(B)”子功能表。
(3). 添加“字型顏色(T)”子功能表。
2. 添加一個新的工具列:
(1).增添“加粗”按鈕。
(2).增添“斜體”按鈕。
(3).增添“底線”按鈕。
(4).增添“靠左對齊”、“置中”和“靠右對齊”按鈕。
(5).增添“文本顏色”與“背景顏色“按鈕。
3.狀態列顯示時間:
能夠即時顯示系統時間。
4.改變應用程式圖示:
5. 添加單擊右鍵的彈出式菜單。
三. 詳細設計:
1.添加“格式(O)”功能表項目:
(1) .添加“字型(F)”子功能表:
添加完菜單後,在視圖類中添加其訊息響應函數。在此函數中調用通用對話方塊CFontDialog類,進行字型的改變。
代碼如下:
void CMyWordView::OnFormatFont() //設定字型
{
//TODO: Add your command handler code here
CMyWordDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CFontDialogcfd(&pDoc->m_lf,CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT);
if(cfd.DoModal()==IDOK) //若點擊確定,設定字型
{
CHARFORMATcf;
cf.cbSize = sizeof (CHARFORMAT);
cf.dwMask = CFM_FACE | CFM_SIZE;
::lstrcpy (cf.szFaceName, cfd.GetFaceName());
cf.yHeight= cfd.GetSize()*2;
SetCharFormat (cf);
}
}
(2).添加“背景顏色(B)”子功能表:
添加完菜單後,在視圖類中添加其訊息響應函數。並調用顏色對話方塊設定顏色。
需要注意的是:
從CRichEditView繼承的似乎不適合改背景顏色。寫字板中我看了好像沒有改變整個背景顏色的功能,只能改字型的背景顏色。
因為改了背景顏色之後,會覆蓋先前的文本,必須重新輸出,所以
必須儲存以前文本的字型大小、顏色等資訊,然後輸出。
My Code是:
void CMyWordView::OnBkcolor() //改變背景顏色
{
//TODO: Add your command handler code here
CMyWordDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CColorDialog dlg;
CRichEditCtrl& EditCtrl =GetRichEditCtrl();
CHARFORMAT cf;
if(dlg.DoModal()==IDOK)
{
EditCtrl.SetBackgroundColor(FALSE,dlg.GetColor()); //擷取使用者所選顏色
cf.dwMask = CFM_COLOR;
cf.cbSize = sizeof(CHARFORMAT);
EditCtrl.GetDefaultCharFormat(cf);
cf.crTextColor =RGB(0,0,0);
cf.dwEffects &= ~CFE_AUTOCOLOR;
EditCtrl.SetDefaultCharFormat(cf);
}
}
(3). 添加“字型顏色(T)”子功能表:
與改變背景顏色類似,都要調用通用對話方塊—顏色對話方塊。
得到使用者佈建的顏色後,對字元重新設計並輸出。
代碼如下:
void CMyWordView::OnTxtcolor() //改變字型顏色
{
//TODO: Add your command handler code here
CHARFORMATcf;
CMyWordDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
CColorDialogdlg;
if(dlg.DoModal()==IDOK)
{
cf.crTextColor=dlg.GetColor(); //擷取使用者所選顏色
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.crTextColor=dlg.GetColor();
cf.dwMask=CFM_CHARSET| CFM_COLOR ;
cf.dwEffects = cf.dwEffects & ~CFE_AUTOCOLOR; //去除原來的顏色效果,改為新的顏色
SetCharFormat(cf); //設定
}
}
2. 添加一個新的工具列:
A.首先建立一個新的工具列:
首先在資源檢視中建立一個新的工具列資源。
其次,因為工具列屬於架構類,所以在CMainFrame類的OnCreate函數中顯示建立一個新的工具列。可以仿照其自動產生的工具列。
在資源檢視中為新增的工具列資源增添“加粗”、“斜體”與“底線”按鈕。
B.利用RichEdit Structure中的CHARFORMAT結構體實現對加粗、斜體與底線的設定。
代碼如下:
void CMyWordView::OnCharBold() //字型是否加粗
{
//TODO: Add your command handler code here
CHARFORMATcf;
cf = GetCharFormatSelection ();
if (!(cf.dwMask & CFM_BOLD)|| !(cf.dwEffects & CFE_BOLD)) //若原來不是粗體,則改為粗體
cf.dwEffects = CFE_BOLD;
else //否則,改為原來的字型
cf.dwEffects = 0;
cf.dwMask = CFM_BOLD;
SetCharFormat (cf);
}
其他三個與此類似。
(4).增添“靠左對齊”、“置中”和“靠右對齊”按鈕。
直接調用CRichEditView類的成員函數OnParaAlign()即可
void CMyWordView::OnParaLeft()
{
//TODO: Add your command handler code here
OnParaAlign(PFA_LEFT); //段落靠左對齊
}
(5).增添“文本顏色”與“背景顏色“按鈕:
這兩個工具列按鈕的ID與功能表項目中響應單子功能表ID一樣即可。
3.狀態列顯示時間:
能夠即時顯示系統時間,必須得到系統時間,並設定定時器時時更新。
得到系統時間並顯示在狀態列上:
CTimet=CTime::GetCurrentTime();
CString str=t.Format("%H:%M:%S"); //狀態列顯示時間設定
CClientDC dc(this);
CSize sz=dc.GetTextExtent(str);
int index=0;
index=m_wndStatusBar.CommandToIndex(IDS_TIMER);
m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(1,str);
SetTimer(1,1000,NULL);//設定定時器
定時器到時後調用下面的函數更新時間並顯示:
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CTime t=CTime::GetCurrentTime();
CString str=t.Format("%H:%M:%S");
CClientDC dc(this);
CSize sz=dc.GetTextExtent(str);
m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(1,str);
CFrameWnd::OnTimer(nIDEvent);
}
4.改變應用程式圖示:
只需將原有的表徵圖擦掉重新畫一個。
注意:改表徵圖必須將兩個不同大小的表徵圖都該。
5. 添加單擊右鍵的彈出式菜單。
在單擊右鍵的訊息響應函數中添加設計並顯示彈出式菜單:
voidCMyWordView::OnRButtonUp(UINT nFlags, CPoint point) //建彈出式菜單
{
HWND hWnd;
POINT p;
GetCursorPos(&p);
::ScreenToClient(hWnd,&p);
CMenu menuPopup;
if(menuPopup.CreatePopupMenu())
{
menuPopup.AppendMenu(MF_STRING,ID_EDIT_UNDO,"撤銷(&U)\tCtrl+Z");
menuPopup.AppendMenu(MF_STRING,ID_EDIT_CUT,"剪下(&C)\tCtrl+X");
menuPopup.AppendMenu(MF_STRING,ID_EDIT_COPY,"複製(&C)\tCtrl+C");
menuPopup.AppendMenu(MF_STRING,ID_EDIT_PASTE,"粘貼(&P)\tCtrl+V");
menuPopup.AppendMenu(MF_STRING,ID_EDIT_SELECT_ALL,"全選(&L)\tCtrl+A");
menuPopup.AppendMenu(MF_STRING,ID_FORMAT_FONT,"字型(&F)");
menuPopup.AppendMenu(MF_STRING,IDM_BKCOLOR,"背景顏色(&B)");
menuPopup.AppendMenu(MF_STRING,IDM_TXTCOLOR,"字型顏色(&T)");
menuPopup.TrackPopupMenu(TPM_LEFTALIGN,p.x,p.y,this);
}
CRichEditView::OnRButtonUp(nFlags,point);
}
四.測試與實現:
五.總結:
通過本次超級記事本的開發,使我對MFC的架構有了更進一步的瞭解,同時,也對MFC中豐富的類感受到使用的方便。我從剛開始照著老師課件上講的,從CEditVIew繼承了之後編寫,但發現,雖然它能實現記事本的功能,但想要擴充它的其他功能就比較難。於是,我又從CScrollView繼承,它的擴充能力很好,但,它的所有一切功能都得自己編寫,我當時感到有點崩潰。但還是查資料,看書,自己去實現。從剛開始只能輸出不能輸入,到能夠輸入但無法換行與刪除,
再到能換行與刪除去無法處理滑鼠。在這一過程中,我學到了很多東西,不僅是知識,更是編程的思想。很多東西並不是我們所想象的。例如,刪除的實現是將
原有的字串取總長度(n-1),並將文字顏色設為背景顏色,再將重新賦值的字串輸出。
由於從CscrollView繼承的,有太多需要編寫,需花很長時間,若交作業可能連最基本的都無法實現。我決定寒假回去慢慢編寫。
最後我從CRichEditView繼承,實現了改變字型、字型顏色及背景顏色等功能。同樣我從中學到了不少東西。
轉載請標明出處:牟尼的專欄 http://blog.csdn.net/u012027907
本程式的優點:增加了文本編輯的擴充功能,使其能編輯豐富的文字。
本程式的缺點:介面設計仍顯老舊,功能有限。應向寫字板或Word等看齊,雖不能與其一樣,但盡量像其介面,並能實現其1/5的功能就非常好了。