CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 3 of 3
  1. #1
    Guest

    Serialization of CRichEditCtrl

    Help!! I need to know how I can serialize a CRichEditCtrl!!! Can anyone help me?


  2. #2
    Join Date
    Mar 1999
    Location
    St. Louis
    Posts
    45

    Re: Serialization of CRichEditCtrl

    Below is a set of code that I use for file/memory IO. A similar set can be used for views. Hope this is useful.

    Since you are using a CRichEditCtrl, maybe you could help me :-) I am trying to embed one in a dialog. The CRichEditCtrl will throw on create if I specify one in the resource editor. I can create one through code but then I loose all formatting in the streamed text. The text's format goes the parent dialog's font setting. How do I set things up correctly so I can properly use the resource specifications and have a CRichEditCtrl that doesn't default to its parent's font settings?

    ARichEditControl is derived from CRichEditCtrl
    APath is derived from CString
    The callbacks are declared as static


    void ARichEditControl::ExtractRTFString(CString &outString, int options)
    {
    this->LockWindowUpdate();
    EDITSTREAM es = {(DWORD)&outString, 0, ARichEditControl::OutStringCallBack};
    CRichEditCtrl &cntl = *this;
    SInt32 start = 0, end = 0;
    cntl.GetSel(start, end);
    cntl.SetSel(0, cntl.GetTextLength());
    options = options | SFF_SELECTION | SF_RTFNOOBJS | SFF_PLAINRTF;
    cntl.StreamOut(options, es);
    cntl.SetSel(start, end);
    this->UnlockWindowUpdate();
    }

    void ARichEditControl::InsertRTFString(CString &inString)
    {
    this->LockWindowUpdate();
    EDITSTREAM es = {(DWORD)&inString, 0, ARichEditControl::InStringCallBack};
    CRichEditCtrl &cntl = *this;
    SInt32 start = 0, end = 0;
    cntl.GetSel(start, end);
    cntl.SetSel(0, cntl.GetTextLength());
    cntl.StreamIn(SF_RTF | SFF_PLAINRTF | SFF_SELECTION, es);
    cntl.SetSel(start, end);
    this->UnlockWindowUpdate();
    }

    void ARichEditControl::InsertRTFFile(const APath &inPath, CRichEditCtrl &inCntrl)
    {
    CFile file(inPath, CFile::modeRead);

    // this->LockWindowUpdate();
    EDITSTREAM es = {(DWORD)&file, 0, ARichEditControl::InFileCallBack};
    SInt32 start = 0, end = 0;
    inCntrl.GetSel(start, end);
    inCntrl.SetSel(0, inCntrl.GetTextLength());
    inCntrl.StreamIn(SF_RTF | SFF_PLAINRTF | SFF_SELECTION, es);
    inCntrl.SetSel(start, end);
    // this->UnlockWindowUpdate();
    }

    DWORD CALLBACK ARichEditControl::InFileCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG maxCount, LONG *pcb)
    {
    if (dwCookie)
    {
    // make this readable
    // CString &source = *(CString *)dwCookie;
    CFile &file = *(CFile *)dwCookie;
    long &actuallCount = *pcb;
    // if the string can fit into the buffer
    if( file.GetLength() < maxCount )
    {
    // the bytes moved will be equal to the string's length
    // actuallCount = source.GetLength();
    actuallCount = file.GetLength();
    // move the data into the buffer
    // ::memcpy(pbBuff, (LPCSTR)source, actuallCount );
    file.Read( pbBuff, actuallCount );
    // treat the string like a stream and flush to all that has been read
    // source.Empty();
    // no, do not do that
    }
    else // the string is larger than the buffer
    {
    // we hit a limit at the buffer
    actuallCount = maxCount;
    // move the stuff over
    // ::memcpy(pbBuff, (LPCSTR)source, actuallCount );
    file.Read( pbBuff, actuallCount );
    // eliminate the left side characters that have neen read
    // source = source.Right( source.GetLength() - maxCount );
    }
    }
    return 0;
    }

    DWORD CALLBACK ARichEditControl::InStringCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG maxCount, LONG *pcb)
    {
    if (dwCookie)
    {
    // make this readable
    CString &source = *(CString *)dwCookie;
    long &actuallCount = *pcb;
    // if the string can fit into the buffer
    if( source.GetLength() < maxCount )
    {
    // the bytes moved will be equal to the string's length
    actuallCount = source.GetLength();
    // move the data into the buffer
    ::memcpy(pbBuff, (LPCSTR)source, actuallCount );
    // treat the string like a stream and flush to all that has been read
    source.Empty();
    }
    else // the string is larger than the buffer
    {
    // we hit a limit at the buffer
    actuallCount = maxCount;
    // move the stuff over
    ::memcpy(pbBuff, (LPCSTR)source, actuallCount );
    // eliminate the left side characters that have neen read
    source = source.Right( source.GetLength() - maxCount );
    }
    }
    return 0;
    }

    DWORD CALLBACK ARichEditControl::OutStringCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG maxCount, LONG *pcb)
    {
    if (dwCookie)
    {
    CString &destination = *(CString *)dwCookie;
    long &actuallCount = *pcb;
    actuallCount = destination.GetLength();
    // use the constructor to copy in the data
    CString source((LPCSTR)pbBuff, maxCount);
    destination += source;
    actuallCount = destination.GetLength() - actuallCount;
    }
    }





  3. #3
    Guest

    Re: Serialization of CRichEditCtrl

    If you are using CRichEditView, set the CRichEditDoc::m_bRTF flag to FALSE
    in your derived document class's constructor.


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured