VC版超級記事本

來源:互聯網
上載者:User

標籤: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的功能就非常好了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.