首页 > 编程语言 >RichEdit RTF格式文本的存储和读取 VC++

RichEdit RTF格式文本的存储和读取 VC++

时间:2023-08-01 13:00:41浏览次数:47  
标签:RTF RichEdit LONG pRtf C++ DWORD psEntry 指针

Rtf格式文本的读写,向控件发送 EM_STREAMIN 和 EM_STREAMOUT 消息,控件把格式文本显示或从把显示内容转化为格式文本。

接口是用户定义的回调函数,格式文本由参数DWORD_PTR dwCookie传递。

从控件读出RTF文本,参数用string 比较好,因为消息处理是根据文本的长度,多次调用回调函数,传出数据需要在回调函数中多次分配内存空间,
拼接字符串,直接用指针比较麻烦。每次重新分配似乎不太好。
用string 可以直接操作符+=,或append方法拼接字符串,

DWORD CALLBACK CXTREdit::EditStreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)
{
    string* psEntry = (string*)dwCookie; //指向DWORD的指针, dwCookie 实际上是 &lpRTF
        
    //*psEntry += (char*)pbBuff;   //+= 和Append 应该都是内存拼接
    (*psEntry).append((char*)pbBuff); // += 和Append 应该都是内存拼接

    *pcb = strlen((char*)pbBuff);  //当前处理的数量 

    return 0;
}

int CXTREdit::GetRTF(string &sRtf)
{
    EDITSTREAM es = { (DWORD_PTR)&sRtf, 0, EditStreamOutCallback };

    int iAttrib = SF_RTF;
    SendMessage(m_hWndREdit, EM_STREAMOUT, (WPARAM)iAttrib, (LPARAM)&es);

    return sRtf.length();

}

 

把RTF写入控件进行显示,则直接传入指针即可,若显示完要释放字符串空间,则原来的指针不要被改了,传指针的值,不要传引用。
而在回调函数里,因为要分段处理,所以指针是要被修改的,所以回调函数中传指针的地址。

DWORD CALLBACK CXTREdit::EditStreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG* pcb)  //OK
{
    char** psEntry = (char**)dwCookie;  //传指针地址其实就是传 指针的指针

    LONG len = strlen(*psEntry);

    if (len > cb) len = cb;

    LONG i = 0;
    while ((i++) < len)  //cb最大是0xffc,处理时原来的指针移动需要保存,所以用指针的指针
    {
        *(pbBuff++)= *((*psEntry)++);  //改动的是被指的指针
    }
    *pcb = i;
return 0; } int CXTREdit::SetRTF(char* pRtf) { //pRtf指针是传值进来的,这里再传地址是指向pRtf字符串的新指针,不会改变pRtf原来的指针 EDITSTREAM es = { (DWORD)&pRtf, 0, EditStreamInCallback }; //把新指针的地址传进去,因为要在回调函数中移动 int iAttrib = SF_RTF; SendMessage(m_hWndREdit, EM_STREAMIN, (WPARAM)iAttrib, (LPARAM)&es); return strlen(pRtf);
}

 

标签:RTF,RichEdit,LONG,pRtf,C++,DWORD,psEntry,指针
From: https://www.cnblogs.com/xgz21/p/17596171.html

相关文章

  • C++ Primer 第五版
    当我们使用istream对象作为条件时,其效果是检测流的状态.char:[-128,127].C++17新增byte数据类型,在<cstddef>头文件中定义,取值范围:[0,255].int和long都占用4字节空间.切勿混用带符号类型和无符号类型.\后跟3位以内8进制数字,或\x后跟一个或多个16进制数字都可以代表字符......
  • 【暑假例题】20230727 矩阵基本运算(C++)
    题目请使用C++实现矩阵的各种运算矩阵创建矩阵相加矩阵相减矩阵相乘数字乘矩阵矩阵上叠加矩阵左右叠加矩阵转置矩阵旋转矩阵求逆矩阵输出题目分析矩阵创建这里只需注意由于我们需要通过不同的函数对数组进行操作,所以我们需要将数组存储在容器或者使用指针防止数......
  • C++中不支持strdup(),使用_strdup()
    1.问题C4996 'strdup':ThePOSIXnameforthisitemisdeprecated.Instead,usetheISOCandC++conformantname:_strdup.Seeonlinehelpfordetails. Project1 G:\VS\Project1\Project1\MyString.cpp 802.原因错误C4996是一个编译器警告,它指示在代码中使用了一个......
  • c++11 call_once & once_flag
    #include<iostream>#include<mutex>usingnamespacestd;voidonce_fun(std::once_flag&&flag){std::call_once(flag,[](){cout<<"messagefromoncefun"<<endl;});}voidonce_fun1(s......
  • c++并发
    《c++并发编程第二版》,一方面翻译的挺拗口,一方面内容有点难度,看的很吃力,尤其到后面内存模型,无锁编程部分,看不下去了,仅记录部分内容。并发:采用任务切换的方式,一个任务运行一会在切换回另一个任务,在一个时间段内好像两个任务在同时进行并行:在多个CPU或多核CPU中同一时间多个任务同......
  • C++ | const的使用
    const基础用法用于声明一个不可再被修改的变量:constintnum=17;num=33; //Invalid,会报错用于指针首先,如果将一个指针用const声明为常量指针,那么这个指针的指向将不能被改变。但可以通过这个指针来修改被指向的对象:intdemo=17;int*constp=&demo; //......
  • C++ | 引用
    引用&使用引用intb=33,&a=b;b=17;cout<<a;//打印a为17使用引用声明变量类似于指针,声明的变量会同被引用的变量绑定,修改任何一方的数据都会使另一方的数据也改变。使用上的区别在于使用引用不需要*,引用可以理解为一个别名。在函数中使用引用传递参数将参......
  • C++ | 运算符重载
    运算符重载在类中的函数进行重载(成员函数)运算符重载用于重新定义运算符的作用,使用函数名称operatorOP作为函数名,其中OP为具体的运算符(如operator+)classTime{Timeoperator+(constTime&t);};Timea,b;Timec=a+b;在成员函数中重载的运算符,如+-等,默认左边......
  • C++初始化列表时,形参和实参名可以一样,编译器可以识别
    在这里初始化列表直接用age(age)即可,用this->age(age)反而会出错,C++不允许在成员初始化列表中使用this关键字来初始化类成员classPerson{public:Person(intage):age(age){}//Initializethe'age'memberdirectlyinthememberinitializerlistinta......
  • TreeCtrl 树的存储和还原 2, VC++
    TreeCrtl树的节点可以随意的添加,删除,移动。树保存到数据库中,并能从数据库读出还原。树节点的LPARAM存放ID,这个ID是数据表自增长主键。1.数据库中读出,按PID,SID顺序,这样读出的第一个为root2.读出的数据存入list3.创建root节点,把root放入map,从list中删除4.遍历list,pid,sid在map中找......