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)\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版超级记事本的更多相关文章
- auto_ptr的VC版本源码剖析
auto_ptr是当前C++标准库(STL)中提供的一种智能指针,包含于头文件 #include<memory> .auto_ptr 能够方便的管理单个堆内存对象,在你不用的时候自动帮你释 ...
- 【VC版】如何获取其他进程中ListView控件中的内容
如果需要C#版的,可以看下我之前写的:C#如何获取其他程序ListView控件中的内容 获取其他进程的数据需要使用到以下几个函数: VirtualAllocEx() VirtualFreeEx() W ...
- VC版DoEvents
VB和C#下有一个DoEvents方法,可以让程序在执行操作的同时仍可以处理其他事件.由于近期在做一个数据格式转换的项目,需要进行大批量的数据处理,希望能在进行数据读写过程中,程序还能接收其他操作,防 ...
- VC版八皇后
一. 功能需求: 1. 可以让玩家摆棋,并让电脑推断是否正确 2. 能让电脑给予帮助(给出全部可能结果) 3. 实现悔棋功能 4. 实现重置功能 5. 加入点按键音效果更佳 二. 整体设计计: 1 ...
- Jboss remote getshell (JMXInvokerServlet) vc版
#include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <winht ...
- SendMessage发送自定义消息及消息响应(VC版)
控件向父窗体发送自定义消息,父窗体定义处理此消息的函数 程序源代码(整个工程)下载:http://download.csdn.net/detail/qq2399431200/6274793 效果描述 ...
- ring3下利用WMI监视进程创建(vc版)
#include "stdafx.h" #define _WIN32_DCOM #include <iostream> using namespace std; #in ...
- 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版
<zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...
- 从零开始学习PYTHON3讲义(十三)记事本的升级版:网络记事本
<从零开始PYTHON3>第十三讲 网络编程的火热和重要性这里就不多说了,我们直接来看看Python在互联网编程方面的表现. Python有很多网络编程的第三方扩展包,这里推荐一个我认为最 ...
随机推荐
- CodeForces 596A
Description After making bad dives into swimming pools, Wilbur wants to build a swimming pool in the ...
- office2016专业版激活码
office2016专业版激活密钥 Office 2016 Pro Plus Retail 版激活密钥:office2016专业版激活码 [Key]:3XJTG-YNBMY-TBH9M-CWB2Y-Y ...
- tp框架---表单验证
自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证.分为静态验证和动态验证. 关于基础知识,请查看手册“自动验证”一章. 一.静态验证 ( ...
- C#中大批量导入数据SqlBulkCopy
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- BZOJ3573: [Hnoi2014]米特运输(树上乱搞)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1669 Solved: 1031[Submit][Status][Discuss] Descript ...
- 原生js仿淘宝手机购买选项代码
这是一款基于原生js实现仿淘宝手机信息购买选项效果源码,界面整体效果仿照淘宝购物选项设计,点击不同选项还可实时显示不同的价格计算结果,界面简洁大方.美观实用.可兼容目前最新的各类主流浏览器. 在线演示 ...
- angular4搭建博客(一)
本文长期更新,未经运行,严禁转载. 博客(制作中) http://101.200.58.228/ Github https://github.com/Teloi/TEIndex 框架选择 Angula ...
- 干货 | TensorFlow的55个经典案例
转自1024深度学习 导语:本文是TensorFlow实现流行机器学习算法的教程汇集,目标是让读者可以轻松通过清晰简明的案例深入了解 TensorFlow.这些案例适合那些想要实现一些 TensorF ...
- GEF中连接的实现
在GEF绘图笔想象中复杂许多,需要很多组件的依赖与支持,稍微弄错一个引用,或一个操作调试起来就比较麻烦,下面列一下实现一个连接线功能所需要实现的类及添加的方法 建议大图查看. 相关代码:参考<G ...
- c++常用功能封装
C++文件读写的封装 在C++开发中,文件读写是很常用的功能,出于代码复用的考虑,将它们进行封装. 其中,默认读写的文件是文本文件,并且需要按行处理.调用者只需要关注读取出来的每一行的处理方式.写文件 ...