使用CRichEditCtrl的stream功能读写文件

【MFC】如何读取rtf文件并进行展示 rtf是微软的一个带格式的文件,比word简单,我们可以用写字板等程序打开编辑。下面以具体实例讲解如何在自己程序中展示rtf文件。首先使用VS2022创建一个MFC的工程。 阅读详情
 网上的有些毛病
DWORD CALLBACK WriteFileCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR* pcb)
{
    CFile *pFile = (CFile*)dwCookie;
    try
    {
        pFile->Write(pbBuff, cb);
       *pcb = cb;
    }
    catch(CFileException* pEX)
    {
        pEX;
        *pcb = 0;
        return 1;
    };
   
    return 0;
}

DWORD CALLBACK ReadFileCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG FAR* pcb)
{
    CFile *pFile = (CFile*)dwCookie;
    try
    {
        *pcb = pFile->Read(pbBuff, cb);
    }
    catch(CFileException* pEX)
    {
        pEX;
        *pcb = 0;
        return 1;
    };

   
    return 0;
}

void CMyRichEditVIew::OnOpen()
{
    if(!sFileName.IsEmpty()) {
        CFile file(sFileName, CFile::modeRead | CFile::typeBinary);
        EDITSTREAM stream;
        stream.dwCookie = (DWORD)&file;
        stream.pfnCallback = ReadFileCallBack;
        GetRichEditCtrl().StreamIn(SF_TEXT, stream);
        file.Close();
       
    }
}

void CMyRichEditVIew::OnSave()
{
    if(!sFileName.IsEmpty()) {
        CFile file(sFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
        EDITSTREAM stream;
        stream.dwCookie = (DWORD)&file;
        stream.pfnCallback = WriteFileCallBack;
        GetRichEditCtrl().StreamOut(SF_TEXT, stream);
        file.Close();
    }
}

void CMyRichEditVIew::OnFileOpen()
{
    // TODO: Add your command handler code here
    CString fileName; //打开的文件名
    //文件过滤器,打开文件时,文件列表中只出现过滤后的文件
    static TCHAR szFilter[] = _T("文本文件 (*.log)|*.log|Rich Text Format (*.rtf)|*.rtf|全部文件 (*.*)|*.*||");
    CFileDialog cfDlg(TRUE,NULL,_T("*.log"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,this);
    if(cfDlg.DoModal() == IDOK)
        fileName = cfDlg.GetFileName();
    else
    return;
   
    //检查文件类型
    int pos = fileName.Find(_T("."),0);

    int extlength = fileName.GetLength() - pos -1;
    CString fileType = fileName.Mid(pos+1,fileName.GetLength() - pos -1);


    //打开文件
    if(fileType.CompareNoCase(_T("log")) == 0)
    {
        CSerialLogDiffDoc * pDoc = (CSerialLogDiffDoc*)GetDocument();
        pDoc->SetTitle(fileName);
       
        SetFileName(fileName);
        OnOpen();
        ClearModifyFlag();

        Parse();
    }
   
}

void CMyRichEditVIew::OnFileSave()
{
        // TODO: Add your command handler code here
    CString fileName; //打开的文件名
    //文件过滤器,打开文件时,文件列表中只出现过滤后的文件
    static TCHAR szFilter[] = _T("文本文件 (*.log)|*.log|Rich Text Format (*.rtf)|*.rtf|全部文件 (*.*)|*.*||");
    CFileDialog cfDlg(FALSE,NULL,_T("*.log"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,this);
    if(cfDlg.DoModal() == IDOK)
        fileName = cfDlg.GetFileName();
    else
    return;
   
    //检查文件类型
    int pos = fileName.Find(_T("."),0);

    int extlength = fileName.GetLength() - pos -1;
    CString fileType = fileName.Mid(pos+1,fileName.GetLength() - pos -1);

   
    //打开文件
    if(fileType.CompareNoCase(_T("log")) == 0)
    {
        CSerialLogDiffDoc * pDoc = (CSerialLogDiffDoc*)GetDocument();
        pDoc->SetTitle(fileName);

        SetFileName(fileName);
        OnSave();
       
        ClearModifyFlag();
    }
}
VC++读取RTF文档 VC++读取rtf文件,整理不易,希望可以帮到大家。 立即下载

相关推荐

VC中RichEdit读取保存rtf文件

VC源码,可以实现读取rtf格式文件并显示在RichEdit文本框中,同时也可以保存在制定的rtf文件中,内容可以有文本及图片

CRichEdit不让streamin把以前的内容替换掉的方法

今天终于利用CRichEditCtrl实现了聊天对话框截取,发送与显示图片。在利用CRichEditCtrl提供的StreamIn来显示复杂文本和图片的时候,由于需要设置SFF_SELECTION(replace the current selection),所以总是容易把其中选中的内容替换掉。造成内容丢失。下面的方法可以解决: void CMyRichEditCtrl::StreamIn(CM

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 873

MFC实现简单文本查找

MFC实现简单文本查找

如何在CRichEditCtrl控件中直接读如RTF格式的文件(这个是通过流的方式来读取文件)...

如何在CRichEditCtrl控件中直接读如RTF格式的文件 Inserting an RTF string using StreamIn -------------------------------------------------------------------------------- When inserting Rich Text Format...

dkopg24406的专栏 338

攻防世界-Reverse-Game

攻防世界,game,逆向

wuh2333的博客 776

c语言国际象棋(easyx图形库)

c语言实现的国际象棋,先放源码,有空再更 所有图形资源均来源于网络,侵删 #include <graphics.h> #include<stdio.h> #include<conio.h> #include<math.h> #include<stdlib.h> #include <time.h> #define HEIGHT 800 #define WIDTH 1100 #define SIZE 100 #define true.

Betelgeuse13的博客 1914

CRichEditCtrl加载 rtf 文件和字符串的方法

CRichEditCtrl类没有直接赋值 rtf 的方法,需要通过回调函数的方式加载。本文介绍的几种方法,主要用于加载 rtf 字符串。

Python的专栏 3651

C语言实现TCP聊天室:Socket编程与并发模型实战解析

网络编程是构建分布式系统的核心技术,其核心在于理解进程间通信的底层机制。TCP/IP协议栈提供了可靠的字节流传输服务,通过Socket API这一抽象接口,开发者可以在应用层建立连接、收发数据。为了高效处理多个并发连接,服务器需要采用多线程或I/O复用模型,前者为每个连接创建独立线程,逻辑清晰但资源消耗大;后者通过select、poll或epoll等系统调用监控多个文件描述符,显著提升并发能力。这些技术是构建高性能网络服务(如即时通讯、在线游戏服务器)的基础。本文以C语言实现一个简洁的TCP聊天室为例,详细

weixin_32642109的博客 292

基于VC 6.0与MFC的邮件客户端开发:SMTP/POP3协议实现与网络编程实战

网络编程是计算机通信的基础,其核心在于通过Socket建立连接,实现不同主机间的数据交换。理解TCP/IP协议栈和Socket编程模型,是掌握网络应用开发的关键。在工程实践中,网络编程的价值体现在构建各种分布式系统、实时通信工具和客户端-服务器应用。以电子邮件系统为例,其底层依赖SMTP和POP3等应用层协议进行邮件传输与管理。本文将深入解析如何基于经典的VC 6.0开发环境和MFC框架,从零实现一个支持邮件收发功能的本地客户端。内容涵盖Winsock库的初始化、SMTP/POP3协议的命令-响应交互逻辑、

weixin_30904593的博客 405

Seedance 2.5本地部署指南:AI生图与视频生成的完整实践

最近在AI生成内容领域,本地部署方案越来越受到开发者关注。特别是Seedance 2.5的发布,让很多原本依赖云端服务的用户开始转向本地化解决方案。本文将从实际使用角度出发,完整介绍Seedance 2.5的本地部署流程、功能特性对比以及实际应用技巧。 1. Seedance 2.5核心特性解析 1.1 什么是Seedance 2.5 Seedance 2.5是一款开源的AI生图和视频生成工具,支持在本地环境运行,无需联网即可实现高质量的图像和视频生成。相比之前的2.0版本,2.5在生成质量、运行效率和功能

weixin_42566121的博客 1677

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时,需登录Google账号,有时会弹出如下通知。Google登录界面也会出现如下提示这个报错的原因是设备未通过Google认证,google服务器未配置荣耀设备的型号白名单导致国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这个提示,但本质的问题没有解决,无法登录Google账号。

胡同老道的博客 2万+

基于C++与MFC的仿QQ即时通信工具:从架构设计到实战开发

即时通信(IM)系统是现代网络应用的核心组件之一,其基础原理依赖于客户端/服务器(C/S)架构和可靠的网络传输协议。在技术实现层面,Socket网络编程是构建网络通信的基石,通过TCP长连接维持稳定的数据传输通道,并需妥善处理数据包的粘包与拆包问题以保障消息完整性。在Windows桌面开发领域,MFC框架作为经典的应用程序框架,为开发者提供了构建图形用户界面和处理消息循环的基础设施。将网络通信与UI框架结合,能够实现功能完整的桌面级应用,例如仿QQ的即时通信工具。这类工具不仅涉及网络模块,还需整合数据序列化

weixin_30444105的博客 435

AutoCAD矢量数据导出全攻略:GIS4CAD插件一键转shp/mdb/kml(附安装包)

本文详细介绍了GIS4CAD插件如何高效解决AutoCAD矢量数据向GIS格式转换的难题。通过一键操作,用户可将CAD中的规划图、地形图等无损转换为行业标准的shp、mdb、kml等多种格式,并确保属性完整与坐标准确。文章提供了从插件安装、数据准备到实战导出的全流程指南,是城市规划、测绘等领域专业人士提升数据互操作效率的必备攻略。

a2b3c4d5e的博客 283

基于C++与MFC的局域网聊天程序:从Socket编程到多线程同步的完整实现

网络编程是构建分布式应用的基础,其核心在于实现不同主机间的进程通信。TCP/IP协议栈提供了可靠的字节流传输服务,而Socket(套接字)则是应用层与传输层之间的编程接口,开发者通过它建立连接、发送和接收数据。在Windows平台下,Winsock API是实现网络通信的标准方式。多线程技术对于处理并发连接至关重要,它能有效提升服务器响应能力和资源利用率,但同时也引入了线程同步与数据竞争等挑战。客户端/服务器(C/S)架构是经典的分层设计模式,通过职责分离实现系统的可维护性与可扩展性。本文将结合一个具体的*

weixin_30642869的博客 323

YOLOv13改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLOv13-T !!! 最新的发文热点

模块是模型中的一个重要组成部分,其主要作用是在模型的初始阶段对输入图像进行处理,方便后续的特征提取和目标检测。以下是对。

Limiiiing的博客 354

【绝对要收藏-优秀论文范文】高项-度量绩效域

摘要:本文基于某水库数字孪生平台建设项目(2022.9-2023.5,645.97万元)的管理实践,从信息系统度量绩效域角度展开论述。项目构建了包含防洪调度等6大子系统的数字平台,实现洪水"四预"功能。重点分析了度量绩效域的五大要点:制定有效指标(如成本±8%偏差阈值)、多维数据采集、预警临界值设定、基于趋势的主动干预和持续改进机制。特别阐述了绩效问题的诊断方法,包括设备采购全周期成本分析、阶段性成本报告制度等。项目状态展示采用三维可视化看板,集成进度、成本、质量等多维度实时数据,最终实

xylllamm的博客 345

Richedit使用大全

[转]Richedit使用大全一.常见问题a.可以编译,不能执行的AfxInitRichEdit();b.升级默认的Riched版本(默认的有一些bug),如可在InitInstance中添加LoadLibrary("RICHED20.DLL") 最后注意 FreeLibrary 如果是CRichEditView基类的可用BOOL CXXXXXXView::

denglei265的专栏 3937

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

用RichEditCtrl写的一个读取.rtf格式的程序(rtfdemo)

一部分 // rtfdemoView.h : CrtfdemoView 类的接口//#pragma once#include "afxcmn.h"class CrtfdemoView : public CView{protected: // 仅从序列化创建 CrtfdemoView(); DECLARE_DYNCREATE(CrtfdemoView)// 属性public: Crt

肖飞figo的云计算专栏 1368

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

如何在CRichEditCtrl控件中直接读如RTF格式的文件

如何在CRichEditCtrl控件中直接读如RTF格式的文件(这个是通过流的方式来读取文件) 如何在CRichEditCtrl控件中直接读如RTF格式的文件           Inserting an RTF string using StreamIn------------------------------------------------------------------

carl2380的专栏 1504

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

CRichEditCtrl 多格式编辑控件的使用

详解CRichEditCtrl类和多格式编辑控件的使用。

h3974的博客 2996

VC++ 之 RichEdit 常见使用技

一.常见问题 a.可以编译,不能执行的 AfxInitRichEdit(); b.升级默认的Riched版本(默认的有一些bug),如 可在InitInstance中添加 LoadLibrary("RICHED20.DLL") 最后注意 FreeLibrary 如果是CRichEditView基类的可用 BOOL CXXXXXXView::PreCreateWindow(

风铃中的刀声 7191

高级编辑控件-CRichEditCtrl

高级编辑控件如图: 相比较普通编辑控件,在高级编辑控件中,不同的文字和段落可以设置不同的字体和颜色。 使用高级编辑控件,应首先在APP类的InitInstance()函数中添加如下代码:AfxInitRichEdit(); 设置必要的属性:Multiline、WantReturn 等,其它根据需要进行设置。 高级编辑控件的使用如下例: CHARFO

小米的修行之路 2059

格式文本框(Rich Edit)使用实例

开发平台:visual studio 2010 (1).新建一个基于对话框的MFC,命名为"RichEditDemo" (2)在主对话框上添加一个Rich Edit控件,将其ID修改为"IDC_EDIT", (3)在CRichEditDemoApp的InitInstance函数中添加初始化代码: //初始化Rich Edit控件 AfxInitRichEdit2(); 注意visua

BoArmy的专栏 1769
上一篇: 转载:VC中基于 Windows 的精确定时
下一篇: CRichEditCtrl 的 2个 BUG
devmole
博客等级 码龄20年 2粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值