• VC版超级记事本


      这是学习VC时的一个大作业,超级记事本。突然发现了,传上来供大家学习參考!

    一.  功能需求: 

    1. 能在原有像记事本程序的基础上加入很多其它功能:

    1).可以改变背景颜色。

    2).可以改变字体颜色。

    3).可以改变字体。

    4). 可以对段落进行对齐等。

    二.  整体设计计:

      首先要的申明的是:本程序继承自CRichEditView。

      1.加入“格式(O)”菜单项:

           (1) .加入“字体(F)”子菜单。

            (2).加入“背景颜色(B)”子菜单。

            (3). 加入“字体颜色(T)”子菜单。

      2. 加入一个新的工具栏:

    (1).增添“加粗”button。

    (2).增添“斜体”button。

    (3).增添“下划线”button。

    (4).增添“左对齐”、“居中”和“右对齐”button。

    (5).增添“文本颜色”与“背景颜色“button。

     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函数中显示创建一个新的工具栏。

    能够仿照其自己主动生成的工具栏。

    在资源视图中为新增的工具栏资源增添“加粗”、“斜体”与“下划线”button。

          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).增添“左对齐”、“居中”和“右对齐”button。

    直接调用CRichEditView类的成员函数OnParaAlign()就可以

     void CMyWordView::OnParaLeft()

    {

        //TODO: Add your command handler code here

        OnParaAlign(PFA_LEFT);              //段落左对齐

    }

    (5).增添“文本颜色”与“背景颜色“button:

      这两个工具栏button的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) Ctrl+Z");

           menuPopup.AppendMenu(MF_STRING,ID_EDIT_CUT,"剪切(&C) Ctrl+X");

           menuPopup.AppendMenu(MF_STRING,ID_EDIT_COPY,"复制(&C) Ctrl+C");

           menuPopup.AppendMenu(MF_STRING,ID_EDIT_PASTE,"粘贴(&P) Ctrl+V");

           menuPopup.AppendMenu(MF_STRING,ID_EDIT_SELECT_ALL,"全选(&L) Ctrl+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的功能就很好了。

  • 相关阅读:
    把csv文件导入数据库
    c# DataTable 针对xml、excel、csv导入和导出
    ASP.NET常用珍藏代码
    C# 判断图片链接是否存在
    在asp.net中长内容自动分页的实现.NET教程
    SQL代理服务启动不了SQLSERVERAGENT
    SQL重复记录查询(转载)
    在asp.net中长内容自动分页的实现.NET教程2
    根据年月来判断月里天数
    SQL字符串函数
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6897276.html
Copyright © 2020-2023  润新知