文档库 最新最全的文档下载
当前位置:文档库 › MFC中文本编辑实例讲解

MFC中文本编辑实例讲解

MFC中文本编辑实例讲解
MFC中文本编辑实例讲解

MFC字符输入实例讲解

本文主要通过简单实例讲解,实现SDI中的视图窗口中实现字符的输入功能,主要是通过本文能够给MFC初学者一个相对简单的认知过程,希望能够给像我一样的菜鸟们一缕光明(好悲壮啊)!

1.首先在VS2008内创建一个单文档(SDI)工程,起名为MyText,

选择默认即可,编译完成效果如下:

图1

2.接下来,请根据我的思路与我一起去思考!完成字符输入功能,

首先我们需要一个光标(caret),因此第一步,我们需要实现光

标的创建与现实!在视图类窗口(客户服务区)创建后,我们创

建我们的光标,那么需要在哪里创建呢?对了!CMyTextView类

中的消息WM_CREATE对应的OnCreate()函数中添加即可:int CMyTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO: 在此添加您专用的创建代码

CClientDC clientDC(this);

//获取当前字体的度量信息

TEXTMETRIC tm;

clientDC.GetTextMetrics(&tm);

//创建实体光标并显示

CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);

ShowCaret();

return 0;

}

3.此时光标显示在左上角位置,且不能移动。因此如何让光标移动

到我们鼠标点击的位置呢?显然,我们要在视图类中相应WM_LBUTTONDOWN消息,编辑相应的代码:

void CMyTextView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

SetCaretPos(point);

m_point = point;

CView::OnLButtonDown(nFlags, point);

}

4.下面应该是我们处理字符的阶段了!想实现字符输入,我们要敲

键盘,那我们应该去响应那个消息?当然是WM_CHAR,编辑其相应的处理函数将是我们的主要工作。此时,我想由易到难,步步解析,这样更容易大家理解,我们依次解决以下问题:

在响应之前,我们首先需要存储之前我们点击鼠标左键的位置,因为我们要在点击的位置输入字符,我们输入字符的函

数TextOut(横坐标,纵坐标,…),所以我们在视图类中添加

一个CPoint型的私有变量m_point,并在OnLButtonDown()

函数中赋值;此时,编辑字符输入的代码如下:

void CMyTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {

// TODO: 在此添加消息处理程序代码和/或调用默认值

CClientDC viewDC(this);

//字符类型转换

CString str;

str.Format(_T("%c"),nChar);

//字符输出

viewDC.TextOut(m_point.x,m_point.y,str);

CView::OnChar(nChar, nRepCnt, nFlags);

}

编译、运行效果如下:

图2

还不是庆祝的时候!最明显的不足是只能显示一个字符,究其原因是我们上面的程序不足,上面的程序只能在固定的位置显示字符,后面输入的字符将会覆盖掉前面的字符;解决方法:我们在视图类中定义一个CString类型的私有变量m_strLen,她的作用是对输入的字符进行累加组成字符串,最后当输入完成后,我们程序也将显示全部输入信息!

void CMyTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {

// TODO: 在此添加消息处理程序代码和/或调用默认值

CClientDC viewDC(this);

//字符类型转换

CString str;

str.Format(_T("%c"),nChar);

m_strLen += str;

//字符输出

viewDC.TextOut(m_point.x,m_point.y,m_strLen);

CView::OnChar(nChar, nRepCnt, nFlags);

}

我们在不同的位置写入“中国人”,效果如下:

图3

新的问题又出现了,两个问题:第一,在字符输入位置发生变化(即鼠标左键点击)时,m_strLen没有进行清空!第二,光标(caret)位置没有移动到后面位置;解决方法:在OnLbuttonDown()函数中添加一句:m_strLen = _T(“”)即可!

解决光标位置移动问题,利用CDC类中的GetTextExtent()成员函数,获得m_strLen字符串的长度,再SetCaretPos()即可!代码如下:

void CMyTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {

// TODO: 在此添加消息处理程序代码和/或调用默认值

CClientDC viewDC(this);

//字符类型转换

CString str;

str.Format(_T("%c"),nChar);

m_strLen += str;

//获得字符长度,设置光标的位置

CSize m_size = viewDC.GetTextExtent(m_strLen);

CPoint point;

point.x = m_point.x + m_size.cx;

point.y = m_point.y;

SetCaretPos(point);

//字符输出

viewDC.TextOut(m_point.x,m_point.y,m_strLen);

CView::OnChar(nChar, nRepCnt, nFlags);

}

效果如下:

图4

基本上我们可以鼓掌庆祝一下了!通过我们的“丝丝入扣“的讲解,我们实现了最基本的字符输入功能。接下来,我们所

要做的就是对整个字符输入模块的功能完善,在现有的代码

基础上进行修改、完善。

5.功能完善阶段,主要处理有关回车键及退格键输入的问题;

回车键输入,需要我们做两点工作,一是要对m_strLen变量进行清空处理,二是要设置我们的光标位置;代码的修改如

下:

void CMyTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {

// TODO: 在此添加消息处理程序代码和/或调用默认值

CClientDC viewDC(this);

//获取当前DC中的字体信息

TEXTMETRIC txtm;

viewDC.GetTextMetrics(&txtm);

if (0x0D == nChar)

{

//m_strLen清空操作

m_strLen.Empty();

//调整光标的位置

m_point.y += txtm.tmHeight;

SetCaretPos(m_point);

}

else

{

//字符类型转换

CString str;

str.Format(_T("%c"),nChar);

m_strLen += str;

//获得字符长度,设置光标的位置

CSize m_size = viewDC.GetTextExtent(m_strLen);

CPoint point;

point.x = m_point.x + m_size.cx;

point.y = m_point.y;

SetCaretPos(point);

//字符输出

viewDC.TextOut(m_point.x,m_point.y,m_strLen);

}

CView::OnChar(nChar, nRepCnt, nFlags);

}

效果如下:

图5

退格键输入时,需要解决的问题,一是如何修改显示的字符串,二是,光标位置问题。解决方法:对于光标的位置问题,只要知道了m_strLen的长度,就可实现光标的位置定位问题,因此关键是如何修改字符串,每次相应退格键时,将m_strLen 删除一个字符即可,具体为:m_strLen = m_strLen.Left();

此时摆在我们面前的困难时如何显示修改后的字体,直接再TextOut()出修改的m_strLen?你可以试试,原来被删出的字,仍然呆在那儿,因为你的输出仅仅是覆盖之前的已经显示的字体。好了!不再绕大家了,要不然把大家给绕晕了,就是我的错了!

思路:当输入为退格键,首先我们把DC的字体颜色设置为背景色,然后再将m_strLen字符串输出,此时我们什么也看不见哦(也可以简单理解为清空输出,以便后面再次输出修改后的m_strLen)!接下来,我们把m_strLen最后一个字符删除,然后再将DC的字体颜色还原为原来颜色!接下来我们再一次将m_strLen输出,并且根据此时的m_strLen长度修改光标的位置!至此完成大作!

void CMyTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

CClientDC viewDC(this);

//获取当前DC中的字体信息

TEXTMETRIC txtm;

viewDC.GetTextMetrics(&txtm);

if (0x0D == nChar)

{

//清空

m_strLen.Empty();

//调整光标的位置

m_point.y += txtm.tmHeight;

SetCaretPos(m_point);

}

else if (0x08 == nChar)

{

//关键代码段!

COLORREF precolor = viewDC.SetTextColor(viewDC.GetBkColor());

viewDC.TextOut(m_point.x,m_point.y,m_strLen);

m_strLen = m_strLen.Left(m_strLen.GetLength()-1);

viewDC.SetTextColor(precolor);

// ○1

}

else

{

//字符类型转换

CString str;

str.Format(_T("%c"),nChar);

m_strLen += str;

// ○2

}

//获得字符长度,设置光标的位置,此段内容实际上应该放在○1、○2部分的,为了代码简洁,所以放在了后面,请读者注意,否则会增加理解的难度!!

CSize m_size = viewDC.GetTextExtent(m_strLen);

CPoint point;

point.x = m_point.x + m_size.cx;

point.y = m_point.y;

SetCaretPos(point);

//字符输出

viewDC.TextOut(m_point.x,m_point.y,m_strLen);

CView::OnChar(nChar, nRepCnt, nFlags);

}

看一下我们的巨著吧(忙了一个下午):

图6

学海无涯苦作舟

成长的烦恼

一、字体修改

面对丑陋的字体,真让人有些汗颜,简单修改字体,其步骤较为固定,首先创造字体,然后添加到DC上,搞定!这里我选择喜欢的“华文楷体”!

CClientDC viewDC(this);

//修改DC的字体及颜色

CFont newFont;

newFont.CreatePointFont(150,_T("华文楷体"));

viewDC.SelectObject(&newFont);

viewDC.SetTextColor(RGB(2,2,240));

二、疯狂的炫(待续)

文本编辑器使用使用说明

文本编辑器使用说明书

目录 1文本编辑器结构 (1) 1.1功能操作按钮栏 (1) 1.2内容栏 (1) 2功能分解 (1) 2.1功能操作按钮栏第一排 (1) 2.1.1全屏编辑 (2) 2.1.2预览 (2) 2.1.3粘贴 (2) 2.1.4粘贴为无格式文本 (2) 2.1.5从MS Word 粘贴 (2) 2.1.6撤销 (3) 2.1.7重做 (3) 2.1.8插入/编辑图像 (3) 2.1.9插入/编辑表格 (4) 2.1.10插入水平线 (4) 2.1.11插入/编辑超链接 (4) 2.1.12取消超链接 (5) 2.1.13查找 (5) 2.1.14替换 (5) 2.1.15全选 (5) 2.1.16清除格式 (5) 2.2功能操作按钮栏第二排 (5) 2.2.1格式 (6) 2.2.2字体 (6) 2.2.3大小 (6) 2.3功能操作按钮栏第三排 (6) 2.3.1空格 (6) 2.3.2加粗 (6) 2.3.3倾斜 (7) 2.3.4下划线 (7) 2.3.5删除线 (7) 2.3.6左对齐 (7) 2.3.7居中对齐 (7) 2.3.8右对齐 (7) 2.3.9两端对齐 (7) 2.3.10插入/删除编号列表 (8) 2.3.11插入/删除项目列表 (8) 2.3.12文本颜色 (8) 2.3.13背景颜色 (8) 2.3.14下标 (8) 2.3.15上标 (8) 2.3.16源代码 (9)

1文本编辑器结构 文本编辑器大体结构可以分为两部分,分别为:功能操作按钮栏和内容栏。 1.1功能操作按钮栏 功能操作按钮栏:用于对内容进行编辑。 1.2内容栏 内容栏:用于显示输入的内容。 2功能分解 在功能操作按钮栏中功能按钮分为三排,下面将分别按照每排的顺序进行逐一介绍。 2.1功能操作按钮栏第一排 功能操作按钮栏第一排中共包含16个功能按钮,如下图所示。 图2-1-1 功能操作按钮栏第一排

简易文本编辑器说明书

中北大学 课程设计说明书 学院、系: 专业: 班级: 学生姓名:学号: 设计题目:简易文本编辑器 起迄日期: 2016年12月16日~2016年12月29日指导教师: 日期: 2016年12月29日

1 设计目的 通过用户调查分析及实际需求,开发出一个文本编辑器,可以方便用户对文本进行编辑。系统需要实现如下基本功能: (1)具有图形菜单界面; (2)查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除;(3)可正确存盘、取盘; (4)正确显示总行数。 2 任务概述 要设计一简易的文本编辑器,要求有图形菜单界面,也就是菜单选择的界面,要实现的功能有对文本进行存盘,取盘,在某一个盘中新建一个TXT的文件,在里面输入内容,对这个文件进行取盘,显示出文本内容,并在显示的时候显示行数,具有对文本进行查找、替换、插入、移动、删除等功能。 为实现数据的有序存储,该编辑器应该用顺序表来存储输入的信息。顺序表是数据结构中线性表的一种,它是用一块地址连续的存储空间依次存储线性表的元素。其特点为:在顺序表上逻辑关系相邻的两个元素在物理位置上也相邻;在顺序表上可以随即存取表中的元素。在编辑器的主界面中应有如下提示信息: ⑴显示当前文本信息:从文件中读出文本,在某一个盘中创建一个文本文件,所以要读出来, 显示到显示器上,并统计出行数。 ⑵查找文本信息:因为在下面做插入,删除,移动之类的都需用到查找,在查找的时候,也要 调用一个字符匹配模式的程序,来判断查找的内容是否符合所要查找的内容。 ⑶删除文本信息:首先在数组中查找要删除的信息,查找的时候调用匹配模式的子函数,如果 找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息; ⑷插入文本信息:首先调用字符匹配模式的子函数找到插入点,如果找到该插入点,提示输入 插入信息,确认插入信息后,选择是否在这个位置插入,如果是的话执行插入,不是的话再往下查找下一个插入点。 ⑸替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的 信息内容,否则提示未找到要被替换的信息; ⑹保存文本信息:在这里使用文件写入读出的功能,把你修改完的内容保存到你所建立的文 本中。 ⑺显示文本内容:读出文件中的所有字符,显示到显示器上。 ⑻退出 3 模块划分 (1)系统主要包含主程序模块和其他操作模块。其调用关系如图(一)所示。

java课设—文本编辑器的设计与实现

淮 海 工 学 院 计算机工程学院
课程设计报告
设计名称: 选题名称: 姓 名: 面向对象课程设计 文本编辑器的设计与实现 学 号:
专业班级: 系 (院) : 设计时间: 设计地点: 计算机工程学院 2015.6.21~2014.7.4 计算机楼机房、教室、宿舍
指导教师评语:
成绩:
签名:
年 月 日

面向对象课程设计报告

1
页,共
14

1.课程设计目的
《面向对象程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程 后进行的一次较全面的综合练习。其目的在于通过实践加深学生对面向对象程序设计的理 论、方法和基础知识的理解,掌握使用 Java 语言进行面向对象设计的基本方法,提高运用 面向对象知识分析实际问题、解决实际问题的能力。
2.课程设计任务与要求:
课程设计可选用 NetBeans、Eclipse、JBuilder 等作为开发平台以提高开发效率,尽可能熟 练掌握其中一种集成开发环境。建议采用 UML 建模技术进行系统的分析设计,在 Visio 中画出系 统用例图和类图,并将 UML 图复制到设计报告中。 通过这次设计,要求掌握以下内容: 1)面向对象技术中的继承与多态(重载和覆盖)机制、各种修饰符的使用 2)类、包、接口的定义与使用 3)常用工具类与算法的实现(数组、向量、字符串、链表) 4)Java 常用标准 GUI 组件及其事件处理 5)Java 的异常处理机制 6)Java 的数据库连接技术 7)Java 的多线程技术与动画制作 8)Java 的网络编程 任务: 设计一个类似于 Windows 记事本(Notepad)的 Java 程序。可以打开、新建、保存一个文本 文件;对选中的文本进行各种编辑操作(设置字体、字号、字型、对齐方式、背景、前景色、复 制、粘贴、剪切、查找、替换等) ;在文本中能够插入对象。简单文本编辑器提供给用户基本的 纯文本编辑功能, 能够将用户录入的文本存储到本地磁盘中。 能够读取磁盘中现有的纯文本文件, 以及方便用户进行需要的编辑功能。

几种常用网页文本编辑器总结

文本编辑器应用总结 一.lhgeditor文本编辑器 lhgeditor组件文件结构: 1. lhgeditor.js:组件的核心JS文件 2. lhgeditor.css:组件的样式表文件 3. images:组件所需的图片都在此文件夹中 以上三个文件为组件所必须的三个文件,组件包中其它以“_”开头的文件为示例的演示文件,实际使用中不需要这些文件。当然框架核心文件lhgcore.js是每个组件都必须用到的文件,记得加载组件前先要加载此文件。 lhgeditor组件使用说明: 1. 在调用组件的页面加载lhgcore.j s和lhgeditor.js两个文件。 2. 在window.onload函数里加入J.editor.add(编辑器的id).init(); 例:

二.nicEdit文本编辑器