这是学习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)\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的功能就很好了。

VC版超级记事本的更多相关文章

  1. auto_ptr的VC版本源码剖析

    auto_ptr是当前C++标准库(STL)中提供的一种智能指针,包含于头文件 #include<memory> .auto_ptr 能够方便的管理单个堆内存对象,在你不用的时候自动帮你释 ...

  2. 【VC版】如何获取其他进程中ListView控件中的内容

    如果需要C#版的,可以看下我之前写的:C#如何获取其他程序ListView控件中的内容 获取其他进程的数据需要使用到以下几个函数: VirtualAllocEx() VirtualFreeEx() W ...

  3. VC版DoEvents

    VB和C#下有一个DoEvents方法,可以让程序在执行操作的同时仍可以处理其他事件.由于近期在做一个数据格式转换的项目,需要进行大批量的数据处理,希望能在进行数据读写过程中,程序还能接收其他操作,防 ...

  4. VC版八皇后

    一.  功能需求: 1. 可以让玩家摆棋,并让电脑推断是否正确 2. 能让电脑给予帮助(给出全部可能结果) 3. 实现悔棋功能 4. 实现重置功能 5. 加入点按键音效果更佳 二.  整体设计计: 1 ...

  5. Jboss remote getshell (JMXInvokerServlet) vc版

    #include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <winht ...

  6. SendMessage发送自定义消息及消息响应(VC版)

    控件向父窗体发送自定义消息,父窗体定义处理此消息的函数  程序源代码(整个工程)下载:http://download.csdn.net/detail/qq2399431200/6274793 效果描述 ...

  7. ring3下利用WMI监视进程创建(vc版)

    #include "stdafx.h" #define _WIN32_DCOM #include <iostream> using namespace std; #in ...

  8. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  9. 从零开始学习PYTHON3讲义(十三)记事本的升级版:网络记事本

    <从零开始PYTHON3>第十三讲 网络编程的火热和重要性这里就不多说了,我们直接来看看Python在互联网编程方面的表现. Python有很多网络编程的第三方扩展包,这里推荐一个我认为最 ...

随机推荐

  1. 【撸码caffe 三】 caffe.cpp

    caffe.cpp文件完成对网络模型以及模型配置参数的读入和提取,提供了网络模型训练的入口函数train和对模型的测试入口函数test.文件中使用了很多gflags和glog指令,gflags是goo ...

  2. Opencv绘制最小外接矩形、最小外接圆

    Opencv中求点集的最小外结矩使用方法minAreaRect,求点集的最小外接圆使用方法minEnclosingCircle. minAreaRect方法原型: RotatedRect minAre ...

  3. [源码管理] Microsoft Visual SourceSafe 2005 下载与配置

    一.VSS2005的下载地址是:百度搜索关键字:vss, 二.配置Microsoft Visual SourceSafe 2005的Internet访问 VSS2005发布以后,早就听说可以支持Int ...

  4. Codeforces Round #198 (Div. 2)A,B题解

    Codeforces Round #198 (Div. 2) 昨天看到奋斗群的群赛,好奇的去做了一下, 大概花了3个小时Ak,我大概可以退役了吧 那下面来稍微总结一下 A. The Wall Iahu ...

  5. JavaScrip——插入地图

    具体操作步骤:1.百度搜索:百度地图生成器 2.打开第一个,复制网址http://api.map.baidu.com/lbsapi/creatmap/index.html,打开3.页面显示为 4.根据 ...

  6. 初学 Ajax(涉及 php)

    一直知道 ajax 但是尚未真正了解, 这次看了慕课网的<Ajax全接触>,算是有所收获,入了个门. 需要用到php,因为 Ajax也是向服务器请求(不知道这么解释对不对), 所以还需要配 ...

  7. poj1111 Image Perimeters 广搜

    题目大意: 输入一个矩阵,再输入其中一个“X”的位置(从1开始).从该位置向八个方向扩展,如果是“X”就可以并在一起.问最后得到的模块的周长是多少. 解题思路: 按照广搜的思路来做.用一个二维的数组标 ...

  8. hdu3572Task Schedule 最大流,判断满流 优化的SAP算法

    PS:多校联赛的题目质量还是挺高的.建图不会啊,看了题解才会的. 参考博客:http://blog.csdn.net/luyuncheng/article/details/7944417 看了上面博客 ...

  9. hdu4009 Transfer water 最小树形图

    每一户人家水的来源有两种打井和从别家接水,每户人家都可能向外输送水. 打井和接水两种的付出代价都接边.设一个超级源点,每家每户打井的代价就是从该点(0)到该户人家(1~n)的边的权值.接水有两种可能, ...

  10. Android高效加载大图

    通过BitmapFactory的decode方法设置特定的options缩小图片到指定尺寸 1:通过加载设置了只编码图片边界options的图片,获取原图的尺寸和类型 2:计算图片需要缩小的倍数 3: ...