c++mfcformatboldsdi

MFC SDI rich edit 2.0 control bolding words


How would i go about formatting text in a rich edit 2.0 control? As of right now i just have a simple little MFC program with a single view and just one rich edit 2.0 control. It's currently empty but i want to insert some text into it.

The control itself is labeled as StringToChange2 and the member within my class is m_StringToChange2.

    TCHAR INIValue2[256] = _T("Here is some random text!");
    SetDlgItemText(StringToChange2, INIValue2);

So as it stands now, when i run my program it inserts the text into my control. How can i make a word bold from the whole string?

For example i just want it to say : "Here is some random text!" As it stands now, i can make the whole control bold but I don't want the whole thing to be bold, just a word.

This Link has a very similar question to what I am asking but there is 2 things wrong with it. First, almost all the comments tell him to use a HTML control which i don't want to turn to yet. Second, the one person who did respond to him has such a long snippet of code i don't understand what's happening. The very last answer recommends he use word pad since it uses RTF?

I tried to insert RTF code into my INIValue2 but it won't take it. Unless I'm using it wrong, which could highly be the case.

I've been stalking MSDN and reading the functions, but my level of expertise with MFC and richedit control is very limited. If someone could post a small example of this, it doesn't even have to relate to my question , but something i could use as a base for.

Edit1: It's not that my INIValue2 doesn't take it, it's that when it appears on my single view - it shows everything - including all the RTF code and header.


Solution

  • You have to format the text using EM_SETCHARFORMAT message. In MFC, you can use CRichEditCtrl::SetSelectionCharFormat

    First, declare CRichEditCtrl member data in your dialog or window class

    CRichEditCtrl m_richedit;
    

    In OnInitDialog put

    m_richedit.SubclassDlgItem(IDC_RICHEDIT21, this);
    

    Apply the CHARFORMAT as follows:

    CHARFORMAT cf = { sizeof(cf) };
    cf.dwEffects = CFM_BOLD;
    cf.dwMask = CFM_BOLD;
    m_richedit.SetSel(0,2);
    m_richedit.SetSelectionCharFormat(cf);
    

    You can use helper functions to make this easier. For example see this post


    To assign RTF text directly, you must use EM_STREAMIN. For some reason MFC has no function for this, so you have to write your own function

    DWORD __stdcall callback_rtf_settext(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
    {
        CString *psBuffer = (CString*)dwCookie;
        if (cb > psBuffer->GetLength()) 
            cb = psBuffer->GetLength();
        for (int i = 0; i < cb; i++) 
            *(pbBuff + i) = (BYTE)psBuffer->GetAt(i);
        *pcb = cb;
        *psBuffer = psBuffer->Mid(cb);
        return 0;
    }
    
    bool setrtf(CRichEditCtrl &edit, const CString &s)
    {
        EDITSTREAM es;
        edit.SetSel(0, -1);
        edit.Clear();
        memset(&es, 0, sizeof(es));
        es.dwCookie = (DWORD_PTR)&s;
        es.pfnCallback = callback_rtf_settext;
        edit.StreamIn(SF_RTF, es);
        return es.dwError == 0;
    }
    

    usage:

    setrf(m_richedit, L"\\rtf data...");