首页 > 代码库 > VC版超级记事本

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继承的似乎不适合改背景颜色。写字板中我看了好像没有改变整个背景颜色的功能,只能改字体的背景颜色。

因为改了背景颜色之后,会覆盖先前的文本,必须重新输出,所以

      必须存储以前文本的字体大小、颜色等信息,然后输出。

我的代码是:

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