当前位置: 首页 > news >正文

用VC++MFC做文本编辑器(单文档模式)


用VC++MFC做文本编辑器(单文档模式)  


原来做过一个用对话框实现的文本编辑器,其实用MFC模板里面的单文档模板也可以做,甚至更加方便,适合入门级的爱好者试试,现介绍方法如下:

1,首先新建一个工程,选择MFC AppWizard(exe),定名字为:textview_1,程序类型选择单个文档,其他均默认完成。

2,在系统自动生成的CTextview_1Doc类里面增加一个控件,用于文本文档的暂时存放:

class CTextview_1Doc : public CDocument
{
......
public:
 CStringArray m_strContent;

}

然后在CTextview_1Doc类的Serialize函数里面增加打开、保存文本文件的程序:
void CTextview_1Doc:: Serialize(CArchive& ar)
{
 CString str;
 if (ar.IsStoring())
 {
  // TODO: add storing code here
  int nLines = (int)m_strContent.GetSize();
  for ( int i=0; i<nLines; i++ )
  {
   str = m_strContent.GetAt( i );

    str+="\r\n";

   ar.WriteString( str ); // 将字符串集合类对象中文本保存到硬盘
  }
 }
 else
 {
  // TODO: add loading code here
  while ( ar.ReadString( str ) )
  {
   m_strContent.Add( str ); // 将行文本添加到字符串集合类对象中
  }

 }
}

然后鼠标在CTextview_1Doc 上点击右键,在弹出菜单里面选择:Add Virtual Function,在弹出的窗口中选中DeleteContents,点击“添加和编辑”按钮。在生成的程序中添加以下代码:
void CTextview_1Doc:: DeleteContents()
{

 // TODO: Add your specialized code here and/or call the base class
 m_strContent.RemoveAll();  // 清除集合类对象中的内容
 CDocument::DeleteContents();
}

3,在系统自动生成的CTextview_1View类里面增加一个编辑器的控件指针成员,用于在界面中生成文本编辑器:

class CTextview_1View : public CView
{
......
public:
 CEdit* m_ctrlEdit;

}

 该指针成员在类建立时要设置初始化值为NULL,否则运行起来就会出错,如下:
CTextview_1View::CTextview_1View()
: m_ctrlEdit(NULL)   //添加这一行初始化代码
{
 // TODO: add construction code here
}

 用第2点介绍的类似步骤,为CTextview_1View类重写其OnInitialUpdate函数,添加内容如下:
void CTextview_1View:: OnInitialUpdate()
{
 CView::OnInitialUpdate();
 // TODO: Add your specialized code here and/or call the base class
  CRect rcClient;
 GetClientRect( rcClient );    // 获取当前视图的客户区大小

 m_ctrlEdit = new CEdit();

 m_ctrlEdit->Create( ES_MULTILINE | WS_CHILD | WS_VISIBLE

  | WS_HSCROLL | ES_AUTOHSCROLL  // 自动水平滚动

  | WS_VSCROLL | ES_AUTOVSCROLL ,  // 自动垂直滚动

  rcClient, this, 201);    // 创建多行编辑控件


 CTextview_1Doc* pDoc = GetDocument(); // 获取与视图相关联的文档指针


 // 以下是将文档中的m_strContent内容全部赋给str
 CString str;
 int nLines = (int)pDoc->m_strContent.GetSize();
 for ( int i=0; i<nLines; i++ )
 {
  str = str + pDoc->m_strContent.GetAt( i );
  str = str + "\r\n";     // 换行
 }


 m_ctrlEdit->SetTabStops( 16 );   // 设置Tab符大小
 m_ctrlEdit->SetWindowText( str );  // 将文档内容传给控件

}


4,现在运行一下,文本编辑器就做好了。

5,当然,现在的文本编辑器很不好用,因为不能滚动窗口。而且不会随窗口的大小变化,因此需要增加一些代码。鼠标停在CTextview_1View上点击右键,在弹出菜单中选择:Add Window Message Handle,在弹出的窗口中,选择WM_SIZE消息,并点击“Add & Edit”按钮,在生成的函数中添加以下内容:

void CTextview_1View:: OnSize(UINT nType, int cx, int cy)
{
 CView::OnSize(nType, cx, cy);
 // TODO: Add your message handler code here
 CRect rcClient;
 GetClientRect( rcClient );
 if ( m_ctrlEdit )
  m_ctrlEdit-> MoveWindow( rcClient ); // 改变编辑控件窗口大小
}


6,再运行,一个象模象样的编辑器生成了。

相关文章:

  • MFC 一个简单的绘图程序
  • Linux 系统设置静态 IP
  • CString及Char指针和数组的问题(转)
  • 首尾相连的跑马灯效果(在IE Firefox Opera Safari中均已测试)
  • 多线程技术
  • CentOS-6.4 下成功安装openvswitch
  • 一个简单的端口扫描程序
  • 《BREW进阶与精通——3G移动增值业务运营、定制与开发》一书的网店地址
  • apue.h
  • Linux 临时mount 移动设备
  • 文件描述符、文件表项、V节点表项、dup
  • linux 第一个内核模块Hello World
  • Linux 根据端口查找进程
  • tshark命令行的使用
  • 联通iPhone,真的是狼来了?
  • ----------
  • bootstrap创建登录注册页面
  • echarts的各种常用效果展示
  • Flex布局到底解决了什么问题
  • nginx 配置多 域名 + 多 https
  • Solarized Scheme
  • Spring核心 Bean的高级装配
  • Vue学习第二天
  • yii2中session跨域名的问题
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 实现简单的正则表达式引擎
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 【云吞铺子】性能抖动剖析(二)
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)Android开发优化---------UI优化
  • (31)对象的克隆
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (阿里云万网)-域名注册购买实名流程
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET BackgroundWorker
  • .Net Web窗口页属性
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • 。Net下Windows服务程序开发疑惑
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [Android] Upload package to device fails #2720
  • [Assignment] C++1
  • [c]统计数字
  • [C++]指针与结构体
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件
  • [github配置] 远程访问仓库以及问题解决
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • [IE技巧] 如何让IE 启动的时候不加载任何插件
  • [JavaEE系列] Thread类的基本用法
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
  • [LeetCode][面试算法]逻辑闭环的二分查找代码思路
  • [No000016]为什么假期计划总是做不到?